购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.3
IP地址:比特币的原始地址(P2PK)

我们已经明确了Alice可以通过将她的一些比特币分配给Bob的一个公钥来支付给Bob。但Alice怎样才能获得Bob的公钥呢?Bob可以直接把它复制给Alice,但我们再回顾一下4.1.3节所介绍的公钥。注意到公钥非常长。想象一下,如果Bob要通过电话把这串公钥读给Alice会是怎样的情形:

早期的比特币软件并不直接输入公钥,而是允许支付者输入接收者的IP地址,如图4-5所示。这一功能后来被移除了,因为使用IP地址存在诸多问题,但是对此进行简要描述有助于我们更好地理解比特币协议增加这些特定功能的原因。

如果Alice在比特币0.1版本中输入了Bob的IP地址,那么她的全节点将与Bob的全节点建立连接,并从Bob的钱包中接收到一个全新的公钥,这是他的节点之前从未给过任何人的。有了一个全新的公钥非常重要,它确保了支付给Bob的不同交易不能被某人通过查看区块链并注意到所有交易都支付给同一个公钥而关联起来。

Alice的钱包通过使用她的节点从Bob节点接收到的公钥,会构建一个支付给一个非常简单输出脚本的交易输出:

图4-5:保存在互联网档案馆上的发送比特币的早期界面( https://oreil.ly/IDV1a

Bob随后可以仅使用包含他的签名的输入脚本来花费那笔输出:

为了解读输出脚本和输入脚本的功能,你可以将它们组合在一起(首先是输入脚本),然后注意到每段数据(用尖括号标出)都被放置于一个项的清单顶端,这个清单被称为栈。当碰到一个操作码(opcode)时,它会使用栈中的项,从最顶端的项开始。让我们通过观察组合后的脚本来了解这是如何工作的:

在这段脚本中,Bob的签名首先被放置在栈上,紧接着Bob的公钥被放到它的上面。OP_CHECKSIG操作会使用这两个元素,首先是公钥,然后是签名,并将它们从栈中移除。它验证签名是否与公钥相对应,同时也承诺(签名)交易中的各个字段。如果签名是正确的,OP_CHECKSIG就会用数值1替换栈顶的自身;如果签名不正确,它就用0替换自身。如果在评估结束时栈顶有非零元素,则脚本通过。如果交易中的所有脚本都通过,并且交易的所有其他细节都是有效的,那么全节点会认为该交易是有效的。

简而言之,前述脚本使用了原始论文中描述的相同公钥和签名,但增加了两个脚本字段和一个操作码。在这里这似乎是画蛇添足,但当我们阅读以下部分时,我们将开始看到这样做的好处。

如今这种输出被称为支付到公钥(Pay to Public Key,P2PK)。它从未被广泛用于支付,同时近十年来,没有哪个广泛使用的程序支持了IP地址支付。 +QBHPXAHIe2PMDSdlVRpeEXRAFiVEbgzj/HzfnBnCc7jFamz5VgZ+CMdz+tuJ0yn

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开