Разработчики форка Litecoin Cash представили препринт технического документа 'The Hive: Agent-based Mining in Litecoin Cash', в котором описали свое предложение по защите криптовалютного блокчейна, работающего на базе алгоритма proof-of-work, от «атаки 51%». Их решение сочетает майнинг с использованием устаревающих ASIC-устройств (SHA-256) и демократичный виртуальный майнинг с использованием «рабочих пчел» (HiveMine). В случае грамотной реализации блокчейн LCC решит одну из крупнейших проблем современных блокчейн-проектов (от Bitcoin до Ethereum): угрозу атаки, когда в руках злоумышленника сосредоточено больше половины общей мощности сети.
Проблема «атаки 51%»
Те, кто следит за рынком криптовалют, не мог не отметить недавнюю вспышку атак 51% на относительно небольшие PoW-проекты (proof-of-work — «доказательство выполненной работы), когда злоумышленники переписывали транзакции и максимально быстро выводили средства через биржи. «Относительно» в данном случае означает, что небольшой доли устройств, поддерживающих криптографическую безопасность крупного блокчейна (Bitcoin или Ethereum, например), будет достаточно, чтобы нарушить консенсус небольшого блокчейна, работающего на таком же алгоритме хэширования (Bitcoin Cash или Bitcoin Gold, соответственно).
В случае с криптовалютами, которые берут за основу шифрования алгоритм SHA-256 (LCC или BCH), риск усугубляется тем, что на этом же алгоритме работает самая большая и защищенная криптовалюта мира — Bitcoin (BTC).
В данной статье мы сосредоточим внимание на математической модели защиты от атаки 51% и поверхностно осветим основные сопутствующие термины и понятия, применяемые в криптографии блокчейнов.
Введение в хайв-майнинг
В классической схеме безопасности PoW-блокчейна майнеры конкурируют, вычисляя огромное количество потенциальных хэшей блока, чтобы найти один, удовлетворяющий условиям сложности, заданных консенсусом сети. Если сложность будет равна нулю и любой хэш будет приниматься сетью как валидный, proof-of-work не будет работать и любой узел сети сможет с легкостью майнить блоки.
На первый взгляд это неплохо: майнинг станет демократичным и низкозатратным с точки зрения энергии. Но на практике каждый будет майнить дешевые блоки и проталкивать их в сеть, а значит будет много кандидатов на продолжение цепочки блоков. Поскольку майнеры перестанут понимать, на каком блоке строить продолжение блокчейна, появится много отброшенных цепочек (orphan). Возникнет хаос, который наблюдали PoW-монеты с неадекватным алгоритмом подстройки сложности майнинга.
Если сложность будет нулевой и производство блока не будет нести никаких затрат, никто не сможет определить, какие кандидатские цепочки стоят больше, а значит не будет приоритета. Майнеры также смогут работать на различные цепочки, ничего не теряя.
Этот мысленный эксперимент просто демонстрирует, что основное назначение алгоритма proof-of-work, proof-of-stake или вообще proof-of-что угодно — обеспечить сеть детерминистичным способом определения права на майнинг, чеканку или ковку блока, с которым будут согласны остальные участники. Кроме того, другое важное условие для всех ищущих блок — не работать на множестве цепочек одновременно безнаказанно. В системе proof-of-stake («доказательство доли владения») такой подход наказывается частичным или полным лишением поставленной на кон доли (stake).
Хайв-майнинг — это альтернативная форма борьбы за блок, когда право произвести блок обеспечивается агентом, работающим от лица пользователя. Эти агенты — «рабочие пчелы» — находятся на самом блокчейне. Они абсолютно децентрализованы и создаются, когда пользователь осуществляет специальную транзакцию для создания агента.
После создания рабочие пчелы начинают действовать как виртуальные устройства для майнинга (rig), а их владельцы становятся «пчеловодами». Когда рабочие пчелы успешно добывают блок, вознаграждение за блок (включая комиссионные, заключенные в блоке), выплачивается пчеловоду. Рабочие пчелы требуют очень мало энергии и не нуждаются в специализированном оборудовании для производства блоков. Также срок их жизни ограничен и создание пчелы представляет собой спекулятивное действие с определенной ценой; это предупреждает попытки работать на множестве цепочек одновременно. Успех отдельной пчелы зависит исключительно от популяции пчел, живущих во всей сети. Некоторые пчелы никогда не найдут блок, а другие будут непропорционально удачливы (по аналогии с соло-майнингом).
Рис. 1: рабочая пчела добавляется в блокчейн посредством транзакции создания пчелы (BCT) и майнит блоки в течение срока своего существования
Создание агентов (рабочих пчел)
Для создания рабочей пчелы, пользователь отправляет транзакцию на особенный «мертвый» адрес, например:
CReateLitecoinCashWorkerBeeXYs19YQ
. Отметим, что каждый использует один и тот же адрес для создания пчелы. Этот адрес парсится как существующий и корректный, но ни у кого нет приватного ключа от него; утилита vanitygen определяет, что поиск приватного ключа с использованием 24 * 2 ГГц ядер займет порядка 1,7 * 10^31 лет (с 50-процентным шансом на успех).У транзакции, создающей пчелу, должно быть по меньшей мере два вывода. Первый определяет фиксированную плату за создание пчелы, которая отправляется на недоступный адрес. Хотя цена создания пчелы будет определяться динамически, предполагается, что она будет составлять процент от вознаграждения за блок. Такой расчет включает минимальную стоимость, чтобы к моменту, когда все монеты будут добыты, оставался смысл использовать хайв-майнинг для получения комиссионных за транзакцию.
Второй вывод имеет нулевую стоимость, но уточняет базовый адрес, который получит любое вознаграждение за блок, обнаруженный пчелой в будущем. Можно назвать его «будущим адресом пчеловода». По желанию пользователь сам может его уточнить; по умолчанию будет генерироваться новый адрес каждый раз в его кошельке.
Пример:
"vout": [
{
// Bee creation fee
"addr": "CReateLitecoinCashWorkerBeeXYs19YQ"
"value": 1.0000000
},
{
// Address to receive block rewards for any blocks this bee mines
"addr": "CTrdm8YDfjmFJwFnKbvNZ9NYznhMqrNgFR"
"value": 0.0000000
},
{
// Change address for change from creation fee
"addr": "Cd6CRuWCu6p4NLR6XG7BKyC8hzvEoYuKbn"
"value": 123.5274346
}
]
Пчелы вызревают и становятся способными добывать блоки после того, как с момента создания пчелы в блокчейне появляется 576 блоков. Это ожидаемое число новых блоков, добавляемых в блокчейн Litecoin Cash за 24 часа. После вызревания пчелы существуют 4032 блока (примерно 1 неделю) и ищут блоки, затем умирают.
Создание пчелы происходит в QT-кошельке. Примерно это выглядит так:
Рис. 2: Макет вкладки LCC-кошелька с рабочими пчелами
Пчелы в работе: поиск блока
Для примера допустим, что высота блокчейна = 1000, а сеть должна определить, какой пчеле отведено найти блок 1001. У пчеловода Алисы сейчас 4 пчелы (созданных между 576 и 4608 блоками).
Когда появляется блок 1000, кошелек Алисы рассчитывает два значения.
Первое — детерминистичное значение, которое непредсказуемо, но легко верифицируемо. Это просто сделать, сложив хэши блоков на различных (жестко закодированных) глубинах между, скажем, 0 и 500000 блоком, гарантируя, что наши случайное значение будет хорошо укоренено в блокчейне:
string deterministicRandString =
blocks[blockHeight].hash +
blocks[blockHeight-13].hash +
blocks[blockHeight-173].hash +
blocks[blockHeight-1363].hash +
blocks[blockHeight-27363].hash +
blocks[blockHeight-496393].hash;
Далее, ее кошелек рассчитывает целевой хэш пчелы,
beeTargetHash
. Это значение определяется экспоненциальной скользящей средней с очень высоким динамическим диапазоном, который устанавливает beeTargetHash
так, что для любой заданной популяции пчел определяется частота блоков, добытых в процессе хайв-майнинга. С положительной стороны, чем больше PoW-блоков было добыто с момента последнего хайв-майн-блока, тем выше (проще) beeTargetHash
. Алгоритм задается следующим образом; значения maxTarget
, emaWindowsSize
и emaDesiredSpacing
будут определяться в процессе моделирования.beeHashTarget = previousBeeHashTarget (default to highest (easiest) target maxTarget)
numPowBlocks = number of pow blocks since the previous hive mined block;
emaInterval = emaWindowSize / emaDesiredSpacing;
beeHashTarget *= (interval - 1) * emaDesiredSpacing + numPowBlocks + numPowBlocks;
beeHashTarget /= (interval + 1) * emaDesiredSpacing;
Как
deterministicRandString
, так и beeHashTarget
могут быть рассчитаны любым узлом в сети.Теперь кошелек Алисы пропускает каждую из ее живых пчел через детерминированную случайную цепочку, совмещая BCT-транзакции пчел и хэшируя их для получения нового хэша — beeHash отдельной пчелы. Следовательно, каждая пчела генерирует один хэш на блок. Этот хэш аналогичен лучшему хэшу, генерируемому PoW-майнинг-ригом за тот же период времени.
hash beeHash = sha256(deterministicRandString + bee.creationTransaction.ID);
Поскольку кошелек Алисы отслеживает пчел, каждая из которых рассчитывает
beeHash
, он ведет запись лучших (самых низких) обнаруженных хэшей. Если же, по итогу, лучший хэш, обнаруженный кошельком Алисы, удовлетворяет условие beeHash < beeTargetHash
, Алиса получает право добавить блок.Допустим, у Алисы есть живая пчела, хэш которой ниже целевого, а идентификатор BCT-транзакции успешной пчелы следующий:
0f6953f0a0816483c71ae3df45650a997e678588a315d72e9ae06e6a3f1c1841.
Зная, что у кошелька Алисы есть право подписать блок, сеть производит блок с особой транзакцией с двумя выходами:
"vout": [
{
// Zero-value output identifies the bee and proves it's really minting for Alice
"value": 0,
"n": 0,
"scriptPubKey": {
"asm": "OP_RETURN OP_BEE
0f6953f0a0816483c71ae3df45650a997e678588a315d72e9ae06e6a3f1c1841
IH3Emz49KJeRbw0q4R48pD6GWPQtvHCxLeQOxxH+yv14Tn5KzUFIXBe9Td8EHudejzebMYt/XpusENzNkGM/a4I="
}
},
{
// Block reward (subsidy + fees) - must pay to bee's correct coinbase address
"value": 250.0001125,
"n": 1,
"scriptPubKey": {
"addresses": [
"CTrdm8YDfjmFJwFnKbvNZ9NYznhMqrNgFR"
]
}
}
vout[0]
— это вывод с нулевым значением, который нельзя потратить. Он используется как для идентификации пчелы, которая добыла блок, так и для доказательства, что она добыла его для Алисы. vout[1]
— это вывод, который выплачивает Алисе вознаграждение за блок.Подтверждение блока
Кошелек Боба, получая блок Алисы, теперь должен убедиться, что тот удовлетворяет консенсусу. Сперва он убеждается, что транзакция включает два входа, первый из которых нулевой, и что скрипт начинается с
OP_RETURN OP_BEE
. Затем он извлекает идентификатор транзакции пчелы Алисы:0f6953f0a0816483c71ae3df45650a997e678588a315d72e9ae06e6a3f1c1841.
Отступление: поскольку транзакция создания пчелы переводится на недоступный адрес, в ней остается выход неизрасходованных транзакций (UTXO). Следовательно, кошельку Боба не нужно включать опцию txindex
командной строки (которая полностью индексирует все транзакции за счет замедленной верификации и повышенного использования диска), чтобы легко и просто проверить выходы BCT Алисы. Из-за использования UTXO, QT-кошельку не нужны никакие базы данных или модификации для поддержки хайв-майнинга. Вкладка с пчелами также встраивается динамически.
Осуществляя валидацию хайв-майн-блока, кошелек Боба осуществляет эквивалент RPC (удаленного вызова процедур):
gettxout 0f6953f0a0816483c71ae3df45650a997e678588a315d72e9ae06e6a3f1c1841 0
Это дает ему первый выход BTC,
vout [0]
, и гарантирует, что 1) глубина транзакции лежит в диапазоне срока жизни пчелы; 2) была уплачена комиссия за создание пчелы; 3) она была отправлена на корректный тупиковый адрес.Если проверка пройдена, кошелек Боба производит:
gettxout 0f6953f0a0816483c71ae3df45650a997e678588a315d72e9ae06e6a3f1c1841 1
Получая таким образом второй выход BCT,
vout [1]
, подтверждающий, что 1) значение нулевое; 2) адрес такой же, как и адрес получения перевода монет в блоке (в примере CTrdm8YDfjmFJwFnKbvNZ9NYznhMqrNgFR
).Следующая проверка верифицирует сигнатуру сообщения из последней части
vout [0]
. В сообщении должен быть текущий номер блока, подписанный адресом получения перевода монет, поэтому кошелек Боба производит:verifymessage CTrdm8YDfjmFJwFnKbvNZ9NYznhMqrNgFR
"IH3Emz49KJeRbw0q4R48pD6GWPQtvHCxLeQOxxH+yv14Tn5KzUFIXBe9Td8EHudejzebMYt/XpusENzNkGM/a
4I=" "1001"
Наконец, Боб рассчитывает
deterministicRandString
и beeHashTarget
для текущего блока, затем рассчитывает beeHash
Алисы и проверяет его по beeHashTarget
. Если все проверки пройдены, блок считается валидным и проверенным. Процесс валидации блока быстрый и не требует дорогостоящей проверки исторических блоков.Сопряжение хайв-майнинга и PoW-майнинга
Предполагается, что хайв-майнинг будет не единственный методом обеспечения безопасности сети. Разработчики Litecoin Cash хотят не только сохранить майнинг-сообщество, но и не мешать ему никоим образом. Хайв-майнинг должен быть сопряжен с PoW-майнингом на одном блокчейне.
В настоящее время работа цепи рассчитывается следующим образом:
То есть, работа цепи накапливается как функция сложности в каждом блоке цепи. Разработчики предлагают изменить эту дефиницию следующим образом:
Таким образом каждый хайв-майн-блок будет вознагражден в зависимости от количества работы, заключенной в предшествующем PoW-блоке, причем постоянная
k
определяется экспериментально.Заключение: хайв-майнинг как защита от атаки 51%
По словам главного разработчика Litecoin Cash Иэйна 'Tanner' Крейга, идея HiveMine состоит не только в надежной защите от атаки 51%, но и в демократизации и децентрализации майнинга. В отличие от PoS-блокчейнов, когда «богатые становятся богаче», накапливая свою долю, HiveMine все же требует затрат на создание пчелы, которые могут и не окупиться. Майнинг на основе агентов удовлетворяет три главные задачи команды: существенное усложнение проведения атаки 51%, демократизация майнинга и свобода майнерам на алгоритме SHA-256, который обеспечивает высокую безопасность той же сети Bitcoin. Для успешной атаки злоумышленнику нужно будет завладеть 51% мощности сети, а также 51% популяции пчел в сети, а учитывая процесс создания пчел, это сразу станет очевидно.
По словам того же Крейга, после тестирования и имплементации модели HiveMine в сеть Litecoin Cash, не обеспеченную такой мощностью хэшрейта на SHA-256, как тот же Bitcoin Cash, она, тем не менее, будет и быстрее, и надежнее сети Bitcoin Cash или Bitcoin.
Ссылки:
1. 'The Hive: Agent-based Mining in Litecoin Cash', Iain CRAIG, Sebastian CLARKE, Michal WYSZYNSKI and Federico DE GONZALEZ-SOLER. (2018)
Комментарии (13)
vesper-bot
02.07.2018 18:02Хм, если пчела живет неделю, а стоит 1.0, при этом максимум блоков, которые произведут пчелы за эту неделю, равен числу PoW-блоков за неделю, деленному на emaDesiredSpacing (т.е. плюс-минус константа), то мы имеем этакую лотерею с бесконечным выводом токенов из блокчейна, за награду, которая берется, как я понимаю, «из ниоткуда» (т.е. пчелы имеют свою, независимую базу для добычи токенов, размером с недобытый остаток на момент запуска первой пчелы, деленный на spacing), выдается одному «счастливчику» за ролл (а что если две разные пчелы сгенерируют хэши сложностью ниже beeHashTarget — какую награду получат пчеловоды, полную или разделенную?), а также может вообще никому не достаться. Любопытная схема, в ней, если пчел меньше какого-то конкретного порога, выгодно создать пчелу, потеряв сейчас, но потенциально получить больше, чем потерял.
Однако возникает интересный вопрос — а как определить, что адрес, куда запендюрили комиссию на создание пчелы, таки тупиковый? Кроме того, можно ли на тот же адрес послать ещё комиссию, «оживив» пчелу из предыдущей итерации (предположим, время жизни предыдущей итерации уже истекло)? Если да, то потенциально возможна лазейка, когда кто-то сгенерирует такой ключ, которому будет соответствовать валидный адрес для пчел, и будет эту комиссию возвращать себе на счет (что может быть слишком невероятным, да и особо много не даст, но если заморачиваться, нужно почитать и этот шанс). А также не вижу, как пчелы решают проблему про противодействие 51% майнеров — намайнивший следующий блок в альтветке точно так же просчитает всех активных пчел, кому-то забашляет, если его пчела добыла блок, и преспокойно дальше будет майнить альтветку, тратя бабки в основной, а потом её дропнет как слишком короткую.qw1
02.07.2018 22:13не вижу, как пчелы решают проблему про противодействие 51% майнеров — намайнивший следующий блок в альтветке точно так же просчитает всех активных пчел, кому-то забашляет
Вознаграждение выплачивает не майнер, а пчела сама себе, когда получает возможность создать блок. Чтобы подписать такой блок, нужно знать приватный ключ второго адреса из транзакции создания пчелы, т.е. нужно быть её создателем.
Получается, что владелец 51% мощности должен свои сгенерированные блоки разбавлять «пчелиными». Для этого нужно нагенерить очень много своих пчёл, чтобы они получали вознаграждение вместе с PoW.
Что, во-первых, требует траты средств (которая не окупится, потому что только одна пчела получает вознаграждение, увеличивать число пчёл выгодно только до какого-то предела).
А во-вторых, из-за «периода созревания», потребует выкидывания пчелиных транзакций в публичный блокчейн за какое время заранее, что наведёт всех на мысль, что кто-то готовит атаку 51%. Не получится тихо майнить альт. цепочку, а потом выкинуть её в сеть.
vesper-bot
03.07.2018 09:06То есть майнер, чьи пчелы, должен уметь оперативно отследить создание нового блока в сети, а дальше кто первым проверил своих пчел, тот и папка? Тогда случай, когда две пчелы пролезают под beeHashTarget, порождает сразу две ветки, так как каждая пчела имеет возможность создать новый блок над последним намайненным блоком. Теперь вопрос — как сеть будет решать, какую из двух голов майнить? Они обе фактически равноправны, обе валидны, только бенефициары у них разные. При этом атакующий по 51% в такой ситуации получает возможность сделать виртуальный double spend — создать две разных пчелы, по одной в каждый блок, заплатив за них одну цену (так как одна из двух пчел будет создана, а вторая нет). То есть атаку 51% все равно можно провести, но она растянется на две недели, при этом трафик создания пчел будет нормально замешан в нормальный трафик всех остальных. Реакцией сети в этом случае будет денежная гонка за пчелами, и порешает опять количество этих самых денег. То есть получается, что пчелы решают проблему внезапной атаки 51%, но через добавление PoS-компонента и отсрочки на его применение. Маловато будет!
qw1
03.07.2018 13:07Тут можно предложить 2 решения:
1) Цепочка разделяется и далее выигрывает самая длинная (как и при одновременном нахождении майнерами PoW-блоков)
2) Выбирается более «точная» пчела, т.е. такая, у которой beeHash ближе к beeHashTarget. Тогда коллизий не будет.
Реакцией сети в этом случае будет денежная гонка за пчелами, и порешает опять количество этих самых денег
Нет смысла слишком много вкладывать в пчёл, потому что профит он них будет ниже прибыли. Но как только все перестают вкладываться в пчёл, профит пчелы возрастает. Такая вот саморегуляция.vesper-bot
03.07.2018 13:17Нет смысла слишком много вкладывать в пчёл, потому что профит он них будет ниже прибыли. Но как только все перестают вкладываться в пчёл, профит пчелы возрастает. Такая вот саморегуляция.
Но тогда атака на пчел будет вполне себе незаметной, причем она может предшествовать атаке на 51% мощностей — просто генерируешь пчел чуть больше, чем отобьется при нормальном майнинге, остальные будут выходить из пчел и ты в какой-то период получаешь 51% пчел. Причем эта атака, как мне кажется, куда менее затратная, чем 51% мощности сети.
qw1
03.07.2018 14:03Равновесное состояние — это когда затраты на пчёл равны вознаграждению.
То есть, нужно вложить столько монет, сколько получают все майнеры суммарно за «период созревания».
Появляется необходимость тратить криптовалюту.
У кого-то может случайно оказаться 51% мощности (особенно если прийти на какой-то шиткойн с большой монеты), но не оказаться средств на пчёл.
Darth_Malok
03.07.2018 08:04Так это же классический Proof-of-Burn. Понапридумывали каких-то пчёл, чтобы всех запутать?
Toxygen
03.07.2018 12:01Да, похоже что так.
Интересно, а если в цепочку добавлять такой блок, который уничтожает (пересылает на заведомо недоступный адрес) наибольшее количество монет, какие будут недостатки у такого способа?qw1
03.07.2018 13:08Пересылает из чьего кошелька?
Никто не захочет тратить впустую свои монеты.Toxygen
03.07.2018 14:07Из своего, а так же из комиссий транзакций, которые включаются в блок. Возможно такой вариант позволил бы избежать гонки PoW, и, следовательно, растрат которые из нее вытекают.
Toxygen
03.07.2018 14:13По аналогии с атакой 51% при таком подходе будет возможна атака «перебивания размера уничтоженных монет». Но ведь есть же способы защиты от этого, например, считать транзакцию завершенной только после некоторого количества подтверждений.
simplix