比特币地址的生成过程

今天我们先看如何从操作系统获得随机数
获得随机数的文件是: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

网友评论