Что такое версия свидетеля и как она используется?
Транзакция SegWit состоит из: [nVersion][marker][flag][txins][txouts][witness][nLockTime]
Из BIP: «Поле-свидетель начинается с var_int, чтобы указать количество элементов стека для txin».
Где появляется версия-свидетель и в каких сценариях ее можно использовать?
Во-вторых, почему говорится, что поле свидетеля начинается с var_int, чтобы указать количество элементов стека для txin — разве данные свидетеля не просто подпись? Или это просто относится к транзакциям, которые имеют больше входных данных, а ведущая var_init просто подсчитывает количество входных данных, поэтому ожидаются подписи?
Тони ответил на часть 1 вопроса.
свидетельские данные — это больше, чем подпись, у вас может быть ключ публикации «за» подписью, сценарий выкупа или другие смарт-контракты. Взгляните на сценарии V_IN для не-Segwit tx.
по второй части вашего вопроса: число в начале (флажок) определяет количество входов, которые имеют данные свидетеля. Вы можете создать tx, у которого есть 5 входов, например, 2 без SegWit и 3 SegWit. Тогда этот флаг имеет значение «3».
См. этот пример с двумя V_IN и значением флага «1», потому что только одна часть tx имеет данные Segwit/свидетеля. Также см. в конце количество элементов segwit для указанного V_IN (TX_IN[1]). Первые два элемента — это подпись (с OP_SIGHASHSINGLE — hex 03 в конце!), третий элемент — это ключ паба.
01000000000102FE3DC9208094F3FFD12645477B3DC56F60EC4FA8E6F5D67C565D1C6B9216B36E000000004847304402200AF4E47C9B9629DBECC21F73AF989BDAA911F7E6F6C2E9394588A3AA68F81E9902204F3FCF6ADE7E5ABB1295B6774C8E0ABD94AE62217367096BC02EE5E435B67DA201FFFFFFFF0815CF020F013ED6CF91D29F4202E8A58726B1AC6C79DA47C23D1BEE0A6925F80000000000FFFFFFFF0100F2052A010000001976A914A30741F8145E5ACADF23F751864167F32E0963F788AC000347304402200DE66ACF4527789BFDA55FC5459E214FA6083F936B430A762C629656216805AC0220396F550692CD347171CBC1EF1F51E15282E837BB2B30860DC77C8F78BC8501E503473044022027DC95AD6B740FE5129E7E62A75DD00F291A2AEB1200B84B09D9E3789406B6C002201A9ECD315DD6A0E632AB20BBB98948BC0C6FB204F2C286963BB48517A7058E27034721026DCCC749ADC2A9D0D89497AC511F760F45C47DC5ED9CF352A58AC706453880AEADAB210255A9626AEBF5E29C0E6538428BA0D1DCF6CA98FFDF086AA8CED5E0D0215EA465AC00000000
VERSION
01000000
SEGWIT (BIP141): this is a segwit tx, marker=00
(BIP141): flag=01
TX_IN COUNT [var_int]: hex=02, decimal=2
TX_IN[0]: 6EB316926B1C5D567CD6F5E6A84FEC606FC53D7B474526D1FFF3948020C93DFE
TX_IN[0] hex=00000000, reversed=00000000, decimal=0
TX_IN[0] Script Length hex=48, decimal=72
TX_IN[0] Script Sig (uchar[]) 47304402200AF4E47C9B9629DBECC21F73AF989BDAA911F7E6F6C2E9394588A3AA68F81E9902204F3FCF6ADE7E5ABB1295B6774C8E0ABD94AE62217367096BC02EE5E435B67DA201
TX_IN[0] Sequence (uint32_t)
FFFFFFFF
TX_IN[1] F825690AEE1B3DC247DA796CACB12687A5E802429FD291CFD63E010F02CF1508
TX_IN[1] hex=00000000, reversed=00000000, decimal=0
TX_IN[1] Script Length hex=00, decimal=0
TX_IN[1] Sequence (uint32_t) FFFFFFFF
TX_OUT COUNT, hex=01, decimal=1
TX_OUT[0] Value: hex=00F2052A01000000, dec=5000000000
TX_OUT[0] PK_Script Length hex=19, dec=25
TX_OUT[0] pk_script 76A914A30741F8145E5ACADF23F751864167F32E0963F788AC
This is a P2PKH script, and translates base58 encoded into this bitcoin address: mvNy8bVyGDyuCiS1zMzm61eDtCBbUVfHPD
WITNESS TXIN[0] stack elements: hex=00, decimal=0
WITNESS TXIN[1] stack elements: hex=03, decimal=3
WITNESS[0] data length (var_int), hex=47, decimal=71, data(uchar[]):
304402200DE66ACF4527789BFDA55FC5459E214FA6083F936B430A762C629656216805AC0220396F550692CD347171CBC1EF1F51E15282E837BB2B30860DC77C8F78BC8501E503
WITNESS[1] data length (var_int), hex=47, decimal=71, data(uchar[]):
3044022027DC95AD6B740FE5129E7E62A75DD00F291A2AEB1200B84B09D9E3789406B6C002201A9ECD315DD6A0E632AB20BBB98948BC0C6FB204F2C286963BB48517A7058E2703
WITNESS[2] data length (var_int), hex=47, decimal=71, data(uchar[]):
21026DCCC749ADC2A9D0D89497AC511F760F45C47DC5ED9CF352A58AC706453880AEADAB210255A9626AEBF5E29C0E6538428BA0D1DCF6CA98FFDF086AA8CED5E0D0215EA465AC
LOCK_TIME
00000000
Если под версией-свидетелем вы подразумеваете версию скрипта, которая была добавлена с обновлением SegWit, в этом сообщении в блоге Bitcoin Core объясняются последствия этого номера версии:
Segwit решает эту проблему, добавляя номер версии для сценариев, так что дополнительные коды операций, которые потребовали бы хард-форка для использования в транзакциях, отличных от Segwit, могут вместо этого поддерживаться путем простого увеличения версии сценария.
Что касается вашего второго вопроса, ваша интуиция верна. Число соответствует количеству входов.
Skydanc3r
Тони Ризко
Skydanc3r
Тони Ризко