Перейти к содержимому
buybitcoinsmart

Глоссарий / Протокол и обновления

Коммитмент свидетеля

Что такое коммитмент свидетеля?
Коммитмент свидетеля представляет собой хеш из 32 байт в одном из выходов coinbase-транзакции, который привязывает каждый wtxid блока к уже существующему дереву Меркла в заголовке.

Определено в BIP-141.

Segregated witness требовалось записать второй корень Меркла, не трогая заголовок блока, и BIP-141 помещает его в выход coinbase, чтобы изменение можно было выпустить как мягкий форк. Скрипт должен иметь длину не менее 38 байт и начинаться с 0x6a24aa21a9ed. Коммитмент привязывает подписи, которые дают право распоряжаться вашими биткоинами, к блоку, в который они были включены, поскольку txid по своей природе не включает данные свидетеля.

Как это работает

BIP-141 задает коммитмент свидетеля вплоть до опкода, и узел пересчитывает значение, прежде чем принять блок.

Узлы строят второе дерево Меркла по блоку, используя wtxid в качестве листьев вместо txid и объединяя их так же, как строится собственное дерево заголовка. Лист самой coinbase-транзакции не является ее настоящим wtxid: BIP-141 принимает это значение за 32 нулевых байта, потому что вычисляемое число находится внутри самой этой транзакции, а ничто не может хешировать само себя. В выход записывается двойной SHA-256 от хеша корня свидетеля, соединенного с зарезервированным значением свидетеля из 32 байт, и это зарезервированное значение должно присутствовать как единственный элемент в собственном поле свидетеля входа coinbase.

Байт за байтом скрипт выхода выглядит так: один байт OP_RETURN (0x6a), один байт, проталкивающий следующие 36 (0x24), четырехбайтовый заголовок коммитмента (0xaa21a9ed), затем хеш из 32 байт. В сумме это 38 байт, а все начиная с 39-го байта представляет собой необязательные данные, не имеющие консенсусного смысла.

Два граничных правила не позволяют манипулировать этим шаблоном или применять его чрезмерно. Если совпадают несколько выходов, учитывается тот, у которого индекс выхода наибольший, поэтому подставное значение, размещенное раньше, не может вытеснить настоящее. И если ни одна транзакция в блоке не несет данных свидетеля, коммитмент необязателен. Правило было выпущено через биты версии BIP9 под именем segwit в бите 1, с окном сигнализации в основной сети с полуночи 15 ноября 2016 года UTC до полуночи 15 ноября 2017 года UTC.

Где это видно

Коммитмент свидетеля отображается в обозревателе блоков как выход coinbase-транзакции, скрипт которого начинается с OP_RETURN.

Откройте первую транзакцию любого недавнего блока, и выходы разделятся на два вида: те, что платят пулу и его клиентам, и один, скрипт которого в шестнадцатеричном виде начинается с 6a24aa21a9ed. 32 байта после этого префикса и есть сам коммитмент, а все, что идет после первых 38 байт, является свободным пространством.

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

Зарезервированное значение является той частью, за которой стоит наблюдать. BIP-141 сегодня не придает ему консенсусного смысла и намеренно придерживает его, чтобы будущий мягкий форк мог вложить новый коммитмент в существующий, сначала захешировав новое значение вместе с зарезервированным. Документ запрещает неконсенсусным применениям, таким как объединенный майнинг, занимать это пространство, и называет, для чего оно сохраняется: деревья сумм по комиссиям, счетчики размера блока и sigops, а также обратные ссылки на выходы, которые тратит транзакция. Вместе они дали бы легкому клиенту короткое доказательство того, что блок недействителен, вместо самого блока.

Коммитмент свидетеля vs корень Меркла

Коммитмент свидетеля и корень Меркла представляют собой корни двух отдельных деревьев, и только один из них занимает место в заголовке блока.

Корень Меркла представляет собой поле заголовка, листьями которого являются txid, а txid по своей природе исключает данные свидетеля. Коммитмент свидетеля находится в выходе транзакции, его листьями являются wtxid, которые включают эти данные, а его coinbase-лист обнулен. Вложение и есть весь трюк. Coinbase-транзакция находится в более старом дереве как обычный лист, поэтому изменение коммитмента меняет coinbase, меняет корень Меркла в заголовке и ломает блок даже для программ, которые никогда не слышали о segregated witness.

Не путать с

Часто задаваемые вопросы

Содержит ли каждый блок коммитмент свидетеля?

Нет. BIP-141 делает коммитмент необязательным для блока, в котором ни одна транзакция не несет данных свидетеля, и обязательным для каждого блока, где такие данные есть, и в этом случае coinbase-транзакция должна содержать выход с ним.

Что такое префикс aa21a9ed в выходе coinbase?

0xaa21a9ed представляет собой четырехбайтовый заголовок коммитмента, который помечает выход coinbase как коммитмент свидетеля. Он идет после OP_RETURN и проталкивания 36 байт, а 32 байта после него представляют собой хеш коммитмента.

Для чего нужно зарезервированное значение свидетеля?

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

Источники

Последняя проверка: 6 сентября 2026 г.

Связанные термины

Еще в разделе «Протокол и обновления»

Читать эту страницу на английском