本文件的大部分内容可以在与隔离认证相关的BIP中找到,包括BIP141,BIP143,BIP144和BIP145。请将此视为阅读其他相关文件的第一个参考点,并作为那些应该做和那些不应该做的检查清单。
钱包必须实现本节中的所有功能,以便在基本级别被视为segwit兼容:
pay-to-script-hash
(BIP16)及其地址格式(BIP13)。scriptPubKey
,并创建一个交易。redeemScript
之前,P2SH-P2WPKH地址与非segwit P2SH地址无法区分(例如非segwit多签名地址)。0x02
或0x03
开头。使用任何其他格式(如未压缩的公钥)可能会导致不可撤销的资金损失。keyhash
)的SHA256的RIPEMD160。尽管keyhash
公式与P2PKH相同,但应避免重用keyhash
以获得更好的隐私并防止意外使用未压缩密钥。redeemScript
始终为22个字节。它以OP_0
开头,然后是keyhash
的规范推送(如0x0014{20-byte keyhash}
)。scriptPubKey
是OP_HASH160 hash160(redeemScript)OP_EQUAL
,地址是对应的P2SH地址,前缀为3。nVersion|txins|txouts|nLockTime
。nVersion|marker|flag|txins|txouts|witness|nLockTime
。nVersion
,txins
,txouts
和nLockTime
的格式与原始格式相同。marker
必须是0x00
。flag
必须是0x01
。witness
是交易的所有见证数据的序列化。txins
的数量默认的。compactSize integer
开头,以指示该项的字节数。txin
未与任何见证数据相关联,则其对应的见证字段精确为0x00
,表示见证堆栈项的数量为零。txins
都没有与任何见证数据相关联,则交易必须以原始交易格式序列化,不包括marker
, flag
, witness
。例如,如果没有txins
来自segwit UTXO,它必须以原始交易格式序列化。(coinbase交易例外)txid
的定义保持不变:原始序列化格式的double SHA256。wtxid
,它是具有见证数据的新序列化格式的double SHA256。wtxid
与txid
相同。txid
仍然是交易的主要标识符:txin
中使用。txid
来识别交易,则预示着它将继续使用segwit。scriptSig
必须只包含一个redeemScript
。sighash
。scriptCode
总是26个字节,包括前导大小字节,如0x1976a914{20-byte keyhash}88ac
,不是redeemScript
,也不是scriptPubKey
。NODE_WITNESS=(1<<3)
。NODE_WITNESS
支持的节点。NODE_WITNESS
支持的节点。vsize
)。vsize
等于原始序列化大小的3倍,加上新格式序列化的大小,将结果除以4并向上舍入到下一个整数。例如,如果一个交易是200字节的新格式序列化,并且变为99字节,删除了marker
,flag
,witness
,则vsize
为(99*3+200)/4=125并向上舍入。vsize
只是它本身的大小。vsize
与其他交易而不是大小来估算。如果钱包支持除单一签名之外的脚本类型,例如多重签名,则必须满足以下基本要求:
#### 创建P2SH-P2WSH地址
witnessScript
的脚本。witnessScript
(scripthash
)的SHA256。请注意使用单个SHA256,而不是双SHA256和RIPEMD160(SHA256)。redeemScript
总是34个字节。它以OP_0
开头,然后是scripthash
的规范推送(即0x0020{32-byte scripthash}
)。scriptPubKey
是OP_HASH160 hash160(redeemScript) OP_EQUAL
,地址是对应的P2SH地址,前缀为3。OP_IF
或OP_NOTIF
,则其参数必须是空向量(对于false)或0x01
(对于true)。使用其他值可能导致永久性资金损失。(BIP草案)。OP_CHECKSIG
或OP_CHECKMULTISIG
返回失败,则所有签名必须为空向量。否则,资金可能会永久丢失。(BIP146)。witnessScript
的默认策略限制为3600字节。除了witnessScript
,最多可以有100个见证堆栈项,每个最多80个字节。超出这些限制的交易不得转发或包含在一个区块中。nOpCount
,仍然适用于P2SH-P2WSH。scriptSig
必须只包含一个redeemScript
。witnessScript
。OP_CODESEPARATOR
的情况下,scriptCode
是witnessScript
,前面是一个compactSize integer
,用于witnessScript
的大小。例如,如果脚本是OP_1
(0x51
),则序列化的scriptCode
是(0x0151
)。OP_CODESEPARATOR
的任何异常脚本,请参阅BIP143以获取确切的语义。witnessScript
之前的任何见证堆栈项目都用作脚本评测的输入堆栈。输入堆栈不会被解释为脚本。例如,不需要使用0x4c
(OP_PUSHDATA1)来“push”大项。初始segwit支持不需要以下功能。
scriptPubKey
。它以OP_0
开头,然后是keyhash
的规范推送(即0x0014{20-byte keyhash}
)。keyhash
是压缩公钥的RIPEMD160(SHA256)。scriptSig
必须为空,见证堆栈格式和签名生成规则与P2SH-P2WPKH相同(包括使用压缩公钥的要求)。scriptPubKey
。它以OP_0
开头,然后是scripthash
的规范推送(即0x0020{32-byte scripthash}
)。scripthash
是witnessScript
的SHA256。scriptSig
必须为空,见证堆栈格式和签名生成规则与P2SH-P2WSH相同(包括使用压缩公钥的要求)。vsize
较小,因此可能需要较少的费用。scriptPubKey
协议一起使用,例如支付协议(BIP70)。但是,它可能会影响付款人和收件人的隐私(见下文)。分享2个比特币相关的交互式在线编程实战教程:
这里是原文比特币钱包隔离认证开发指南