netstalking
October 24

Netstalking. Музей Биткоина в одной транзакции

Самая красивая Биткоин-транзакция

О чём статья?

О том, как Vojtěch Strnad (Во́йтех Стрнад) превратил перевод нескольких тысяч сатоши в техническую энциклопедию, исторический архив и криптографическую головоломку.

Дело в том, что в блокчейне Биткоина есть транзакция, которую интереснее читать, чем оценивать в деньгах. Её суммы напоминают о золотом стандарте и ошибках протокола, поля последовательности превращаются в календарь, а внутри Taproot-доказательства обнаруживается коллекция исторических переводов. Даже идентификатор здесь выбран не случайно.

Это транзакция b10c0000004da5a9d1d9b4ae32e09f0b3e62d21a5cce5428d4ad714fb444eb5d. Её можно воспринимать как музей: каждый элемент выполняет техническую функцию и одновременно отсылает к истории системы.

Здесь нет секретного шифра, для которого требуется пароль. Значительная часть пасхалок записана открыто - в числах, ключах, скриптах и хешах. Чтобы увидеть их, нужно знать, куда смотреть и с чем сравнивать.

От теста обозревателей до технического искусства

Автор проекта - Vojtěch Strnad (Во́йтех Стрнад), известный как vostrnad. 7 июля 2024 года он опубликовал объяснение и подписанное сообщение об авторстве.

По его рассказу, работа заняла больше года: первоначально он хотел собрать разные типы входов и выходов для сравнения возможностей обозревателей блокчейна.

Постепенно задача обросла историческими и техническими отсылками. Основной код написан на TypeScript с BitcoinJS; вычислительно тяжёлые части переносились на Rust.

Это происхождение многое объясняет. Обычный интерфейс кошелька скрывает внутреннее устройство платежа: пользователь видит адрес, сумму и комиссию. Для подобного проекта нужно, наоборот, раскрыть все слои - от структуры выхода до отдельных байтов подписи.

Первый экспонат: имя в хеше

Начало TXID - b10c000000… - выглядит как подпись разработчика 0xB10C. В действительности это посвящение ему. У транзакции также подобран WTXID, начинающийся с 0000000001d54…, что визуально напоминает хеш блока. По словам Strnad, подбор идентификаторов потребовал больше месяца (!) вычислений на его CPU.

Автор подобрал не только TXID, но и второй идентификатор транзакции - WTXID, учитывающий данные свидетельств (witness), включая подписи. Его запись начинается с 0000000001d54….

Множество начальных нулей визуально напоминает хеш добытого блока Биткоина: майнеры ищут хеш ниже установленного порога, поэтому в привычной шестнадцатеричной записи такие хеши начинаются с нулей. Здесь похожий рисунок получен намеренным перебором вариантов транзакции.

Это эстетическая отсылка к майнингу: сама транзакция блоком не становится.

TXID и WTXID - разные идентификаторы. После SegWit данные witness учитываются отдельно: TXID вычисляется без них, WTXID - с ними. Поэтому изменение witness может менять WTXID, сохраняя TXID. Это следует из конструкции SegWit, описанной в BIP-141.

Нельзя просто написать желаемый идентификатор в поле транзакции: хеш вычисляется из её содержимого. Автор перебирал варианты подписей и проверял результат. В опубликованном коде действительно есть цикл поиска TXID с нужным префиксом. Это вычислительная работа над корректными вариантами данных, а не взлом SHA-256.

Она означает: продолжать перебор, пока TXID не начнётся с b10c000000. Байты проверяются с конца, поскольку привычная запись TXID использует обратный порядок байтов относительно полученного хеша.

Время как материал для пасхалок

Транзакция попала в круглый блок 850 000. Её nLockTime равен 1231006505 - Unix-времени Genesis Block: 3 января 2009 года, 18:15:05 UTC.

Обычно nLockTime задаёт нижнюю временную или высотную границу включения транзакции при соответствующих значениях sequence. Здесь граница давно осталась в прошлом и работает как историческая подпись. Она не означает, что сама транзакция существовала в 2009 году.

В полях nSequence автор собрал ещё один набор отсылок в формате: "Значение- Что узнаёт читатель?":

  • 20090103 - Дата Genesis Block
  • 20081031 - Публикация white paper
  • 19750504 - Дата рождения, указанная в профиле Сатоши; не подтверждённая биографическая дата
  • 16 - BIP-16, P2SH
  • 141 - BIP-141, SegWit
  • 0xDEADBEEF - Известная программистская константа
  • 21000000 - Узнаваемая отсылка к пределу эмиссии
  • 0xF9BEB4D9 - Обозначение magic bytes основной сети Биткоина
  • 341 - BIP-341, Taproot
  • 342 - BIP-342, Tapscript

Для разбора можете использовать: https://mempool.space/api/tx/b10c0000004da5a9d1d9b4ae32e09f0b3e62d21a5cce5428d4ad714fb444eb5d.

Значения видны непосредственно в параметрах генератора. При ручном чтении нужно различать десятичное представление, шестнадцатеричную запись и порядок байтов: одно и то же поле разные инструменты могут показывать по-разному.

Деньги, которые нужно читать как числа

Десять входов имеют суммы, рассчитанные на узнавание. Единица измерения здесь - сатоши, а не BTC. Формат такой: "Сумма входа, сат - Отсылка":

  • 6102 - Executive Order 6102 - американский указ 1933 года об ограничениях на владение монетарным золотом
  • 1913 - Год создания Федеральной резервной системы
  • 1971 - Прекращение конвертации доллара в золото для иностранных официальных держателей
  • 2140 - Ожидаемый ориентир прекращения субсидии за блок
  • 5139 - CVE-2010-5139, ошибка переполнения стоимости
  • 3220 - CVE-2013-3220, раскол цепи в марте 2013 года
  • 17144 - CVE-2018-17144, инфляционная уязвимость
  • 8149 - Номер Bitcoin Core PR с реализацией SegWit
  • 9001 - Мем "It's over 9000!"
  • 19953 - Номер Bitcoin Core PR с реализацией Taproot
Числа заданы в исходном коде и их историческая расшифровка приведена автором.

Такая композиция соединяет два масштаба истории. С одной стороны - денежные институты, золото и эмиссия. С другой - конкретные ошибки и обновления программного обеспечения. Биткоин представлен одновременно как денежная идея и как работающая система, которую люди исправляют и развивают.

Одна транзакция - несколько поколений скриптов

Входы и выходы позволяют увидеть эволюцию способов владения монетами. В генераторе соседствуют P2PK, P2PKH, bare multisig, P2SH, варианты SegWit и Taproot.

Разница между ними существенна.

P2PK связывает расходование с открытым ключом. P2PKH использует его хеш. P2SH позволяет сначала зафиксировать хеш скрипта, а сам скрипт раскрыть при расходовании. SegWit вводит отдельную структуру свидетельств. Taproot позволяет потратить выход по ключу либо раскрыть конкретный сценарий расходования.

Поэтому слово "адрес" недостаточно для описания происходящего. Адрес - удобное представление условий получения средств, но сами правила задаются скриптами и правилами их проверки.

У multisig-входов также разная архитектура: 2 из 3, 3 из 5 и 5 из 7. В последнем случае Tapscript использует OP_CHECKSIGADD: результаты проверок подписей складываются и сравниваются с требуемым числом. Это видно в функции построения скрипта.

Исторические ключи без исторических приватных ключей

В multisig-конструкциях присутствуют открытые ключи Genesis Block, блока №9 и ключ Хэла Финни из первого перевода от Сатоши. В Taproot-сценарии добавлены два ключа из ранней script-path транзакции, а внутренний ключ задан байтовой строкой SHA-256 white paper.

Это не означает, что автор получил доступ к кошелькам Сатоши или Финни. Например, схема "2 из 3" может содержать два ключа автора и один исторический ключ. Для расходования достаточно подписей первых двух. Третий служит частью конструкции и экспонатом.

Именно здесь особенно хорошо видна разница между публичными данными и правом распоряжаться средствами. Открытый ключ можно скопировать в новый скрипт. Возможность создать подпись под ним от этого не появляется.

Lightning внутри ончейн-композиции

В коде есть скрипты с характерными для Lightning ветвлениями: проверками хеша, мультиподписями и сценарием отзыва состояния. Один из них содержит альтернативную ветвь с OP_CHECKSEQUENCEVERIFY и задержкой 42, а расходование выбирает другую, отзывную ветвь.

Такие конструкции помогают понять связь Lightning с базовым блокчейном. Обновления канала происходят вне цепи, но окончательное разрешение спора опирается на ончейн-условия. Разные ветви скрипта позволяют участникам действовать в разных обстоятельствах.

Наличие подобного скрипта в художественном проекте само по себе не доказывает, что перед нами закрытие реального пользовательского канала. Здесь важна демонстрация механизма. В HTLC-конструкцию автор также поместил хеш, связанный с адресом участника инцидента переполнения 2010 года.

Выходы на границе "пыли"

Суммы выходов демонстрируют dust thresholds для выбранных конструкций и политики, на которую ориентировался проект: формата "Выход - Сумма, сат.".

  • P2PK со сжатым ключом - 576
  • P2PKH - 546
  • Bare multisig 1 из 1, сжатый ключ - 582
  • P2SH - 540
  • P2WPKH - 294
  • P2WSH - 330
  • P2TR - 330
  • SegWit v1 с двухбайтовой программой - 240
  • OP_RETURN - 0

