返回介绍

1.P2PK[H] (向公钥付款 [Hash])

发布于 2024-12-29 22:37:17 字数 1652 浏览 0 评论 0 收藏 0

在第二部分,我们知道了一个比特币地址就是一个公钥的哈希值。

我们也知道了,对于区块链而言,根本没有比特币地址的说法。区块链使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文