RSK: слитный майнинг Биткойн — это всерьез и надолго!
Автор Серхио Демиан Лернер, главный разработчик RSK
Введение в майнинг Биткойн
Майнинг Биткойн — это процесс в сети Биткойн, который обеспечивает устойчивость к атакам Сибиллы и формирует основу для консенсуса Накамото. Он включает решение сложных в вычислительном отношении задач при выборе допустимого набора транзакций, которые будут внесены в консенсусный реестр. В настоящее время большая часть майнинга Биткойн осуществляется пулами для майнинга. Эти пулы существуют для того, чтобы уменьшить различия в выплатах майнерам, а также для снижения затрат на их обслуживание и выполнение требований к пропускной способности. Пулы для майнинга соответствуют архитектуре клиент-сервер, где майнеры или «работники» (клиенты) подключаются к пул-серверу (серверу). На пул-сервере работает одна из программ майнинга. В число распространенных программ майнинга входят Ckpool, Btcpool и Eloipool.
Пул-сервер обычно связывается с экземпляром программы Биткойнд через канал RPC по нешифрованному протоколу TCP/IP. Канал используется для получения информации о наилучшей в данный момент ветви и хэше родительского блока для блока, который будет создан. Также пул-сервер получает действительный набор предварительно выбранных транзакций. Это выполняется с помощью RPC-команды Биткойнд «getblocktemplate». Пул-сервер выберет подмножество этих транзакций, чтобы включить их в новый блок. Кроме того, пул-сервер обычно опрашивает программу Биткойнд каждые несколько секунд, чтобы обнаружить изменения в родительском блоке. Чтобы уменьшить задержку при обнаружении новых блоков, некоторые варианты пул-серверов подключаются к программе Биткойнд по протоколу p2p или используют параметр командной строки «bitcoind blocknotify», чтобы максимально быстро получать уведомления при поступлении блока. Пул-сервер может использовать одно или несколько стандартных p2p-соединений с сетью Биткойн для отправки вновь созданных блоков, а также связываться с магистралями быстрой передачи блоков, например, FALCON или FIBRE.
Слитный майнинг
Слитный майнинг — это метод использования того же хэшрейта майнинга, который создает первичный блокчейн для защиты вторичного блокчейна. Namecoin был первой криптовалютой, которая слилась с Биткойн. Интеллектуальное слияние выполняется путем встраивания идентификатора блока из вторичного блокчейна (криптографический хэш нового недавно созданного блока) в какое-то место в блоке первичного блокчейна, который в данный момент разрабатывается. Этот вторичный хэш с префиксом какого-то короткого описательного текста или «магических байтов» называется «тегом» слитного майнинга. Префикс позволяет вторичному блокчейну найти этот тег. Однако какой-либо двусмысленности относительно того, где расположен тег, быть не должно: блок из первичного блокчейна должен быть связан только с одним блоком вторичного блокчейна или не должен быть связан ни с одним его блоком вообще. Хотя использование криптографического хэширования предотвращает мошенничество, требования безопасности для связи намного ниже, чем требования, предъявляемые в традиционной криптографии. Неформально, единственное требование безопасности для слитного майнинга состоит в том, что должно быть сложнее создать блок первичного блокчейна, который может быть связан с двумя блоками из одного вторичного блокчейна, чем создать два разных блока первичного блокчейна, по одному для каждой связи, с учетом сложности в работе вторичного блокчейна. Для RSK первичный блокчейн, конечно же, Биткойн, а вторичный — RSK. Сложность при создании блока RSK в настоящее время можно сравнить с 70 битами безопасностью, для сети Биткойн — с 74 битами.
Доказательство выполнения работы (PoW)
При слитном майнинге Биткойн-заголовок служит только для проверки работоспособности. RSK blockchain должен интерпретировать PoW заголовка блока Биткойн и искать в блоке тег, который однозначно устанавливает связь с заголовком блока RSK. Поэтому он транзитивно переводит PoW блока Биткойн в PoW блока RSK. Как упоминалось ранее, сложность RSK blockchain ниже, чем блокчейна Биткойн, поэтому многие заголовки блоков, которые не решают задачу PoW для Биткойна, будут правильными решениями задачи PoW для RSK. Давайте рассмотрим это отличие подробнее. Каждый блокчейн вычисляет ожидаемую сложность операции для каждого блока. Эта сложность определяется всеми предыдущими блоками и нацелена на поддержание примерно постоянного среднего времени между блоками. Таким образом, сложность преобразуется в «цель», которая обратно пропорциональна уровню сложности. Целью является 256-битное целое беззнаковое число.
Блокчейн | Цель |
---|---|
Биткойн | 000000000000000000165exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
RSK | 00000000000000000db5a4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
Namecoin | 00000000000000000019xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
Приблизительные цели для слитного майнинга блокчейна в тот же день. RSK имеет более высокую цель, потому что его блоки в 20 раз чаще
Из-за непредсказуемости криптографического хэш-дайджеста предполагается, что идентификатор заголовка блока, который является хэш-дайджестом содержимого заголовка блока, представляет единую случайную переменную. Хотя это может быть теоретически неверно, на практике это работает, так как практические методы для обращения хэш-функций, используемых в Биткойн (двойной SHA256) или в RSK (Keccak), неизвестны. Когда этот хэш-дайджест интерпретируется как беззнаковое число, он должен быть меньше цели, чтобы блок передавал решение в задачу PoW. Следовательно, чем меньше цель, тем сложнее решить задачу PoW.
Доказательства упрощенного подтверждения платежей (SPV)
Для вторичного блокчейна не требуется полный блок Биткойна для проверки PoW для заголовка Биткойн и связывания его с заголовком RSK. Эту связь можно подтвердить с помощью доказательства упрощенного подтверждения платежей (Simplified Payment Verification — SPV), которое в основном включает доказательство принадлежности к дереву Меркла. На следующей схеме показана связь между разными частями доказательства. Синие прямоугольники показывают информацию в доказательстве SPV, которая должна быть передана вдоль блока RSK.
Доказательство SPV Биткойн позволяет сжимать слитный майнинг доказательств PoW
Иерархия целей
Цель RSK обычно будет выше цели Биткойн, потому что блоки RSK встречаются чаще, чем блоки Биткойн, поэтому задачу RSK легче решить. Поэтому заголовок блока Биткойн, который решает задачу RSK PoW, может не приниматься сетью Биткойн. Обратите внимание, что обе задачи предполагают работу с заголовками Биткойн, и на самом деле их решение включает один и тот же процесс проб и ошибок. Итак, каким образом пул может обнаружить наиболее часто решаемые задачи RSK или узнать о них, в то время как майнеры пытаются решить более сложную задачу в сети Биткойн? Ответ заключается в том, что майнеры уже ищут решения для блоков с гораздо меньшей сложностью, чем того требует Биткойн. Эти промежуточные блоки называются «долями», и они требуются пул-серверу для учета. Фактически, именно программное обеспечение пул-сервера заставит майнеров пытаться решить гораздо более простую задачу (указав гораздо более высокую цель). Вы можете подумать, что доли — это своего рода промежуточные решения, которые помогают решить настоящую задачу Биткойн. Но это не так. Доли нельзя расширить до реального решения для блока. Тем не менее, чем мощнее майнер, тем больше ресурсов он создает для пула между реальными решениями. Таким образом, доли обеспечивают более высокую степень детализации для учета работы майнеров. Общие ресурсы регулярно передаются на пул-сервер, чтобы сервер мог справедливо распределить будущие доходы между всеми вовлеченными сторонами, оценивая объем их участия. Но доли также передаются, потому что одна из них может (случайно) решить текущую задачу PoW Биткойн. Таким образом, майнеры не должны получать реальную сложность (или цель) PoW Bitcoin от пул-сервера, и они обычно не знают, решили ли они задачу для блока Биткойн, пока им об этом не сообщит пул. Пул-сервер проверяет каждый полученный общий ресурс, восстанавливает заголовок блока и, если двойной хэш-дайджест SHA256 заголовка численно ниже цели, связанной с текущей сложностью Биткойн, перенаправляет блок управляющей программе Биткойнд, которая распространяет его по сети. Поскольку разные вторичные блокчейны могут иметь разную сложность, пул-сервер с возможностью слияния должен выполнять эту проверку для каждого вторичного блокчейна, который он обрабатывает. Если заголовок Биткойн представляет собой правильное решение для задачи PoW RSK blockchain, он отправляет заголовок блока Биткойн в RSKj, который добавит соответствующий блок RSK и перенаправит его в сеть RSK как действительный блок.
Обратите внимание, что для RSK у пул-сервера есть возможность передавать в RSKj только подтверждение SPV для тега, встроенного в блок Биткойн (подробнее об этом мы расскажем позже), чтобы уменьшить требования к пропускной способности.
В следующей таблице приведены приблизительные значения сложностей (с точки зрения среднего числа случайных кодов, повторяемых для поиска решения задачи по состоянию на июнь 2019 года) для Биткойн, RSK и долей:
Назначение решения | Интервал между блоками | Среднее число повторов для поиска решения | Предположения |
---|---|---|---|
Биткойн | 10 минут | 274 | 100% хэшрейт Биткойн |
RSK | 30 секунд | 269 | 50% слитный майнинг |
Доля пула для майнинга | 3,3 секунды на клиента | 252 | 20% хэширующая способность, 4000 клиентов Программное обеспечение Ckpool |
Встраивание тега RSK
Тег RSK состоит из идентификатора ASCII «RSKBLOCK:», объединенного с блоком двоичных данных, который включает хэш-код заголовка создаваемого блока RSK. Как указывалось ранее, тег должен быть определен однозначно (создать блок Биткойн, который был бы связан с двумя разными блоками RSK, должно быть невозможно). Хотя для Namecoin определили схему сжатия тегов для различных блокчейнов слитного майнинга, предложенная схема не была стандартизирована. Следовательно, для повышения будущей совместимости и поддержания большей универсальности программ с минимальным пулом тег RSK может быть расположен в любом месте создаваемой транзакции (первой транзакции для блока, которую также иногда называют исходной монетой). Тег RSK может быть расположен в поле исходной монеты для создаваемой транзакции или в любом из выходных пакетов такой транзакции (обычно как полезная нагрузка OP_RETURN). На следующих схемах показаны два варианта.
Тег RSK, хранящийся в поле исходной монеты
Тег RSK, хранящийся в одном выводном пакете транзакции создания.
Текущий формат тегов RSK
Текущий формат тега RSK имеет вид: RSKBLOCK:RskBlockHeaderHash
«RSKBLOCK:» — это строка ASCII, состоящая из байтов: 52 53 4b 42 4c 4f 43 4b 3a.
RskBlockHeaderHash — это хэш-дайджест Keccak заголовка блока RSK в двоичном формате, без полей слитного майнинга, которые заполняются после решения PoW.
Если тег RSK входит в выходной сценарий, он должен быть включен после кодов операций OP_RETURN OP_PUSHDATA1, чтобы предотвратить появление спама в Биткойне UTXO, но это не является обязательным, а выполняется по согласованию.
Используются следующие дополнительные ограничения:
- Количество байт сразу после значения «RskBlockHeaderHash», до окончания исходной монетарной транзакции, должно быть меньше или равно 128.
- Конечные необработанные байты не должны содержать двоичную строку «RSKBLOCK:» (52 53 4b 42 4c 4f 43 4b 3a)
- Если тег RSK находится не в последнем выходном сценарии, существует незначительная вероятность того, что он случайно появится в байтах следующего вывода. Программное обеспечение пул-сервера не должно исключать возможность подставного адреса Биткойн, включенного в транзакцию создания со встроенным тегом, и используемого в качестве атаки, чтобы нарушить правильность заголовка, созданного слитным майнингом. Это может стать проблемой для децентрализованных пулов (таких как p2pool), которые распределяют доходы в рамках самой транзакции создания. Поэтому мы рекомендуем использовать последний выходной скрипт для тега RSK.
- Если тег RSK находится в поле исходной монеты, существует незначительная вероятность того, что «RSKBLOCK:» случайно появится в поле данных ExtraNonce2, содержимое которого предоставляется майнером, решившим задачу блока в рамках протокола Stratum. Также майнер может злонамеренно включить тег в ExtraNonce2. Это не проблема, если пул-сервер добавляет тег RSKBLOCK: после фрагмента ExtraNonce2.
Стандартный вывод P2SH потребляет 34 байта, поэтому ограничение длины следа (максимальное количество байт после тега) обычно означает, что тег должен быть расположен в поле исходной монеты или в последних 4 выходах транзакции.
Ограничение конечных байтов позволяет полному узлу RSK создавать сжатое доказательство SPV, состоящее из следующих элементов:
- Заголовок Биткойн (80 байт)
- Ветка дерева Меркла для исходной монетарной транзакции (приблизительно 320 байт)
- Среднее состояние SHA-256, использующее заголовок исходной монетарной транзакции (32 байта)
- Выровненный по 64 байтам блок, содержащий след исходной монетарной транзакции, включая тег RSK (макс. 169 байт). Использование следа позволяет протоколу использовать доказательство того, что след принадлежит исходной монетарной транзакции, в качестве хэша свободного старта, начиная с заданного среднего состояния.
- В настоящее время максимальный размер доказательства SPV для слитного майнинга составляет 780 байт.
Программное обеспечение пул-сервера может отправить в управляющую программу RSKj полный блок или такое доказательство SPV. Если RSKj получает блок, он анализирует его и извлекает необходимые поля для построения доказательства SPV.
Элемент RskBlockHeaderHash создается стандартным узлом RSK (управляющей программой RSKj). RSKj предоставляет интерфейс RPC-JSON для майнинга, который содержит команду «getwork». Плагин пул-сервера опрашивает управляющую программу RSKj и поддерживает последнее значение RskBlockHeaderHash, которое предоставляется пул-серверу. Если общий хэш достаточно небольшой, поскольку задача RSK PoW решена, пул-сервер уведомляет плагин, который, в свою очередь, уведомляет управляющую программу RSKj.
Улучшения слитного майнинга в предстоящем обновлении сети (Armadillo)
В следующем выпуске 1.0.0 появится сетевое обновление, которое включает формат тегов слитного майнинга. Новый формат определяется параметром RSKIP110. Это изменение добавляет дополнительную информацию к тегам слитного майнинга RSK, чтобы пользователи или автоматизированные системы могли принимать обоснованные решения о состоянии сети. Используя инструменты контроля тегов, узлы сети RSK также могут автономно реагировать на нештатные ситуации таким образом, чтобы защитить узлы от двойного расходования, а в будущем узлы смогут передавать краткие криптографические доказательства аномального состояния другим узлам сети.
32-байтовый хэш заголовка блока заменяется 32-байтовым массивом следующего формата:
- 20 байт — префикс хэширования для слитного майнинга (PREFIX)
- 7 байт — вектор завершение-родитель (CPV)
- 1 байт — количество анкл-блоков в последних 32 блоках (NU) ограничено 255.
- 4 байта — номер блока (BN)
Четыре поля должны проверяться согласованно. Одним словом, поля CPV, NU и BN позволяют любому узлу, отслеживающему блокчейн Биткойн, создавать график параллельных конкурирующих цепочек из блоков RSK, даже если они не транслируются в сеть RSK. Хэш заголовка RSK усекается до 20 байт, таким образом тег занимает 32 байта, что обеспечивает совместимость с программным обеспечением пул-сервера.
Безопасность слитного майнинга RSK
Теория консенсуса Накамото с использованием доказательства выполнения работы основана на термодинамической и теоретической безопасности системы, а не на криптографической безопасности. Слитный майнинг RSK защищен от любого неразумного злоумышленника, который может выполнить 2^80 операций хэширования менее чем за 30 секунд. Разумный злоумышленник предпочел бы вести себя честно и провести слитный майнинг блока RSK, на который требуется всего около 2^69 операций (текущая сложность для блока RSK), и действовать полностью в рамках субсидий сети Биткойн, а не проводить атаки. Если исключить возможность удаленного объединения этой атаки с другими системами слитного майнинга, неразумному злоумышленнику, который пытается выполнить 2^80 операций хэширования, потребуется в 2000 раз больше оборудования, чем разумному майнеру, при этом потребление электроэнергии для него не субсидируется. Инвестиции для этого должны составлять около пяти триллионов долларов (5e12), если используется оборудование, подобное современным ASIC Биткойн. Но для неразумного злоумышленника дела обстоят еще хуже, так как он может создать только один или несколько блоков, которые имеют доказательство выполнения работы для той же высоты блока RSK, и мы увидим позже, что это, как правило, не дает атакующему мошеннику какого-либо денежного выигрыша (1). Но это ему будет стоить пять триллионов долларов. Таким образом, можно сделать вывод, что 80-битная защита хорошо сбалансирована для всех компонентов, а менее защищенный компонент, который мог бы стать целью атаки, отсутствует. Чтобы оправдать это, мы кратко и неформально рассмотрим возможные цели для атаки.
Во-первых, RSK сжимает транзакцию создания с помощью нестандартной криптографической операции. Вместо передачи полной генерации транзакции, он передает только след. Чтобы по-прежнему иметь возможность создавать правильный криптографический хэш сообщения, он начинает хэширование из среднего состояния конструкции Меркла-Дамгарда вместо исходного состояния. И такое 64-байтовое среднее состояние передается по следу. Безопасное использование этой операции требует использования более сильного свойства SHA256, известного как сопротивление «свободному столкновению», и нам нужно, чтобы оно было как минимум таким же безопасным, как и 80-битный прямой перебор значений, который является нашим целевым порогом безопасности. SHA-1 (уже сломанная хэш-функция) имеет наиболее известную атаку с произвольным запуском, которая требует грубого взлома на уровне около 80 бит. В SHA256 свободные конфликты не были обнаружены, а наилучший результат (2) соответствует обнаружению полусвободного конфликта в версии SHA256 с уменьшенным количеством циклов (38 из 64 циклов при стоимости на уровне 2^65 операций). Таким образом, мы можем сделать вывод, что слитный майнинг RSK безопасен. Следует отметить, что предполагаемая атака с произвольным запуском на SHA256, требующая 2^80 операций, будет разрушительной для SHA256 и сделает ее бесполезной в качестве стандартной хэш-функции, хотя это в любом случае затронет Биткойн. Но если такая атака будет обнаружена, платформу RSK можно будет легко защитить с помощью модернизации сети, отказавшись от использования этого криптографического приема для сжатия SPV за счет небольшого увеличения размера блока. Однако, как мы заявляли ранее, даже если атака будет стоить меньше, чем слитный майнинг с точки зрения бит-защиты, она не будет рентабельной.
Во-вторых, что касается уменьшения хэш-дайджеста в предстоящем выпуске 1.0.0, новая схема обеспечивает эквивалент 80-битной защиты для конфликта тегов. Поэтому атака становится нерациональной как теоретически, так и с точки зрения экономической и вычислительной выгоды. Относительно сложности вычислений 80-битная атака прямым столкновением потребует нереального объема памяти (3). Кроме того, стоимость процессора для прямой атаки на столкновение более чем в 2000 раз превышает стоимость решения задачи RSK PoW (69 против 80 бит).
С теоретической точки зрения и благодаря используемому в RSK консенсусу DECOR+, поскольку конфликт может происходить только при той же высоте блока RSK, конфликтующие блоки будут разделять награду за блок, поэтому нет смысла находить новые копии прошлых блоков, если награда за прошлый блок приблизительно равна награде за новый блок. В основном, атакующий будет соревноваться сам с собой. По той же причине нет смысла находить коллизии с добавленной сложностью для новых блоков, поскольку это необходимо сделать в среднем в течение 30 секунд, а не 5 минут, доступных для анкл-блоков.
С экономической точки зрения честный майнер получает комиссионные, так что слитный майнинг субсидируется сетью Биткойн, в то время как злоумышленник должен оплатить полную стоимость прямой атаки на столкновение. Это делает практически любую атаку на PoW неэффективной с точки зрения затрат. Это справедливо как для столкновений хэш-дайджеста в хэше блока RSK, так и для свободного старта в хэше исходной монетарной транзакции.
Поэтому мы считаем, что данный тег будет безопасным в течение следующих 20 лет, даже с учетом прорыва в эффективности вычислений. Однако, если компьютерные тенденции радикально изменятся, в будущих обновлениях можно легко расширить размер хэша до полных 32 байт.
Разработка модуля для слитного майнинга RSK
На следующем рисунке показана стандартная архитектура пул-сервера, включая модуль для слитного майнинга RSK:
Пул-сервер с модулем для слитного майнинга RSK, который подключается к различным сетям
Модуль пул-сервера RSK связывается с управляющей программой RSKj с помощью двух способов JSON-RPC: mnr_getwork и mnr_submitBitcoinBlock. Другие способы позволяют отправлять меньше информации на узел RSKj, чтобы уменьшить потребность в пропускной способности. Для управляющей программы RSKj можно настроить порт соединения JSON-RPC, значение по умолчанию в нем 4242. Описание методов и формата обмена данными можно найти на странице https://github.com/rsksmart/rskj/wiki/JSON-RPC-API. Эти методы реализованы вместе со многими другими методами для интерфейса Web3, который является стандартным интерфейсом для подключения к узлу RSKj.
Команда RSK разработала несколько полностью работающих плагинов для нескольких вариантов пула, например, CoiniumServ, Ckpool, Btcpool и Eloipool. Другие пулы реализовали свои собственные плагины. Мы рекомендуем использовать программу Ckpool, так как она оптимизирована, и мы убедились, что такой слитный майнинг не влияет на производительность майнинга Биткойн.
В ближайшее время мы разместим руководство по разработке подключаемых плагинов для слитного майнинга с дополнительными рекомендациями, чтобы помочь пулам создавать эффективные и надежные модули.
Важно отметить, что поскольку RSK использует протокол DECOR+, программное обеспечение для пул-сервера может и дальше обрабатывать все решения RSK PoW, найденные клиентами пула, даже если родительский блок RSK изменится. За все конкурирующие блоки (или анкл-блоки) начисляется вознаграждение.
Краткие выводы
В настоящее время от 40% до 51% майнеров Биткойн занимаются слитным майнингом RSK, что делает RSK самой защищенной платформой смарт-контрактов в мире с точки зрения «термодинамической» безопасности (4). Заниматься слитным майнингом RSK достаточно легко, но необходимо соблюдать осторожность, чтобы не изменить нормальное функционирование программного обеспечения пул-сервера даже в самых сложных условиях, например, при прямой атаке на сеть RSK. Компания RSK Labs разработала несколько подключаемых плагинов, которые были тщательно проверены на различные условия отказа, чтобы убедиться в правильности слитного майнинга. Кроме того, были предприняты определенные действия для повышения эффективности программного обеспечения для майнинга, чтобы подтвердить, что его эффективность не изменилась. Мы призываем всех майнеров, как одиночек, так и объединенных в пулы, заняться слитным майнингом RSK и принять участие в революции смарт-контрактов. Если вам нужна помощь в настройке слитного майнинга, свяжитесь с нами на форуме сообщества RSK gitter.
(1) Еще один интересный вид атаки — это использование конфликта тегов для создания блоков для нескольких параллельных конкурирующих цепочек с одинаковой сложностью, при этом майнерам предлагается другая «лучшая цепочка», чтобы они не работали в той же лучшей цепочке. Для этого нужны прямые одноранговые соединения с другими майнерами. Это может сработать, если хэш возможности атакующего меньше, чем у оставшихся майнеров всех вместе взятых, но гораздо больше, чем у каждого из них по-отдельности. Тем не менее, эта атака будет намного дороже, чем обычная атака 51%, поскольку придется игнорировать блоки других майнеров.
(2) https://eprint.iacr.org/2015/350.pdf
(3) Объем оперативной памяти, необходимой для прямой атаки на столкновение, составляет 2^80 хэш-дайджестов (32 миллиона экзабайт). Используя алгоритм Ооршота-Вейнера и предполагая, что один процессор может выполнить 2^40 последовательных операций хэширования менее, чем за 30 секунд, требования к оперативной памяти можно сократить до 32 терабайт.
(4) После подтверждения транзакции в блоке ее нельзя отменить без того, чтобы кто-то затратил минимально необходимое количество энергии для перезаписи блокчейна. Этот уровень энергии называют «термодинамической» безопасностью блокчейна на основе PoW.