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