比特币源码阅读(0.16)(十五)

rpcdump.cpp::importprivkey和dumpprivkey

私钥可以以许多不同的格式表示,所有这些都对应于相同的256bit的数字。其中十六进制和原始的二进制格式用在软件的内部,很少展示给用户看。WIF格式用于钱包之间密钥的输入和输出,也用于代表私钥的二维码(条形码)。

WIF就是在长度64的16进制串对应的字节串前加上前缀0x80,再用Base58Check编码。WIF-compressed就是在64位16进制串对应的字节串前加上前缀0x80,并加上后缀0x01,再用Base58Check编码。私钥是非压缩的,也不能被压缩。WIF-compressed实际上只是表示“用于生成压缩格式公钥的私钥”,而“非压缩格式私钥”用来表明“用于生成非压缩格式公钥的私钥”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CBitcoinSecret::SetKey(const CKey& vchSecret)
{
assert(vchSecret.IsValid());
SetData(Params().Base58Prefix(CChainParams::SECRET_KEY), vchSecret.begin(), vchSecret.size());
if (vchSecret.IsCompressed())
vchData.push_back(1);
}

std::string CBase58Data::ToString() const
{
std::vector<unsigned char> vch = vchVersion;
vch.insert(vch.end(), vchData.begin(), vchData.end());
return EncodeBase58Check(vch);
}

dumpprivkey命令会导出WIF格式的私钥,这个私钥必须已经存在于钱包中,可以用getnewaddress命令生成新的私钥;importprivkey则将WIF格式的私钥导入到钱包中。

类图

importprivkey顺序图

dumpprivkey顺序图