作者: danielsocials
时间:2016年1月18日
来源:https://github.com/danielsocials/website/blob/segwit-cn/_posts/zh_CN/pages/2016-01-18-segwit-wallet-dev.md
隔离验证编程
有2种实现隔离验证的方式:
原生的隔离验证脚本
原生的隔离验证脚本定义为一个scriptPubKey,格式为1字节的push指令(OP_0, OP_1, …, OP_16)后面跟着2到32字节数据.
转帖人注:感觉上面变红色的部分有问题,见下图:
来自:https://en.bitcoin.it/wiki/Script
![](https://startbitcoin.org/wp-content/uploads/2021/01/d175b523-f223-4c0d-9d15-e8aaaec61d75.jpeg)
嵌套在P2SH中
隔离验证脚本嵌套在P2SH中是用一个redeemScript存放隔离验证脚本,也是一个scriptPubKey,格式为1字节的push指令(OP_0, OP_1, …, OP_16)后面跟着2到32字节数据.
交易序列化
如果一个交易不包含隔离验证数据,那么序列化格式使用以前的格式.
如果一个交易包含隔离验证数据,一个新的序列化格式必须被使用:
[nVersion][marker][flag][txins][txouts][witness][nLockTime]
这几个字段包括nVersion, txins, txouts, and nLockTime 和以前的定义是一致的.
marker 字段必须是 0x00.
flag 必须是1字节的非0值. 当前必须是0x01.
witness 是一个交易的所有有witness数据的序列化.每个txin关联到一个witness字段.witness字段以var_int开始,var_int的值表示txin需要占用栈的数量,紧跟着栈的成员值,每个栈成员都以var_int开头.witness数据不是脚本也没有520字节的压栈限制.
一个非witness的txin必须关联一个空的witness字段,表示为0x00.如果所有的txin都没有witness程序,那么交易必须使用旧的格式序列化(例外:coinbase交易).
Transaction ID
交易ID
每个交易有2个ID
txid含义没有改变,还是交易序列化数据的2次SHA256哈希运算值
一个新的 wtxid 定义为: 包含新的witness数据的序列化数据的2次SHA256哈希运算值. 如果一个交易没有任何witness数据, 那么 wtxid 等于 txid.
txid仍然表示交易的id,特别是也用来在txin中指向前一个交易的输出。
Standard script types
标准脚本类型
Pay-to-Public-Key-Hash (P2PKH)
P2PKH是最常用的模板 scriptPubKey 被中本聪定义,允许简单的支付给一个单一的公钥.格式为:
scriptPubKey (25 bytes): OP_DUP OP_HASH160 < 20-byte-pubkey-hash > OP_EQUALVERIFY OP_CHECKSIG
花费P2PKH的输出,scriptSig格式为
scriptSig: < sig > < pubkey >
RIPEMD160(SHA256(pubkey)) 等于scriptPubKey 中的 20-byte-pubkey-hash.
Pay-to-Script-Hash (P2SH)
P2SH定义在BIP16.它允许付款到任意复杂的脚本用一个修改长度的scriptPubKey. 格式为:
scriptPubKey (23 bytes): OP_HASH160 <20-byte-script-hash> OP_EQUAL
花费P2SH的输出,scriptSig格式为
scriptSig: <…> <…> <…> < redeemScript >
RIPEMD160(SHA256(redeemScript)) 等于在scriptPubKey中的 20-byte-script-hash. redeemScript是反序列化并且当作剩下的数据在scriptSig中.
Pay-to-Witness-Public-Key-Hash (P2WPKH)
P2WPKH是BIP141新定义的. 类似P2PKH, 它允许简单支付到一个公钥, 格式为:
scriptPubKey (22 bytes): OP_0 < 20-byte-pubkey-hash >
花费P2WPKH的输出,scriptSig必须是空的,并且witness为
witness: < sig > < pubkey >
RIPEMD160(SHA256(pubkey)) 等于scriptPubKey 中的 20-byte-pubkey-hash.
P2WPKH in P2SH (P2SH-P2WPKH)
P2SH-P2WPKH 是一个使用P2WPKH 脚本作为 redeemScript 的 P2SH. P2SH-P2WPKH的 scriptPubKey 看起来和通常的P2SH是相同的:
scriptPubKey (23 bytes): OP_HASH160 < 20-byte-script-hash > OP_EQUAL
花费P2SH-P2WPKH 的输出,scriptSig必须只包含一个 redeemScript, 并且witness 是和P2WPKH相同的:
scriptSig (23 bytes): < OP_0 < 20-byte-pubkey-hash > >
witness: < sig > < pubkey >
RIPEMD160(SHA256(pubkey)) 等于 20-byte-pubkey-hash, 并且RIPEMD160(0x0014{20-byte-pubkey-hash}) 等于 20-byte-script-hash.
Pay-to-Witness-Script-Hash (P2WSH)
P2SH-P2WPKH 是BIP141定义的另一个新的脚本格式, 类似P2SH. 它允许付款到任意复杂的脚本. 格式为:
scriptPubKey (34 bytes): OP_0 < 32-byte-script-hash >
花费P2WSH的输出,scriptSig必须是空的,并且witness为
witness: <…> <…> <…> < witnessScript >
RIPEMD160(SHA256(witnessScript)) 等于scriptPubkey中的 32-byte-script-hash, witnessScript是反序列化并且当作剩下的数据在witness中.
P2WSH in P2SH (P2SH-P2WSH)
P2SH-P2WPKH 是使用一个P2WSH脚本作为P2SH的 redeemScript. P2SH-P2WPKH 的 scriptPubKey 看起来和P2SH是一样的:
scriptPubKey (23 bytes): OP_HASH160 <20-byte-script-hash> OP_EQUAL
花费P2SH-P2WPKH的输出, scriptSig必须只包含一个 redeemScript, 并且witness 是和P2WSH是相同的:
scriptSig (35 bytes): < OP_0 < 32-byte-script-hash > > \
witness: <…> <…> <…> < witnessScript >
SHA256(witnessScript) 等于 32-byte-script-hash, 并且 RIPEMD160(0x0020{32-byte-pubkey-hash}) 等于 20-byte-script-hash.
新的签名算法
花费一个witness程序的输出,当产生ECDSA签名时一个新的签名算法必须被使用, 一个详细的例子能在BIP143中找到.
新的支付地址
2个新的支付地址类型被定义了. 完整的规范可以在BIP142中找到.
英文:https://bitcoincore.org/en/segwit_wallet_dev/