请参考以下文章一起阅读:
比特币地址(比如:12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S )实际上只是方便给最终用户使用的,在区块链的内部交易存储中,从来不用这个地址,而是用ScriptPubKey。
在区块高度170中有一笔交易:
https://btc.com/170
在输出脚本的底部有这样一段文字:
P2PKH_PUBKEY 0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG
这笔交易涉及50个BTC的转账,给1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3 转10 BTC,给12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S 转40 BTC。
在区块链内部并没有记录12cbQLTFMXRnSzktFkuoG3eHoMeFtpTu3S ,而是以04开头的那一长串十六进制数字,即公钥,这个例子是非压缩型公钥。在NBitcoin中可以用key.PubKey.ScriptPubKey得到这个脚本。
中本聪在比较早的交易中使用了上面的表述形式,但这种表示形式有两个缺点:
上面的交易类型称为Pay to Public Key,简称为P2PK。
P2PKH
为了节省空间和安全,中本聪推荐采用P2PKH交易,即Pay to Public Key Hash。这里不直接采用公钥,而是采用经过sha256和ripemd160运算之后的20字节的公钥哈希。
通过多种办法可以得到与公钥哈希相对应的脚本,还可以注意到一个细节:主网和TestNet上的ScriptPubKey是没有区别的。
四条语句都得到如下脚本(只占用20多个字节):
OP_DUP OP_HASH160 4a32d744feaa62eb017674b6a4f5dce397f6b1b9 OP_EQUALVERIFY OP_CHECKSIG
再看这笔交易:
https://btc.com/1db7c1909ccab69ff1bc3a715fbf0f1af47143d5061fa4b74c11a47353017e87
17mKugcBDEJbu391Fq41AdwLeGHwJLPRDf 这个地址中收到了0.31415926个BTC。
观察输出脚本,与刚才的源程序输出的脚本是一样的:
OP_DUP OP_HASH160 4a32d744feaa62eb017674b6a4f5dce397f6b1b9 OP_EQUALVERIFY OP_CHECKSIG
图片摘自网络
小结:
参考文献: