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]
原生版本 0 SegWit 要求 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;承诺将树根与 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, 区块权重, Bitcoin Script, Taproot. 反向关联还来自: 虚拟字节, 区块权重.