segwit
SegWit(隔离见证,v0)
隔离见证将签名/公钥等“见证数据”从交易基础数据中分离,带来两大改变:
- 消除第三方可塑性:
txid不再受 scriptSig 影响(wtxid 另计) - 引入“区块权重”:
weight = base*4 + witness,上限 4,000,000 WU
地址与脚本
- P2WPKH(v0,20B):
- scriptPubKey:
0 <20-byte HASH160(pubkey)> - witness:
<signature> <pubkey>
- scriptPubKey:
- P2WSH(v0,32B):
- scriptPubKey:
0 <32-byte SHA256(witnessScript)> - witness:
<...满足 witnessScript 数据...> <witnessScript>
- scriptPubKey:
注意:v0 地址使用 Bech32(BIP173),HRP 为 bc/tb/bcrt。
交易标记与 wtxid
- SegWit 交易多 出
marker=0x00, flag=0x01两字节;非见证路径可忽略 - txid:对“基础序列化(不含 witness)”双 SHA256
- wtxid:对“完整序列化(含 witness)”双 SHA256
见证承诺(Witness Commitment)
- coinbase 的 OP_RETURN 中包含
wtxid_merkle_root的承诺(BIP141),将见证数据锚定到区块
BIP143 签名哈希(v0 输入)
为修复覆盖范围与可塑性问题,v0 输入采用 BIP143 摘要:
hashPrevouts = Hash256( concat(all inputs' outpoints) )
hashSequence = Hash256( concat(all inputs' sequences) )
hashOutputs = Hash256( concat(all outputs) )
digest = Hash256(
ser(version)||hashPrevouts||hashSequence||outpoint_i||
scriptCode_i||value_i||sequence_i||hashOutputs||locktime||sighashType
)
实现重点:scriptCode_i 对 WPKH 为对应的“模板脚本”(非原始 scriptPubKey);需包含被花费输出的金额 value_i。
费用与权重
- 费用以 vbytes 计价:
vbytes = ceil(weight/4) - 见证数据“折扣”:同体积 witness 相比 base 更便宜,有利于规模化签名数据
兼容过渡
- P2SH-P2WPKH:以
3开头,scriptSig 仅携带redeemScript,见证栈携签名与公钥 - P2SH-P2WSH:同理,redeemScript 为
0 <32-byte SHA256(witnessScript)>