我们提到了钱包为用户自动生成了地址、公钥、私钥,并且在这篇文章中,我们讲解了什么是地址、地址用来做什么:地址就是用户的银行账号,用户通过地址来交易比特币。
既然用户用地址就能交易,那公钥和私钥还有什么用?
我们需要知道的是,从09年至今,全球所有的交易记录是所有人可见的。交易记录中包含有交易流水单号、发币人的发币地址、收币人地址、发币人的找零地址。也就是说,全球所有用户的地址都是可以被任何人知道的。既然如此,如果中本聪在设立比特币机制时,仅仅通过告诉钱包地址是多少的方式就能完成交易的话,那么整个交易机制是不安全的,我可以随便用别人的地址假装是自己的地址,来和别人交易。
于是,在整个机制中,有了私钥和公钥的概念。
私钥用来证明这笔交易的发起人确实是比特币的所有者。私钥是一串很长的随机数比如:
4KeZdDEu11z3gPrtuX3phjwGnNP4RFd7yyrCVC1j2WLBB9ZXMCJ是由钱包替用户随机生成的。私钥一定不能曝光给别人,因为一旦让别人知道私钥,别人就可以轻松将你的比特币转走,并且再也拿不回来。(所以我们用钱包交易的前提,是信任钱包不会盗取我们的私钥)公钥是由私钥通过算法生成,通过私钥可以计算出唯一一个公钥。但公钥并不能逆向推导出私钥。
顺便提一下,地址是由公钥通过算法生成,通过公钥可以计算出唯一一个地址。但地址并不能逆向推导出公钥。
中本聪设计了如下机制:钱包需要先将私钥通过加密算法A加密,再将加密之后的字符串(我们把叫做签名)、公钥一并发送给矿工。矿工收到信息后,将签名、公钥带入到一个验证函数F中,如果得出的结果为true,那么矿工就认为这个交易发起人确实是持币者发起的。
回到交易流程中:钱包用张三的私钥通过加密算法生成了一段加密过的私钥,然后与公钥一并写到了交易信息里,再发给全球矿工。此时,矿工收到了这笔交易信息,信息里包含:交易流水单号、发币人地址、收币人地址、发币人提供的加密过的私钥、发币人的公钥。矿工将加密过的私钥、公钥带入上面提到的公式中,等待程序验证。如果程序反馈给矿工"true",那么即可表明,这笔交易确实是持币者发起的了。如果程序反馈给矿工"false",那么说明这笔交易存在问题,不能被验证通过。
这样的话,张三不需要将自己的私钥发给矿工,既能让矿工简单地验证这笔交易是否由持币者发起,又能保证自己的私钥不外泄了。