比特币原理分析的密钥管理 (openssl ecc)

简介

比特币的私钥使用的是椭圆曲线算法生成的密钥对。 程序首次启动默认配置的情况下生成101对密钥对。 可通过keypool进行配置。

生成过程

获取当前的时间戳(非windows系统),然后 1)调用OpenSSL的RAND_add,通过时间戳字节数进行混合计算进入PRNG state,让这个私钥前32个字节的数字无法预测; 2)使用操作系统的提供随机伪设备(Linux的/dev/urandom),再次随机生成32个字节的数据。 3)将这些数据通过哈希算法进行计算,最后使用其中的前32个字节,作为私钥。 使用椭圆曲线算法,将私钥对应的公钥生成出来,并签名验签。 然后将公钥哈希和私钥作为键值对存储到一个map中,如果钱包被加密过,需要解锁才能使用这个功能,解密后,然后使用对称加密算法AES对整个密钥对集合进行加密。 最后将密钥对等信息持久化到wallet.dat的数据库中。

扩容特点

创建交易 :在创建交易的时候,正常情况下,需要找零,这个时候程序会在自己的钱包中,挑选一个私钥的公钥地址作为找零地址。此时如果钱包未锁定,会自动扩容。

rpc : 调用keypoolrefill指令,可以手动扩容钱包的私钥个数,如果给定的参数小于目前的钱包私钥池(未使用的)的私钥数,不作为。

挖矿: 挖矿的时候,在生成coinbase交易的时候,需要写入自己的钱包地址,这个时候其动作与创建交易类似,也会自动扩容

优点

钱包在未加密,或者已经解密的情况下会自动扩容(没有足够的私钥),不需要维护。

 

缺点

对于联盟链,如果某个节点中的私钥太多,wallet.dat会非常大,启动会非常缓慢等。

猜你喜欢

转载自blog.csdn.net/guoguangwu/article/details/88854255