主页 > imtoken冷钱包手机版 > 比特币源码学习----密钥和地址

比特币源码学习----密钥和地址

imtoken冷钱包手机版 2023-01-17 13:39:00

1、基本概念

比特币的所有权由数字密钥、比特币地址和数字签名决定。数字密钥实际上并不存储在网络中,而是由用户生成并存储在钱包文件(wallet.dat)或简单的数据库中。存储在用户钱包中的数字密钥完全独立于比特币协议,可以由用户的钱包软件生成和管理,无需参考区块链或访问网络。

比特币钱包包含一系列密钥对,每个密钥对包括一个私钥和一个从它派生的唯一公钥。公钥用于接收比特币,而私钥用于在支付比特币时签署交易。数字签名,也称为见证人,用于花费资金。

在支付比特币时,比特币的当前所有者需要在交易中提交他们的公钥和签名(每笔交易的签名不同,但由同一个私钥生成)。比特币网络中的每个人都可以通过提交的公钥和签名进行验证,并确认交易是有效的比特币有密钥怎么提取,即确认付款人拥有当时正在交易的比特币的所有权。

2、让我们亲手体验一下地址生成过程

//启动单机测试链

./bitcoind -regtest &

比特币有密钥怎么提取

//使用ethan的钱包生成新地址

./bitcoin-cli -regtest getnewaddress ethan

//查看地址对应的私钥

./bitcoin-cli dumpprivkey 2MyVDtxTHnoFzPRZ5DhvfeBADfiAjw2JrCp

//查看地址的所有信息

比特币有密钥怎么提取

p>

./bitcoin-cli getaddressinfo 2MyVDtxTHnoFzPRZ5DhvfeBADfiAjw2JrCp

比特币源码研读----密钥和地址_第1张图片

地址:有效的比特币地址

scriptPubKey:通过地址加密得到的十六进制字符串

脚本:输出脚本类型

witness_program:数字签名的十六进制形式

比特币有密钥怎么提取

pubkey:本地十六进制公钥

3、接下来,我们来阅读JSON-RPC接口对应的源码。我的源代码版本是0.16.3.

//文件路径:src/wallet/rpcwallet.cpp

//接口名称:static UniValue getnewaddress(const JSONRPCRequest& request)

比特币源码研读----密钥和地址_第2张图片@ >

getnewaddress()

之前也检查过钱包的有效性,这里只贴下半部分的代码。创建一个 CPubKey 类型的新对象。

比特币有密钥怎么提取

比特币源码研读----密钥和地址_第3张图片

GetKeyFromPool()

调用接口GetKeyFromPool()获取公钥,首先尝试从密钥池中获取保留的密钥,如果无法获取密钥比特币有密钥怎么提取,会重新生成一个新的。链接钱包数据库,最后将生成成功的公钥保存在数据库中并刷入磁盘。

比特币源码研读----密钥和地址_第4张图片

MakeNewKey()

GenerateNewKey()创建一个CKey类型的新对象,这里我通过软钱包流程调用接口MakeNewKey()获取强随机数,随机数经过验证,即有效私钥。

比特币源码研读----密钥和地址_第5张图片

比特币有密钥怎么提取

GetPubKey()

secp256k1应该是椭圆曲线算法,secp256k1_ec_pubkey_create()接口中的begin()是之前得到的私钥。运算结果验证后,返回值为公钥,然后调用接口AddKeyPubKeyWithDB()将公钥添加到数据库中。

LearnRelatedScripts() 和 GetDestinationForKey() 总是一起使用。前者通过公钥获取数字签名类型和交易脚本,后者对公钥进行hash160签名,即双哈希运算,得到比特币的二进制地址。

CTxDestination 数据类型包括:CNoDestination、CKeyID、WitnessV0ScriptHash、WitnessV0KeyHash 和 WitnessUnknown。不同类型对应不同的交易标准,保证节点之间的交易信息可以被识别:CKeyID---P2PKH、CScriptID---P2SH、WitnessV0ScriptHash---P2WSH、WitnessV0KeyHash---P2WPKH

比特币源码研读----密钥和地址_第6张图片

SetAddressBook()

保存生成的二进制地址。执行EncodeDestination(dest)后,将数据恢复为我们看到的地址形式。