600 BTC из 2009 года: инженерный разбор пробуждения dormant-адреса
Вводные данные (Контекст)
16 лет — это не просто срок давности. Для Bitcoin это переход от эпохи, когда сложность майнинга была на уровне единиц, а вознаграждение за блок составляло 50 BTC, к текущей сети с полными блоками и комиссиями. Недавно в мемпул попала транзакция, на входе которой были UTXO (неизрасходованные выходы) с coinbase-транзакций 2009 года. Суммарный объём — 600 BTC, что ровно укладывается в 12 вознаграждений за найденные блоки. Адреса не подписывали ни одной транзакции с момента получения средств.
Разбор механики: UTXO как append-only лог
Баланс в Bitcoin — это абстракция. На уровне протокола существуют только UTXO: записи вида (txid, vout, scriptPubKey, amount). Каждая coinbase-транзакция в 2009 году создавала 50 BTC на адрес майнера (scriptPubKey типа P2PKH). Эти выходы имели статус immature до достижения 100 подтверждений, после чего могли быть потрачены. Владелец не тратил их 16 лет, фактически держа ключи в холодном хранилище, даже если это был просто забытый wallet.dat.
Когда монеты перемещаются, создаётся новая транзакция. На входе указываются старые UTXO с подписью, доказывающей владение приватным ключом. Подпись вычисляется по алгоритму ECDSA на кривой secp256k1. Здесь важно, что адреса 2009 года — это P2PKH с публичным ключом в несжатом формате (префикс 0x04). Современные кошельки обычно используют сжатые ключи, но сеть до сих пор принимает подписи от несжатых ключей. Поэтому транзакция валидна, хотя выводы выглядят «старыми».
Почему это произошло: гипотезы и анализ кода
С инженерной точки зрения пробуждение dormant-адреса возможно в нескольких сценариях:
-
Обнаружен резервный носитель (жёсткий диск, флешка, бумажный кошелёк) с приватным ключом в формате WIF (Wallet Import Format). Для несжатого ключа WIF начинается с цифры 5. Импорт в современный Bitcoin Core или Electrum возможен через RPC importprivkey или графический интерфейс.
-
Взлом старого wallet.dat. Если файл был зашифрован слабым паролем с 2009 года, подбор по словарю или брутфорс мог занять годы. Однако 600 BTC — крупная сумма, и маловероятно, что владелец не принял меры.
-
Аппаратный сбой привёл к потере доступа, а специалист по восстановлению данных извлёк ключи из повреждённого накопителя. Это также правдоподобно.
Технически транзакция могла быть подписана офлайн (cold signing) и передана в сеть через любой узел. Протокол не различает «возраст» ключа: если подпись валидна, UTXO можно потратить в любой момент. Это отличается от банковских систем, где счета могут быть заморожены по давности.
Риски и наблюдения для инженера
-
Консолидация 12 coinbase-выходов в одну транзакцию раскрывает связь адресов. Если майнер использовал один и тот же адрес для получения наград, это уже было известно. Если адреса разные, их объединение в один вход — сигнал для кластеризации (анализ «common-input-ownership heuristic»).
-
Использование legacy-адресов (начинаются с 1) повышает размер транзакции по сравнению с SegWit (bech32) из-за больших подписей в scriptSig. Для 600 BTC комиссия не является проблемой, но при консолидации мелких UTXO это было бы ощутимо.
-
Сеть не требует уведомлять кого-либо о перемещении средств. Единственное «подтверждение» — включение транзакции в блок. Это свойство permissionless-системы, которое иногда путают с отсутствием контроля.
Инженерные выводы
Пробуждение dormant-адресов — это стресс-тест для обратной совместимости Bitcoin. Код, написанный в 2009 году, продолжает работать: формат транзакций, правила подписи и скриптов не изменились на уровне консенсуса. Для разработчиков это напоминание о необходимости поддерживать legacy-сценарии. Если вы разворачиваете ноду или сервис, обрабатывающий транзакции, не стоит отбрасывать старые типы скриптов — они всё ещё валидны. А если вы нашли старый wallet.dat, не подключайте его к интернет-машине сразу: сначала сделайте резервную копию, проверьте на вирусы и используйте air-gapped подпись.