主页 > imtoken苹果版下载官网怎样下载 > 比特币源码学习----密钥和地址

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

1、基本概念

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

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

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

2、我们来体验一下地址生成过程

//启动单机测试链

./bitcoind -regtest &

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

./bitcoin-cli -regtest getnewaddress ethan

外国的比特币便宜中国的比特币贵为什么?_比特币期货对比特币影响_比特币密钥多长

//查看地址对应的私钥

./bitcoin-cli dumpprivkey 2MyVDtxTHnoFzPRZ5DhvfeBADfiAjw2JrCp

//查看地址的所有信息

./bitcoin-cli getaddressinfo 2MyVDtxTHnoFzPRZ5DhvfeBADfiAjw2JrCp

地址:一个有效的比特币地址

比特币期货对比特币影响_比特币密钥多长_外国的比特币便宜中国的比特币贵为什么?

scriptPubKey:地址加密的十六进制字符串

script:输出脚本类型

见证程序:数字签名的十六进制形式

pubkey:本地十六进制公钥

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

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

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

比特币期货对比特币影响_比特币密钥多长_外国的比特币便宜中国的比特币贵为什么?

获取新地址()

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

GetKeyFromPool()

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

MakeNewKey()

在 GenerateNewKey() 中,创建了一个 CKey 类型的新对象。我按照软钱包流程比特币密钥多长,调用接口 MakeNewKey() 获取强随机数。随机数是经过验证的,即有效的私钥。

外国的比特币便宜中国的比特币贵为什么?_比特币期货对比特币影响_比特币密钥多长

获取公钥()

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

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

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

设置地址簿()

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