当我们接收别人的比特币转账的时候,需要给对方的那一串看似杂乱无章的字符串就是比特币地址了。那么,它的底层基本原理是什么呢?为什么不直接用公钥接收比特币而是使用地址呢?为什么使用地址的最佳实践是每次转账都换一个新地址呢?

基本原理

先来聊聊地址的基本原理,聊聊地址是如何生成的,为何用私钥就能转走地址中的币。

地址是从私钥经过多步运算得出的。比特币采用的是椭圆曲线密码学,私钥是随机选出的,私钥通过椭圆曲线密码学可以运算出公钥,公钥经过两次哈希运算就得了地址,所有的运算步骤的算法都是公开的,同时也是单向的。根据地址反推公钥是很难的,根据公钥反推私钥也是很难的。注意,密码学语境中的“很难”,指的是理论上可以实现,但是实际中不可能实现。当然,比特币地址也分成不同类型,常见有两种:一种是 Pay-to-PubKeyHash (P2PKH) ,也就是公钥哈希地址。另一种是 Pay-to-ScriptHash (P2SH),也就是脚本地址。后续讨论,我们都以第一种情况为主。

比特币的基本转账原理是用私钥签署交易来授权转账。如果,我想把和我地址相关的比特币转给你,只需要我向全网证明我是地址对应的私钥的持有者即可。每次转账,我公布给全网的是公钥以及这次转账的数字签名。公钥和数字签名可以在不暴露私钥的情况下,让全网相信我的确持有私钥。私钥可以算出公钥,而地址是公钥的哈希,所以私钥和地址的联系也是明显的。

这就是比特币地址的基本原理了。

为何用地址收款而不用公钥?

现在,我们思考这样一个问题,为何比特币系统要发明地址这个东西,而不是直接用公钥来进行收款呢?

地址会让我们的币更安全。当我们接收比特币的时候,唯一需要暴露给网络的就是我们的地址。注意,根据地址是不能反推公钥的,所以如果我的地址只是收了一次款,那么就不会有任何其他人知道我的公钥。虽然当代密码学能够运行的基础是相信根据公钥是很难运算出私钥的,但是毕竟公钥跟私钥是有明确的数学联系的,所以有了公钥再去获得私钥需要的运算能力也会大幅度的降低。所以使用地址而非公钥来收款会让系统更安全。假设未来计算机有了跨越式发展,比特币使用的椭圆曲线密码学被破解,地址中的币也很难被偷走。

以上就是我个人对地址存在意义的思考,很可能不全面甚至也有可能理解有偏差的,我保留随时纠正自己的权利。

地址为何只用一次

比特币地址的设计初衷就是让大家每次使用后就换一个,这就是为什么很多钱包软件每次都会生成不同的地址给我们。

首先,如果我用地址对外转账,那么就需要签署交易并公布公钥。根据前面的讨论,公钥暴露会降低比特币地址的安全度。同时,更重要的是如果数字签名不是在离线情况下进行的,那么很有可能私钥本身也不是完全安全可信的。

其次,即使多次使用同一地址收款也是不好的,因为会降低隐私。比特币的所有交易数据都是公开可追溯的,一旦某一次交易的时候,我们暴露了自己的肉身信息,那么坏人就能确认这个地址是属于谁。坏人可以直接查看到这个地址中的余额总数,有可能带来人身安全问题。关于这个方面,Bitcoin Wiki 上有专门的一篇文章 https://en.bitcoin.it/wiki/Address_reuse 进行了深入的讨论。

总之,最佳实践是每个地址只用一次。如果涉及到找零的话,可以设置一个专门的找零地址。

总结

关于比特币地址的原理和使用注意事项,我们就聊到这里。需要记住的重点信息是:第一,根据私钥可以推算出地址,所以可用私钥来转出地址中的币。第二,地址不会暴露公钥,公钥一旦暴露,这个地址的安全度就降低了。第三,反复使用同一地址会降低安全和隐私,所以地址每使用一次就要更换。

参考: