- 1.前言
- 2.为什么是区块链编程而不是比特币编程?
- 3.为什么是 C#?
- 4.预备条件
- 5.本书众筹
- 6.补充阅读
- 7.图标
- 8.许可: CC (ASA 3U)
- 9.项目设置
- 1.比特币地址
- 2.交易
- 3.区块链
- 4. 区块链不仅仅是比特币
- 5.支付比特币
- 6.作为真实性验证方法的所有权证明
- 1.足够随机了吗?
- 2.秘钥加密
- 3.秘钥的生成
- 1.P2PK[H] (向公钥付款 [Hash])
- 2.多重签名
- 3.P2SH ( 向脚本哈希付款)
- 4.灵活机动性
- 5.使用 TransactionBuilder
- 1.颜色币
- 2.发行一项资产
- 3.传输资产
- 4.单元测试
- 5.李嘉图合约
- 6.流动的民主
- 7.烧钱和声誉证明
- 8.存在性证明
- 1.比特币发展的挑战
- 2.如何证明一个币存在于区块链上
- 3.如何证明一个颜色币存在于区块链上
- 4.断开与第三方 API 的信任关系
- 5.防止延展性攻击
- 6.保护你的私钥
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.P2PK[H] (向公钥付款 [Hash])
在第二部分,我们知道了一个比特币地址就是一个公钥的哈希值。
我们也知道了,对于区块链而言,根本没有比特币地址的说法。区块链使用 ScriptPubKey 识别接收者,这种 ScriptPubKey 可以从地址生成。(反过来也一样)
Key key = new Key();
BitcoinAddress address = key.PubKey.GetAddress(Network.Main);
Console.WriteLine(address.ScriptPubKey);
然而,并不是所有的 ScriptPubKey 都代表一个比特币地址。
这是区块链第一个交易的例子(创世块):
Console.WriteLine(Network.Main.GetGenesis().Transactions[0].ToString());
可以看到 scriptPubKey 的形式是不一样的:
一个比特币地址这样表示:
OP_DUP <hash> OP_EQUALVERIFY OP_CHECKSIG
但是这里:
<pubkey> OP_CHECKSIG
实际上,开始的时候,公钥被直接用在 ScriptPubKey 里面。
现在我们主要使用公钥的哈希值。
key = new Key();
Console.WriteLine("Pay to public key : " + key.PubKey.ScriptPubKey);
Console.WriteLine();
Console.WriteLine("Pay to public key hash : " + key.PubKey.Hash.ScriptPubKey);
这两种支付类型被叫做 P2PK (向公钥付款)、P2PKH (向公钥哈希付款)。
中本聪使用 P2PKH 而不是 P2PK,主要有两个原因:
- 你的公钥和私钥使用的椭圆曲线加密算法,无法抵挡改进的 Shor 算法的攻击,它就是用来解决在椭圆曲线上的离散逻辑问题的。简单来说,它意味着,通过一个量子计算机,理论上未来可能从一个公钥上获得一个私钥。如果只是当币被付出去时才公开公钥,这种攻击是无效的。(假设地址不会复用)
- 哈希长度很小,打印起来更容易,也很容易被嵌入到很小的空间上,比如一个 QR 代码。
当前,没有理由直接使用 P2PK,但是它仍然与 P2SH 联合起来使用。(后面将会看到)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论