感谢在菜菜子等指导下,这是本人比特币源码研读第一篇。
私钥
私钥实际上是256位0或1组成的一串数字,范围是2的256次方,因为数量太大,无法遍历。但是私钥不能随意就找个256位的数字,必须通过足够安全的随机性算法来计算出来,否则很容易被黑客暴力撞中。但由于无法做到真的随机,只能依靠伪随机算法(PRNG)等方法接近真随机性来得到足够安全的随机数,再对随机数进行一次sha256哈希运算计算出私钥。
代码分析:
在key.cpp文件中,私钥通过调用GetStrongRandBytes方法来生成。
再查看random.cpp文件这个方法具体实现:
从这段源码可以看到随机数有几个来源,首先通过OpenSSL RNG拿到一个随机数,第二个来源是操作系统本身的随机数,如果硬件允许的话还可以加上硬件底层编程获取的随机数作为第三个来源。接着就把这些随机数合起来算出哈希值,这样得出的值才有可能作为一个私钥。
其中第三个来源GetHWRand是去年17年新加的方法,当时的github提交改动是(https://github.com/caiklaus/bitcoin/commit/b63be2c6852f055e60185aea93ceb4a1ef798c40#diff-35f8a407f8c21cda300a45f50b6e9c74)。在新增的方法里,可以看到__asm__这样的内嵌汇编命令,用来获取硬件底层的随机数。
由此可见,随机对于私钥的安全有多重要,难怪有人把随机比喻成比特币的“命根子”。
(http://www.8btc.com/random)
作者:区块链研习社比特币源码研读班,caiklaus