Witness는 개별 입력의 스택 항목 필드다. 의미는 사용하는 출력의 버전과 조건에 따라 정해지며, 자동으로 독립 실행 가능한 스크립트가 되는 것은 아니다.
각 입력은 witness 직렬화에 자체 항목 목록을 갖는다. 서명 검증은 해당 스크립트 버전이 정한 메시지를 사용하며, 데이터가 있다는 사실만으로 유효성이 증명되지는 않는다. [BIP 141 — Segregated Witness] [BIP 143 — SegWit signature hashing]
txid는 witness가 없는 원래 직렬화에서 계산한다. wtxid는 witness가 있는 전체 직렬화를 포함하며, witness가 없는 거래에서는 두 식별자가 같다. [BIP 141 — Segregated Witness]
Witness program은 사용하는 출력의 버전 있는 조건이다. Witness는 나중에 그 출력을 사용하는 거래가 제공한다. 같은 필드도 UTXO 집합의 백업도 아니다. [BIP 141 — Segregated Witness]
네이티브 SegWit 버전 0은 빈 scriptSig를 요구한다. P2SH 래핑 형태에서는 scriptSig가 witness program을 스택에 넣으며, 사용 증명은 witness에 남는다. [BIP 141 — Segregated Witness]
P2WPKH는 서명과 공개키를 제공한다. P2WSH의 마지막 항목은 witnessScript이며 해시가 프로그램과 일치해야 한다. 앞선 항목은 초기 스택을 구성한다. [BIP 141 — Segregated Witness] [BIP 143 — SegWit signature hashing]
annex가 있으면 제거한 뒤 Taproot는 서명 항목 하나인 키 경로와 스크립트 및 제어 블록이 있는 스크립트 경로를 구별한다. 버전 0 규칙을 버전 1에 기계적으로 적용할 수 없다. [BIP 341 — Taproot]
BIP 141은 wtxid 트리와 coinbase 커밋먼트로 witness를 결속한다. 이 트리에서 coinbase의 wtxid는 0이며, 커밋먼트는 루트와 32바이트 예약 값을 결합한다. [BIP 141 — Segregated Witness]
witness만 바꾸면 txid는 바뀌지 않는다. 하지만 분리가 모든 다른 필드나 모든 입력 조합의 불변성을 보장하지는 않는다. 바뀐 증명도 검증을 통과해야 한다. [BIP 141 — Segregated Witness] [Bitcoin Core — Segregated Witness benefits]
witness 직렬화로 추가된 바이트는 1 WU, 기본 바이트는 4 WU를 차지한다. Full Node는 해당 검증에 여전히 이 데이터를 필요로 한다. 무료인 체인 외부 데이터가 아니다. [BIP 141 — Segregated Witness] [Bitcoin Core v29.0 — Script interpreter]
Witness는 서명, 공개키 또는 사용된 스크립트 분기를 공개할 수 있다. 암호화 저장소나 개인키 보관용이 아니며 Seed Phrase나 지갑 백업을 대체하지 않는다. [BIP 341 — Taproot] [Bitcoin Developer Reference — Transactions]
더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 SegWit, Block weight, Bitcoin Script, Taproot. 다음 항목에서도 이 글을 참조합니다 Virtual byte (vbyte), Block weight.