каково объяснение «свидетельской версии» и ее использования?

Что такое версия свидетеля и как она используется?

Транзакция SegWit состоит из: [nVersion][marker][flag][txins][txouts][witness][nLockTime]

Из BIP: «Поле-свидетель начинается с var_int, чтобы указать количество элементов стека для txin».

Где появляется версия-свидетель и в каких сценариях ее можно использовать?

Во-вторых, почему говорится, что поле свидетеля начинается с var_int, чтобы указать количество элементов стека для txin — разве данные свидетеля не просто подпись? Или это просто относится к транзакциям, которые имеют больше входных данных, а ведущая var_init просто подсчитывает количество входных данных, поэтому ожидаются подписи?

Ответы (2)

Тони ответил на часть 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, могут вместо этого поддерживаться путем простого увеличения версии сценария.

Что касается вашего второго вопроса, ваша интуиция верна. Число соответствует количеству входов.

Спасибо за ваш ответ. Как насчет txins, которые представляют собой n-из-m подписей? Допустим, я делаю segwit tx с 4 txins: 3 обычных p2wpkh и 1 p2wsh с подписями 5 из 8. ведущий var_int будет здесь 4 или 8?
@skydanc3r документация протокола описывает данные свидетеля как «Список свидетелей, по одному для каждого входа ...» под таблицей для структуры данных tx. Ссылка: en.bitcoin.it/wiki/Protocol_documentation#tx
в этом случае относительно моего вопроса во втором комментарии свидетель будет содержать подписи redeemScript + (5 из 8) и будет считаться 1 элементом свидетеля?
@skydanc3r Skydanc3r Я не совсем уверен в этом, но я думаю, что этот вопрос заслуживает отдельного поста с вопросами. Меня тоже очень интересовал бы ответ на этот вопрос.