隔离验证的数字货币钱包开发过程以及编译环境

区块链爱好者(QQ:53016353)

数字货币编程



有2种实现数字货币的方式:


原生的数字货币脚本


原生的数字货币脚本定义为一个scriptPubKey,格式为1字节的push指令(OP_0, OP_1, ..., OP_16)后面跟着2到32字节数据.


嵌套在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中找到.
阅读更多

更多精彩内容