Есть ли разница в структуре блока segwit по сравнению с традиционным блоком без segwit? Схема будет полезна, если это возможно.
Coinbase-транзакция блока segwit должна содержать выход с обязательством по хэшу корня-свидетеля , см. BIP141 .
Обязательство записывается в scriptPubKey транзакции coinbase. Он должен быть не менее 38 байтов, включая первые 6 байтов
0x6a24aa21a9ed
, то есть:
1-byte - OP_RETURN (0x6a)
1-byte - Push the following 36 bytes (0x24)
4-byte - Commitment header (0xaa21a9ed)
32-byte - Commitment hash: Double-SHA256(witness root hash|witness reserved value)
39-й байт и далее: необязательные данные без согласованного значения
и свидетель ввода coinbase должен состоять из одного 32-байтового массива для зарезервированного значения свидетеля.
Если существует более одного scriptPubKey, соответствующего шаблону, предполагается, что тот, у которого самый высокий выходной индекс, является фиксацией.
На уровне транзакции транзакция segwit должна установить флаг-свидетель на 0001 и предоставить свидетелей до времени блокировки. Транзакция без SegWit не содержит ни одного из этих свойств.
Блок segwit отличается от блока без segwit тем, что требуется наличие свидетеля в выводе OP_RETURN транзакции coinbase. Кроме того, блок будет содержать данные-свидетели (да!), которые из-за увеличения ограничения размера блока до 4 000 000 единиц веса позволяют блоку превысить прежний предел размера блока в 1 МБ.
Segwit представил идентификатор транзакции-свидетеля (wtxid) для каждой транзакции в дополнение к обычному идентификатору транзакции (txid). txid не распространяется на данные-свидетели и, таким образом, не позволяет транзакциям, которые используют только входные данные SegWit, подвергаться гибкости транзакций третьей стороны (см. Transaction-Maleability ). wtxid действительно покрывает данные подписи, содержащиеся в свидетеле, и, таким образом, по-прежнему уязвим. Для транзакций, не использующих SegWit, wtxid равен txid, и они по-прежнему уязвимы.
Чтобы блок зафиксировал данные свидетеля транзакций, которые не покрываются обычным корнем Меркла в заголовке блока, второе дерево Меркла вычисляется из wtxids и фиксируется в вышеупомянутом подтверждении свидетеля в выходных данных Coinbase.
Если блок не содержит segwit-транзакций, фиксация свидетеля необязательна.
Вы можете увидеть подтверждение последнего блока (558722) здесь:
через blockstream.info