Все эти суммы заданы в генераторе.

Dust - категория политики обработки транзакций, связанная с экономикой будущего расходования выхода. Её нельзя воспринимать как единый вечный запрет консенсуса на маленькие суммы. Условия ретрансляции, принятия в mempool и допустимость блока - разные уровни правил.

Особенно необычен выход 51024e73: версия witness - 1, длина программы - два байта. Его нельзя называть обычным Taproot-выходом: BIP-341 определяет Taproot для версии 1 с 32-байтовой программой. Короткий выход демонстрирует отдельный случай структуры SegWit.

Подписи как пространство для эксперимента

Автор подбирал подписи разной длины и использовал разные режимы SIGHASH. В коде можно увидеть ALL, NONE, SINGLE, комбинации с ANYONECANPAY и Taproot-режим DEFAULT.

Подпись в Биткоине подтверждает определённое сообщение, сформированное из данных транзакции. Флаг SIGHASH влияет на то, какие её части входят в это сообщение. Поэтому разные режимы позволяют выразить разные обязательства подписанта.

Например, подпись может фиксировать все выходы, не фиксировать их либо связываться с одним выходом. ANYONECANPAY меняет охват входов. Это не отменяет остальных проверок транзакции: режим подписи задаёт границы конкретной авторизации.

ECDSA-подписи имеют переменную длину DER-представления. Генератор многократно ищет варианты с заданными размерами; это называется grinding. Для самых необычных результатов используются специальные приёмы работы с параметрами подписи.

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

OP_RETURN: сообщение и семнадцать маленьких чисел

Текстовый выход содержит фразу "Not your inputs, not your outputs" - вариацию известного лозунга о контроле над ключами. После неё следуют операции помещения чисел от 0 до 16 в стек.

Здесь показана последовательность малых чисел и способы их представления в Script. Это техническая демонстрация, которую легко пропустить, если обозреватель показывает только читаемый текст.

Главный зал: 21 историческая транзакция

Самая выразительная часть проекта находится в Taproot script-path входе. Для подтверждения принадлежности исполняемого скрипта выходу раскрывается control block с путём Меркла. В этом проекте путь содержит 21 элемент, а значения взяты из идентификаторов исторических транзакций. Список famousTxids и его включение в control block доступны в коде.

Сами правила Taproot требуют корректного вычисления обязательства по раскрытому пути. Они не требуют, чтобы каждый соседний 32-байтовый элемент сопровождался раскрытием содержимого соответствующего поддерева. Это и оставляет место для художественного выбора значений.

Тонкость принципиальна: эти элементы не доказывают включение перечисленных транзакций в блоки и не переносят их средства. Они участвуют в новой Taproot-конструкции как байтовые значения. Их историческое происхождение — дополнительный смысл, который считывает человек.

Ниже — весь каталог. Ссылки позволяют перейти к конкретным транзакциям; определения рекордов относятся к историческому описанию проекта, а не к проверке рекордов на сегодняшний день.

Формат: "№ - Дата - Экспонат - Транзакция:

  • 1 - 2009-01-03 - Coinbase Genesis Block - 4a5e1e4baa…
  • 2 - 2009-01-12 - Перевод Сатоши Хэлу Финни - f4184fc596…
  • 3 - 2009-01-16 - Ранняя транзакция с выходом P2PKH, обозначенная автором как первая - 6f7cf9580f…
  • 4 - 2010-05-22 - Пицца Ласло Хейница за 10 000 BTC - a1075db55d…
  • 5 - 2010-11-14 - Первый из двух известных случаев дублирования TXID coinbase - d5d27987d2…
  • 6 - 2010-11-15 - Второй случай дублирования TXID coinbase; оба случая предшествуют BIP-30 - e3bf3d07d4…
  • 7 - 2011-11-16 - Перевод 550 000 BTC — исторический рекорд в каталоге автора - 29a3efd3ef…
  • 8 - 2013-04-06 - Транзакция, содержащая white paper - 54e48e5f5c…
  • 9 - 2013-11-05 - Rickroll в блокчейне - d29c9c0e8e…
  • 10 - 2015-07-07 - Тяжёлая для проверки мегатранзакция F2Pool - bb41a757f4…
  • 11 - 2015-07-11 - Эксперимент F2Pool и Greg Maxwell с SIGHASH_SINGLE и короткими подписями - 9fdbcf0ef9…
  • 12 - 2016-04-26 - Комиссия около 291 BTC - cc455ae816…
  • 13 - 2017-02-23 - Получение награды за коллизию SHA-1 - 8d31992805…
  • 14 - 2017-08-24 - Первое расходование SegWit в каталоге автора 8f907925d2…
  • 15 - 2021-07-23 - Эксперимент 0xB10C с P2TR до активации Taproot - b10c007c60…
  • 16 - 2021-11-14 - Первое расходование Taproot в каталоге автора - 33e794d097…
  • 17 - 2021-11-14 - Первое расходование Taproot через script path в каталоге автора - 37777defed…
  • 18 - 2021-12-07 - Пожертвование 1 BTC Luke Dashjr со сдачей 8 999 BTC - fd45652410…
  • 19 - 2022-10-09 - Multisig Burak 998 из 999, вызвавший сбой LND - 7393096d97…
  • 20 - 2022-11-01 - Вторая транзакция Burak, вызвавшая сбой LND - 73be398c4b…
  • 21 - 2023-11-23 - Комиссия около 86 BTC; в описании 2024 года — около $3,13 млн - b5a2af5845…

