下图是比特币系统中简单的交易示意图。
这里需要注意的一点是比特币系统中有两种哈希指针,一种是连接各个区块来把它们构成一个链,另一种是指向前面某一项交易以此来说明币的来源,这样以来不但可以防止凭空造币还可以防止双重支付。
比特币系统中每个交易都包含输入和输出两个部分,输入部分要说明币的来源,输出部分要给出收款人公钥的哈希。我们已A--->B的交易为例,A给B转钱,A需要知道B的地址,B需要知道A的公钥,因为A的公钥代表A的身份,样就可以证明钱是从哪里来的。其实不只是B需要知道A的公钥,所有节点都需要知道A的公钥,因为区块链中有的节点是有恶意的,所以每个节点都需要独立验证交易的合法性。不过这样做会带来一个问题是怎样才能知道A的公钥。A的公钥是在A--->B这个转账交易中自己宣称的,被包含在当前交易的输入部分当中。这样就会有一个安全漏洞。因为A的公钥是自己给出的,那么完全有可能会存在一个B‘伪造一个A--->B的转账交易B‘使用它自己的公钥替换掉当前交易中输入脚本中A的公钥,然后用自己的私钥进行签名,那么其它节点用这个假造的公钥来验证签名就是合法的,这就相当于把A账户上的钱给偷走了。
那么如何来避免这个问题呢。如上图所示,在一个交易的输出部分会包含收款人的公钥哈希,也就是说在交易1中的输出部分会存有A的公钥,所以在交易2中A给B转账中A的公钥要与交易1中输出部分A的公钥一致才可以。
原文:https://www.cnblogs.com/yishi-san/p/12632720.html