[blockchain-009]比特币的本质-004 密钥对-公钥和私钥的源码分析

私钥和公钥

[1] pubkey.h 和pubkey.cpp
  [1.1] CkeyID #是unint160,是公钥的Hash160,也可以视为比特币钱包的地址.  unint160,就是160个二进制0/1组成的无符号整数,160/32=5个,也就是5个四字节无符号整数组成的数据结构. 其他以此类推. unint160继承arith_uint256.h的第25行 base_uint数据结构, 这个数据结构是一个范型类. 在uint256.h里,class uint160 : public base_blob<160> ,其他以此类推.
  [1.2] CPubKey #公钥的封装. 公钥的长度,可能是65个字节也可能是33个字节.
    [1.2.1] CKey::GetPubKey函数 # CPubKey在key.cpp里被这个函数调用. 这个函数,根据私钥,创建公钥, 调用了函数secp256k1_ec_pubkey_create, 然后再将结果序列化给CPubKey实例.

[2] Key.h和Key.cpp
  [2.1] CKey # 私钥的封装类, 获得私钥, 是函数 GetPrivKey 
    [2.1.1] GetPrivKey #私钥的长度是279个二进制, 创建私钥的函数是ec_privkey_export_der. 这个函数,是从secp256k1项目里直接复制过来的. 私钥是非对称加密的起点,需要知道代码在哪里创建了私钥.
        [2.1.1.1] wallet/wallet.cpp #第236行调用GetPrivKey, 对应的函数是AddKeyPubKeyWithDB
          [2.1.1.1.1] AddKeyPubKeyWithDB # 在wallet.cpp第154行被调用, 调用函数是GenerateNewKey. 也就是创建一个新Key.
            [2.1.1.1.1.1] GenerateNewKey # 在wallet.cpp第3426行被调用, 调用函数是 GetKeyFromPool, 从池里获取key,如果池里没有key,就生成一个新Key.

              [2.1.1.1.1.1.1] GetKeyFromPool # 在wallet.cpp第3940行,被CreateWalletFromFile调用. 最终追踪到InitLoadWallet,然后到init.cpp,也就是启动的时候,对钱包进程初始化.钱包初始化, 如果没有密钥对,就生成一个私钥再生成公钥再生成钱包地址.

由此, 私钥和公钥的机制就清晰了.

没有更多推荐了,返回首页