比特币源码研读(23)-地址,密钥(1)

2018-04-29  本文已影响83人  electroman

比特币地址的生成过程

今天我们先看如何从操作系统获得随机数

获得随机数的文件是:random.h,random.cpp

其中GetStrongRandBytes函数为获得系统随机数的函数

比特币程序通过三种方法获得随机源:1 从OpenSSL中获得;2 从OS 中获得;3,从硬件中获得

其流程如下:

第一个随机源的获得

   // First source: OpenSSL's RNG

   RandAddSeedPerfmon();

   GetRandBytes(buf, 32);

   hasher.Write(buf, 32);

函数RandAddSeedPerfmon是从设备的dev/urandom中获得种子,如果是linux系统,则不需要执行这个函数

   GetRandBytes(buf, 32);函数实现如下:

void GetRandBytes(unsigned char* buf, intnum)

{

   if (RAND_bytes(buf, num) != 1) {

       RandFailure();

    }

}

其中RAND_bytes函数是获得一个随机数的函数

第二个随机源的获得

   // Second source: OS RNG

   GetOSRand(buf);  得到系统熵的32位数据

hasher.Write(buf,32);

第三个随机源的获得

   // Third source: HW RNG, if available.

   if (GetHWRand(buf)) {

       hasher.Write(buf, 32);

}

这个是可选项,如果能获得硬件随机源,则加入这个种子,提高随机性

合并随机源

   // Combine with and update state

    {

       std::unique_lock lock(cs_rng_state);

       hasher.Write(rng_state, sizeof(rng_state));

       hasher.Write((const unsigned char*)&rng_counter,sizeof(rng_counter));

       ++rng_counter;

       hasher.Finalize(buf);

       memcpy(rng_state, buf + 32, 32);

}

输出随机数

   // Produce output

   memcpy(out, buf, num);

   memory_cleanse(buf, 64);

区块链研习社比特币源码研读班  electroman

QYB地址:QVR2eUwbx43YMkWjbaAQCYdoDmpC1ohnRk

上一篇 下一篇

猜你喜欢

热点阅读