用NBitcoin进行区块链开发(3) : ScriptPubKey

请参考以下文章一起阅读:

比特币地址(比如: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

图片摘自网络

小结:

  • P2PK:Pay to Public Key,直接把公钥写在脚本中,不太安全,占用空间,现在基本不用
  • P2PKH:Pay to Public Key Hash,在脚本中记录公钥哈希,更安全,也节省空间,常用

参考文献:

  • https://en.bitcoin.it/wiki/OP_CHECKSIG
  • https://programmingblockchain.gitbook.io/programmingblockchain/bitcoin_transfer/transaction
  • https://programmingblockchain.gitbook.io/programmingblockchain/other_types_of_ownership/p2pk-h-_pay_to_public_key_-hash
  • https://www.codeproject.com/Articles/768412/NBitcoin-The-most-complete-Bitcoin-port-Part-Crypt

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2018-12-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券