Skip to content

Latest commit

 

History

History
73 lines (52 loc) · 2.52 KB

key.h.adoc

File metadata and controls

73 lines (52 loc) · 2.52 KB

比特币源码分析之秘钥

这里的秘钥是指椭圆加密算法的秘钥.
(椭圆曲线加密算法类似于RSA,是非对称加密的一种,也是比特币地址使用的算法)
秘钥包含公钥和私钥.私钥可以推出公钥,公钥不能推出私钥.
在比特币钱包中,我们最常见的34字符钱包地址(:1F1tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX),
就是秘钥(CKey)的公钥(CPubKey)的引用(CKeyID),经过base58编码得到的.
key.h和key.cpp主要实现了秘钥相关类:CKey,CKeyID,CPubKey.

1. CKey 秘钥类

秘钥主要实现在CKey类CKey类包含了对OpenSSL的椭圆曲线秘钥EC_KEY的封装,以及一些签名和校验等操作.
Table 1. CKey 类变量
重要变量 解释

EC_KEY *pkey

CKey类的主要数据是pKey

fSet

只要设置了公钥或者私钥,fSet都会设置为true.当然私钥可以推导出公钥.

fCompressedPubKey

公钥是否被压缩

Table 2. CKey 主要方法

方法名称

解释

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)

验证紧缩签名

2. CPubKey 公钥类

CPubKey实现了对公钥的封装

3. CKeyID类

CKeyID是对CKey类的引用
具体实现是:
   首先,序列化CKey的公钥;
   然后,用HASH160计算一次散列值作为CKeyID

4. CScriptID

类似于CKeyID.
CKey是钱包地址的一种,CScript是地址的另一种.
todo ....