Так возникает архив указателей: вместо копирования больших объёмов истории автор использует уже существующие идентификаторы. Читатель может пройти от них к самим событиям. Транзакция одновременно становится экспонатом и навигацией по другим экспонатам.

Сколько стоила эта композиция?

Сумма десяти входов в опубликованных параметрах - 74 732 сатоши. Девять выходов получают 3 438 сатоши. Разница составляет 71 294 сатоши, или 0,00071294 BTC: это комиссия самой итоговой транзакции, вычисленная по параметрам генератора.

Это не полная стоимость проекта.

Расходы на предварительное создание нужных UTXO, вычислительный подбор и время разработки сюда не входят. Маленький денежный масштаб итоговых выходов поэтому плохо передаёт трудоёмкость работы.

В нашем прежнем обсуждении возникала идея трактовать комиссию через арифметическое совпадение 71 + 294 = 365. Подтверждения авторского замысла для такой интерпретации нет. В каталог установленных пасхалок её включать не следует.

Как читать её самостоятельно?

Исходник: github.com/vostrnad/bitcoin-easter-egg-tx/blob/master/src/script.ts.

Начать удобнее со страницы транзакции в mempool.space. Затем раскрыть подробности входов и выходов и сопоставить суммы с таблицами выше. Для дат и номеров BIP понадобятся поля sequence; для текста и малых чисел - декодированный OP_RETURN; для главного исторического архива - witness Taproot-входа и его control block.

Следующий уровень - сравнение с исходным кодом. В src/params.ts находятся суммы, sequence, ключи и список исторических TXID. В src/script.ts - конструкции скриптов. В src/inputs.ts - формирование данных расходования, включая control block. В src/index.ts - сборка и подбор подписей.

Репозиторий не содержит абсолютно всех частей первоначального процесса: автор отдельно отмечает отсутствие кода предварительного вычисления некоторых nonce и подбора WTXID. Это ограничение воспроизводимости генерации, а не препятствие для чтения уже опубликованной транзакции.

Что делает её особенной?

Здесь сама структура платежа превращена в язык. Сумма становится исторической ссылкой, ключ - портретом участника событий, подпись - демонстрацией криптографического механизма, путь Меркла - оглавлением архива.

Поэтому эту транзакцию интересно изучать и человеку, который давно пользуется Биткоином. Она заставляет снова посмотреть на привычные слова - адрес, подпись, перевод - и увидеть за ними конкретные условия, форматы и инженерные решения.

Несколько тысяч сатоши распределены по выходам. Гораздо больше смыслов распределено по байтам.

Источники и границы проверки

1. Vojtěch Strnad. Definitive - of my weird Bitcoin transaction, 7 июля 2024 - объяснение замысла, авторства и исторических отсылок. Подписанное сообщение опубликовано автором; в рамках подготовки статьи его подпись отдельно не проверялась.

2. Исходный код bitcoin-easter-egg-tx - параметры и устройство генератора; для статьи прочитаны файлы params.ts, script.ts, inputs.ts, outputs.ts, index.ts. Код не запускался для повторного создания транзакции. Расчёт комиссии выполнен по опубликованным суммам.

3. BIP-141: Segregated Witness - структура witness и различие TXID/WTXID.

4. BIP-341: Taproot - key path, script path и правила проверки control block.

5. Транзакция в mempool.space - точка входа для самостоятельной проверки ончейн-данных. Во время подготовки статьи веб-доступ к странице был ограничен; описания сверялись с оригинальным объяснением и опубликованным кодом.

6. Доп. ссылки см. на канале: https://t.me/web3news/8197

Видео-разбор и доп. фичи

Видео по разбору транзакции

До!