
Когда цепь переписывает себя: ошибка консенсуса Ravencoin и чего на самом деле стоит подтверждение
Почти все криптоинциденты — про ключи. Кто-то выманил сид-фразу, у контракта нашлась уязвимость повторного входа, биржа потеряла горячий кошелёк. Реестр остаётся честным; просто конкретный набор монет переходит из рук в руки против воли владельца.
Августовский инцидент Ravencoin относится к другой и куда более редкой категории. Ничьих ключей никто не касался. Развалился сам реестр.
Что произошло
7 августа 2026 года в 15:44 UTC, на высоте блока 4 487 776, сеть приняла блок, которого не должно было существовать. Потом появились ещё. На исследованном отрезке в 2089 блоков 96 оказались недействительными. Уязвимость публично продемонстрировали 11 августа — через четыре дня после первого использованного блока, а значит, цепь тихо производила поддельные блоки почти неделю, прежде чем об этом объявили.
RVN упал примерно на 20%, до 0,0027 доллара. Upbit и Bitget приостановили ввод и вывод. Проект Ravencoin призвал биржи, обозреватели и операторов узлов немедленно обновиться и пометил каждую транзакцию, подтверждённую после блока 4 487 775, как потенциально обратимую.
Именно на последней фразе стоит задержаться. Не «некоторые транзакции откатили». Все транзакции в течение трёх дней были предварительными.
Ошибка: число, которое никто не проверял
Ravencoin майнится алгоритмом KAWPOW — требовательным к памяти доказательством работы, производным от ProgPoW. Требовательность к памяти и есть весь смысл: работа зависит от большого набора данных, который приходится держать в оперативной памяти, и именно это делает ASIC невыгодными и оставляет майнинг доступным видеокартам. Этот набор данных периодически пересоздаётся, а какой именно вам нужен — выводится из высоты блока.
В заголовке блока есть поле nHeight, объявляющее, где в цепи находится блок. Узлы проверяли доказательство работы против той высоты, которую блок себе приписывал. И ни разу не сверяли это утверждение с реальным положением блока в цепи.
То есть можно было соврать. Объявляете высоту из ранней жизни цепи, получаете маленький набор данных, делаете долю работы — и производите блок, который уязвимый узел с радостью примет за действительный. Требовательность к памяти, делающая майнинг Ravencoin дорогим, становилась необязательной, стоило просто заявить, что вы майните не тот блок, который майните на самом деле. Недействительные блоки стали, по формулировке самого проекта, драматически дешевле в производстве, чем законные.
Более фундаментальной ошибки консенсуса почти не бывает. Доказательство работы — это механизм, которым блокчейн превращает электричество в окончательность. Если доказательство можно подделать дёшево, окончательности нет, есть только её видимость.
Лекарством стала реорганизация
Вот та часть, которая снаружи выглядит тревожно, а на деле верна.
2Miners и RavenMiner, вместе держащие большинство хешрейта сети, объявили, что майнят цепь, исключающую скомпрометированную ветку начиная с 4 487 776. Исправленное ПО узла (2Miners выпустили 4.6.1.1-hf1) отвергает блоки, у которых объявленная высота не совпадает с настоящей, и жёстко фиксирует блок 4 487 775 как контрольную точку — черту, за которой старая отравленная история уже не может быть принята обратно.
Результатом стала реорганизация цепи глубиной около трёх суток. Три дня блоков были отброшены и заменены.
Глубокая реорганизация обычно симптом атаки. Здесь она была лекарством. Скомпрометированная ветка не была законной историей, которую кто-то переписал; она уже была недействительной, и сеть решила перестать делать вид, что это не так.
Шов и сегодня виден в цепи. Блок 4 487 775 был намайнен 7 августа в 15:43:57 UTC. Блок 4 487 776 — честный, из восстановленной цепи — помечен 14:09:42 UTC 10 августа. Двое суток, двадцать два часа и двадцать шесть минут между соседними блоками в цепи, которая целится в одну минуту. Этот разрыв и есть рубцовая ткань.
Что это значило, если вы держали RVN
Если ваши монеты лежали в кошельке, который вы контролируете, и вы не проводили транзакций в те дни, с вами ничего не случилось. Ключи никогда не были проблемой. Балансы до блока 4 487 775 ни разу не ставились под сомнение.
Если вы всё же транзакционировали в это окно, вашей транзакции нужно было заново попасть в блок восстановленной цепи, чтобы выжить. Обычные платежи, как правило, справились: это были действительные транзакции, просто жившие в отброшенных блоках, и они вернулись в мемпул, чтобы подтвердиться снова. Реорганизацию не переживает всё то, что опиралось на постоянство отброшенной истории. Классический случай — депозит на бирже: монеты приходят, зачисляются, торгуются или выводятся, а потом депозит перестаёт существовать. Именно поэтому приостановка ввода и вывода была правильным решением, и поэтому биржи, сделавшие это быстро, защищали себя и своих пользователей, а не паниковали. Остановка — это сценарий отказа, который биржи могут и должны поглощать, когда альтернатива — зачислять деньги, которые потом испарятся.
Что подтверждение обещает на самом деле
Большинство кошельков, наш в том числе, показывают число подтверждений и позволяют вывести из него ощущение безопасности. Стоит быть точным в том, что это число значит, потому что именно в таких инцидентах неточность кусается.
Подтверждение — не гарантия. Это экономическое утверждение: переписать историю с этой точки потребовало бы повторить столько-то работы, и это обошлось бы дороже, чем стоит платёж. Шесть подтверждений в биткоине — эмпирическое правило о стоимости, а не криптографическое доказательство постоянства.
Внутри этого утверждения спрятано допущение: что производить блоки дорого. Ошибка Ravencoin убрала допущение. Когда недействительные блоки почти ничего не стоят, «столько-то подтверждений» перестаёт измерять хоть что-нибудь. Число на экране продолжало расти; то, что оно считало, незаметно потеряло смысл.
Честный вывод — не «подтверждения бесполезны». Он в том, что счётчик подтверждений — это утверждение о здоровье правил консенсуса конкретной цепи, и он наследует каждую их слабость. Соразмеряйте терпение со ставкой, а продолжающийся инцидент консенсуса считайте поводом вовсе прекратить транзакции, а не ждать числа побольше.
Где была SSP
Мы держим собственную инфраструктуру Ravencoin, а не читаем балансы из чужого API, и поэтому вопрос «на правильной ли цепи SSP?» имеет проверяемый ответ, а не успокаивающий.
Наш узел работает на Ravencoin 4.8.0 — далеко за хардфорком — и на момент написания стоит на высоте 4 522 205 восстановленной цепи. Обе стороны шва в точности совпадают с эталонной цепью:
- 4 487 775 →
000000000002d64509e06e76ddbbe418c725291687ec62b41ecfc40386a091fd - 4 487 776 →
0000000000042bb50281ebb2f68d3f9143980b041178849015d95b067d52a841
Те же хеши, что в официальном обозревателе Ravencoin, тот же трёхдневный разрыв. От пользователей SSP ничего не требовалось, и Ravencoin в SSP работает ровно как раньше.
Честные границы
Мы пишем такие тексты, чтобы объяснить, от чего защищает наша архитектура, — значит, важно ясно сказать, от чего не защищает.
Мультиподпись два из двух защищает сторону подписи. Она означает, что ни одно скомпрометированное устройство в одиночку не сдвинет ваши монеты, что каждый платёж одобряется дважды на двух независимых устройствах и что у вора с вашим ноутбуком нет ничего. Эти свойства держались весь инцидент, и именно они важны для подавляющего большинства способов, которыми люди теряют криптовалюту.
Ни одно из них не помогает против реорганизации цепи. Не помогут ни аппаратный кошелёк, ни изолированный подписант, ни парольная фраза, ни кворум мультиподписи любого размера. Отказы консенсуса лежат под всем этим: это свойство сети, а не вашего хранения. Кто утверждает, что его кошелёк защищает вас от плохого блока, тот вам что-то продаёт.
Честно кошелёк может предложить вот что: держать настоящую узловую инфраструктуру, обновлять её и прозрачно сообщать, за какой цепью он следует. Это обязательство по сопровождению, а не криптографическая гарантия, — и это верный масштаб обещания.
Второе, что стоит унести из августа, — напоминание о том, где риск живёт на самом деле. Ошибка Ravencoin годами лежала в коде, прежде чем её кто-то использовал, и находилась в самом негламурном месте, какое можно вообразить: в поле заголовка, которое все считали проверяемым кем-то другим. Провал энтропии Coldcard имел ровно ту же форму — маленькая, скучная, неисследованная строка кода, невидимая снаружи, державшая на себе всё остальное.
Именно такие ошибки бьют больно. Не экзотические криптографические атаки, а допущение, к которому никто не написал тест.


