本文件的大部分内容可以在与隔离认证相关的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个比特币相关的交互式在线编程实战教程:
这里是原文比特币钱包隔离认证开发指南