46 / 736STALE

Stale Block

Корректный блок вне основной цепочки

Stale Block — корректный блок Bitcoin, оставшийся в боковой ветви. Для этого не нужно мошенничество: два майнера могут найти блоки почти одновременно, а сеть затем продолжит только одну из ветвей.

Stale Block соответствует правилам Bitcoin, но не входит в активную цепочку. Это история, по которой узел считает подтверждения и определяет доступные для расходования средства. Узел — компьютер, проверяющий блоки и транзакции. Выбор между корректными ветвями зависит от накопленной работы майнинга. Для получателя платежа это может означать потерю подтверждения и новое ожидание, а не автоматическую потерю биткоинов.

Представим майнеров Анну и Павела. Оба работают над продолжением одного и того же последнего блока. Анна находит новый блок, но до того, как Павел узнаёт об этом, он находит свой. Оба блока могут быть корректными, лишь с немного разными наборами транзакций. Узлы проверяют блоки и транзакции. Они узнают о блоках в разном порядке и некоторое время следуют разным концам цепочки. Когда одна корректная ветвь накопит больше работы и узлы её проверят, они перейдут на неё. Блок на оставленной ветви называют Stale Block. [1]

Сети Bitcoin нужна единая история, чтобы одни и те же средства нельзя было успешно потратить дважды. Поэтому недостаточно убедиться, что каждый из двух блоков по отдельности соблюдает правила. Узлу нужно ещё выбрать корректную ветвь, которой он будет следовать. Это разные вопросы: соответствие блока правилам и выбор цепочки. Stale Block может содержать правильный Proof of Work, то есть доказательство работы майнинга, корректные транзакции и подписи, но всё равно не входить в выбранную историю. От этого он не становится ошибочным или мошенническим. [1] [2]

Допустим, блок Павела содержал ваш платёж и кошелёк показал одно подтверждение. Если победит ветвь Анны, результат зависит от её содержимого. Та же транзакция может быть и в ней — тогда она останется подтверждённой. Иначе она может вернуться в Mempool, локальный список неподтверждённых транзакций узла, и ждать другого блока. Однако возврат не гарантирован: транзакция должна оставаться приемлемой и не противоречить новой истории. Если там уже есть другая транзакция, расходующая те же средства, исходный платёж не может одновременно подтвердиться в ней. [2]

Обычный платёж отличается от Coinbase Transaction — первой транзакции блока, которая начисляет майнеру награду. В неё входят новые биткоины и комиссии за транзакции. Если блок Павела остаётся вне активной цепочки, его награду coinbase нельзя потратить в этой истории. Она не переходит в Mempool как обычный платёж. Потраченное электричество Павел при этом не вернёт. Поэтому майнерам важно не только найти блок, но и быстро сообщить о нём остальным. [1] [2]

В статьях и обозревателях блоков Stale Block иногда называют Orphan Block. Эти названия часто используют как синонимы, но в более точном смысле они различаются. Orphan Block — блок, предшественник которого пока неизвестен узлу, поэтому узел ещё не может присоединить его к цепочке. У Stale Block предшественник может быть известен, а сам блок корректен; он просто находится вне выбранной ветви. Словом orphan также называют транзакции, когда узлу недостаёт предыдущих транзакций для проверки их входов. Важно понимать, какой смысл вкладывает в слово конкретный источник. [1]

Если узел уже использовал блок Павела, а затем заменяет его ветвью Анны, он выполняет Reorg: меняет часть истории, которую считает активной. Поэтому может измениться число подтверждений в кошельке. Короткое соперничество из нашего примера возможно и при честном майнинге. Однако злоумышленник может попытаться использовать смену истории для Double Spend — провести другой платёж из тех же средств. Сам Stale Block не доказывает такого намерения. Нужно изучить ход событий и возможные конфликтующие транзакции. [1] [2]

Новость о новом блоке не облетает мир мгновенно. Чем дольше она распространяется, тем дольше другие майнеры могут, не зная о ней, работать над тем же предшественником. Важны скорость передачи, связи между узлами и время распространения относительно интервала между блоками. Stale Rate — доля найденных корректных блоков, которые не остаются в активной цепочке. Это не фиксированный процент, заданный правилами Bitcoin. При сравнении данных важны также период наблюдения и блоки, которые наблюдатель вообще смог увидеть. [1] [3]

Спецификация BIP152 описывает Compact Block Relay. Узел часто уже знает большинство транзакций нового блока из своего Mempool, поэтому нет необходимости снова передавать всё их содержимое. Короткие идентификаторы позволяют собрать блок из имеющихся данных и запросить недостающие транзакции. Это сокращает объём передачи и при подходящих условиях помогает узлам быстрее узнавать о новых блоках. Механизм улучшает передачу, но не меняет правила проверки блоков. Полностью исключить почти одновременное нахождение двух блоков он не может. [3]

Накопленная работа ветви технически называется chainwork. Это не измерение реально потраченного электричества и не голосование по числу компьютеров. Каждый блок добавляет значение, вычисленное из сложности его Proof of Work — доказательства работы майнинга. Поэтому «побеждает более длинная цепочка» менее точно, чем «побеждает корректная ветвь с большим chainwork». Узел должен проверить соблюдение правил: даже большой объём работы не делает некорректные транзакции корректными. Кроме того, stale описывает положение блока относительно истории, которую конкретный узел выбрал именно сейчас. [1] [2]

Обозреватель блоков даёт полезную сводку, но показывает данные, доступные этому сервису. Собственный Full Node, узел проверки правил, позволяет исследовать независимо принятую вами историю. Если узел хранит данные блока, команда getblock в Bitcoin Core возвращает confirmations: -1 для блока вне активной цепочки. Если данных нет, например они удалены при pruning для экономии места, команда вернёт ошибку. Само это значение ещё не доказывает, что блок прошёл все проверки соответствия правилам. Чтобы точно определить его положение, проверьте также hash — его идентификатор, предыдущий блок, высоту (число блоков перед ним) и chainwork; судьбу конкретного платежа выясняйте отдельно. Два блока могут иметь одинаковую высоту, но разные хеши. [4] [5]

Для полной картины прочитайте эту статью вместе с Reorg, Подтверждение, Block, Block Header, Proof of Work, Майнинг. На эту статью также ссылаются Reorg, Mining Pool, Hashrate, Selfish Mining.

DOC · 001Bitcoin Developer Guide — Block ChainДокументация DOC · 002Bitcoin Core v29.0 — chain activation and mempool reconciliationПервичный источник DOC · 003BIP 152 — Compact Block RelayСпецификация DOC · 004Bitcoin Core v29.0 — getblockДокументация DOC · 005Bitcoin Core v29.0 — block RPC implementationПервичный источник
Обновлено: Сначала источники · Не является инвестиционной рекомендацией