Pull to refresh

Хайв-майнинг: новейший вариант защиты PoW-блокчейна от «атаки 51%»

Reading time9 min
Views5.8K
image

Разработчики форка 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), а их владельцы становятся «пчеловодами». Когда рабочие пчелы успешно добывают блок, вознаграждение за блок (включая комиссионные, заключенные в блоке), выплачивается пчеловоду. Рабочие пчелы требуют очень мало энергии и не нуждаются в специализированном оборудовании для производства блоков. Также срок их жизни ограничен и создание пчелы представляет собой спекулятивное действие с определенной ценой; это предупреждает попытки работать на множестве цепочек одновременно. Успех отдельной пчелы зависит исключительно от популяции пчел, живущих во всей сети. Некоторые пчелы никогда не найдут блок, а другие будут непропорционально удачливы (по аналогии с соло-майнингом).

image

Рис. 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-кошельке. Примерно это выглядит так:

image

Рис. 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-майнингом на одном блокчейне.

В настоящее время работа цепи рассчитывается следующим образом:

image

То есть, работа цепи накапливается как функция сложности в каждом блоке цепи. Разработчики предлагают изменить эту дефиницию следующим образом:

image

Таким образом каждый хайв-майн-блок будет вознагражден в зависимости от количества работы, заключенной в предшествующем 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, Michał WYSZYŃSKI and Federico DE GONZÁLEZ-SOLER. (2018)
Tags:
Hubs:
+6
Comments13

Articles