这里的秘钥是指椭圆加密算法的秘钥.
(椭圆曲线加密算法类似于RSA,是非对称加密的一种,也是比特币地址使用的算法)
秘钥包含公钥和私钥.私钥可以推出公钥,公钥不能推出私钥.
在比特币钱包中,我们最常见的34字符钱包地址(如:1F1tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX),
就是秘钥(CKey)的公钥(CPubKey)的引用(CKeyID),经过base58编码得到的.
key.h和key.cpp主要实现了秘钥相关类:CKey,CKeyID,CPubKey.
秘钥主要实现在CKey类。
CKey类包含了对OpenSSL的椭圆曲线秘钥EC_KEY的封装,以及一些签名和校验等操作.
重要变量 | 解释 |
---|---|
EC_KEY *pkey |
CKey类的主要数据是pKey |
fSet |
只要设置了公钥或者私钥,fSet都会设置为true.当然私钥可以推导出公钥. |
fCompressedPubKey |
公钥是否被压缩 |
方法名称 |
解释 |
void MakeNewKey(bool fCompressed) |
随机产生新的秘钥.参数fCompressed 是否压缩公钥 |
bool SetPrivKey(const CPrivKey& vchPrivKey) |
设置私钥为参数给定私钥 |
bool SetSecret(const CSecret& vchSecret, bool fCompressed = false) |
根据参数vchSecret生成秘钥, 类似于脑钱包的功能 |
CSecret GetSecret(bool &fCompressed) const |
获取私钥对应的参数 |
CPrivKey GetPrivKey() const |
获取私钥 |
bool SetPubKey(const CPubKey& vchPubKey) |
设置公钥 |
CPubKey GetPubKey() const |
获取公钥 |
bool Sign(uint256 hash, std::vector<unsigned char>& vchSig) |
对hash进行ECDSA签名,结果为vchSig |
bool SignCompact(uint256 hash, std::vector<unsigned char>& vchSig) |
紧缩签名,相对于上面的签名,改签名可以重建所使用的公钥 |
bool SetCompactSignature(uint256 hash, const std::vector<unsigned char>& vchSig) |
从紧缩签名重建公钥 |
bool Verify(uint256 hash, const std::vector<unsigned char>& vchSig) |
验证签名 |
bool VerifyCompact(uint256 hash, const std::vector<unsigned char>& vchSig) |
验证紧缩签名 |