专栏首页申龙斌的程序人生用NBitcoin进行区块链开发(3) : ScriptPubKey

用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)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 高晓松也玩区块链?它会是下一匹价值千倍的白马吗?

    GXS,第一次看见这个数字资产代码是在云币网上,马上想到的是高晓松,但实际上GXS与高晓松没有半毛钱关系,它是GXShare的简称,它就是一个不温不火的区块链项...

    申龙斌
  • 分叉Fork【区块链生存训练】

    8月1日20:20,Bitcoin Cash(前身是Bitcoin ABC)要给比特币的区块链来个硬分叉,虽然支持它的矿工的算力并不大,但也会闹出个BCC新币来...

    申龙斌
  • 为什么2100万个BTC发行总量少了0.0231?

    许多人只是听说比特币的总数为2100万个,但不知道这个数字的准确来源。实际上,2100万个只是一个近似数,精确的数值为 20999999.9769 ,比210...

    申龙斌
  • 偶尔要用的git命令备忘

    AhDung
  • Git Branch Practice

    Cloud-Cloudys
  • 前端统计利器:Sentry & Matomo

    今天主要说下两款前端统计工具的使用,Sentry & Matomo。以下主要是统计代码接入方式,因此使用前提是你已经在自己的服务器上搭建好了Sentry和Mat...

    木子墨
  • 区块链开发公司 区块链在广告商的优势

     广告界充斥着欺诈,复杂的供应链以及对数据隐私的无法控制。广告商不仅因欺诈而损失更多钱,而且随着供应链中间商人数的增加,他们也失去了对广告的控制权。好消息是区块...

    用户3126099
  • 【011】Verilog Task Concurrent Activation

    最近做一个模块级的仿真,需要在两个过程中反复调用同一个Task。这种场景还是比较常见的,比如一个过程作为普通的配置过程,一个作为中断服务过程,这个Task可以是...

    icsoc
  • Mac OS X在终端中打开文件夹窗口

    版权声明:如未注明转载,则均为公子原创。原创不

    大数据工程师-公子

扫码关注云+社区

领取腾讯云代金券