06.20 比特币的交易原理(四):证明交易确由发送方发起

这一篇,我们看看如何证明交易确实是由发送方发起的。

仍然是这张图。

昨天,我们验证了第一步,也就是验证了A拥有4亿聪,但还没验证A是不是真的要把3亿聪发给B,1亿聪发给C。这个验证就是靠之前我们说的“签名”了,童鞋们如果忘记了签名原理的话,赶紧翻过去看看。 这个签名藏在解锁脚本里。 解锁脚本里除了有昨天我们说的A自己的公钥外,还有一段用A的私钥加密的签名,当然,这里只是存储了签名的结果,签名的过程就要借用0617的那幅图了。

整个过程如下(把下面的所有者1看作A,所有者2看作B):

第一步:1对本次交易的所有信息(包括发送数量是多少、发给谁等,这里特别把所有者2的公钥加上了,因为它其实就指明了发给谁)进行散列(哈希),散列出一串数据;

第二步:再用1的私钥对这串数据加密,这就是前面所说的“签名”;

第三步:1把这个新的交易和签名信息向比特币网络广播,网络上的节点收到这个广播后,就拿1的公钥去验证签名,验证通过就说明这笔交易确实是1主动发给2的,那大家就“同意”2拥有了这笔比特币,既然整个比特币网络的人都认为2拥有了这笔比特币,那2当然就拥有了这笔比特币,交易也就完成了。

这样,既验证了A拥有这4亿聪,又验证了A真的是要把这4亿聪发给B和C,这时候,这个交易就确定无疑了。当然,它发给B和C也会构造一个锁定脚本,B和C要拿到比特币,当然也要拿他们的解锁脚本去对一对。比特币的所有交易就是以这种方式全部串了起来。

最后,我们来回答0618留下的问题: 为什么比特币不直接用公钥转换成地址,而是要哈希一下?

其实答案的一半在0618里提到过,因为从公钥反推私钥,虽然难,但以后不一定不可行。所以,应该尽量不暴露公钥。在比特币的交易过程中,A发送比特币给B,我们必须要知道B的地址才能发送,如果以公钥或等价于公钥的数据做地址,那公钥肯定要暴露。哈希一下,就不会了,因为哈希是不可能反推的。这样做,避免了B暴露了公钥,但A在交易过程中必须要提供自己的公钥啊,那怎么办呢?

比特币用了一个奇特的找零机制,叫做UTXO。 我们来看看。

假如地址A上有4个比特币,现在要转3个比特币给地址B,这个过程可不是简单地在地址A扣掉3个,在地址B加上3个。A上面的4个比特币,在转了3个给B之后,剩下的1个也不在A上了,而是转到了A所在的钱包自动生成的另外一个新地址C上了,就好像我拿100块买东西,商家又找回我50块。 所以,虽然A的公钥暴露了,但只要进行一笔交易,A上的比特币就全没了,剩下的比特币会转到属于同一个主人的地址C。

因此,为了安全起见,我们不应该重复使用同一个比特币地址,也就是说,A地址用过了,A的公钥暴露了,就不要再用A的地址来收款。当然,目前要从公钥反推私钥,现实中还是不可能的。所以现在大家并没有严格做到这一点,比如在交易所充值,交易所给每个用户基本都是一个固定地址不变。