美文网首页
比特币源码研读----密钥和地址

比特币源码研读----密钥和地址

作者: 诸葛循源 | 来源:发表于2018-09-22 17:07 被阅读0次

1、基本概念

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

    比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接收比特币,而私钥用于比特币支付时的交易签名。数字签名也称为见证(witness),用于支出资金的。

    支付比特币时,比特币的当前所有者需要在交易中提交其公钥和签名(每次交易的签名都不同,但均从同一个私钥生成)。比特币网络中的所有人都可以通过所提交的公钥和签名进行验证,并确认该交易是否有效,即确认支付者在该时刻对所交易的比特币拥有所有权。

2、我们动手体验一下地址的生成过程

//启动单机测试链

./bitcoind -regtest &

//用ethan的钱包,生成一个新的地址

./bitcoin-cli -regtest getnewaddress ethan

//查看地址对应的私钥

./bitcoin-cli dumpprivkey 2MyVDtxTHnoFzPRZ5DhvfeBADfiAjw2JrCp

//查看地址全部的信息

./bitcoin-cli getaddressinfo 2MyVDtxTHnoFzPRZ5DhvfeBADfiAjw2JrCp

address:有效的比特币地址

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

script:输出的脚本类型

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

pubkey:原生的十六进制公钥

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

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

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

getnewaddress()

前面还对钱包的有效性进行了校验,这里只贴出来后半部分的代码。新建CPubKey类型的对象。

GetKeyFromPool()

调用接口GetKeyFromPool()获取一个公钥,先尝试从密钥池中取预留的key,如果取不到,才会重新生成一个新的。链接钱包数据库,最后会把成功生成的公钥保存在数据库,并刷入磁盘。

MakeNewKey()

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

GetPubKey()

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

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

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

SetAddressBook()

将生成的二进制地址保存下来,EncodeDestination(dest)执行后,将数据还原为我们看到的地址形态。

相关文章

  • 比特币源码研读----密钥和地址

    1、基本概念 比特币的所有权是通过数字密钥、比特币地址和数字签名来确定的。数字密钥实际上并不存储在网络中,而是由用...

  • 比特币源码研读

    forest21000版 比特币源码研读之一比特币源码研读之二比特币源码研读之三比特币源码研读之四比特币源码研读之...

  • 比特币源码研读之一

    作者:区块链研习比特币源码研读班 菜菜子 一、源码下载 本文比特币源码下载地址为:https://github.c...

  • 比特币源码研读(23)-地址,密钥(1)

    比特币地址的生成过程 今天我们先看如何从操作系统获得随机数 获得随机数的文件是:random.h,random.c...

  • 比特币源码研读一:椭圆曲线在比特币密码中的加密原理

    参加比特币源码研读班后首次写作,看到前辈black写的有关密钥,地址写的很好了,就选了他没有写的椭圆曲线,斗胆写这...

  • 比特币源码研读之一

    比特币源码研读之一——区块链研习社 《比特币源码研读班》 一看文件夹结构 和 github编译依赖,分析的依赖库 ...

  • 比特币源码研读之十一

    比特币源码研读系列已经发表了十篇了,通过这十篇源码研读系列让我对比特币源码及比特币运行原理有了进一步的理解,也让我...

  • 比特币源码研读之密钥篇

    这是我的第五篇研读记录,抽空写了点欢迎拍砖。 首先讲一下私钥、公钥、地址的关系 私钥通过椭圆曲线相乘推出公钥,公钥...

  • 《精通比特币》(4)

    第四章 密钥 地址 钱包 比特币的所有权是通过数字密钥,比特币地址和数学签名来确认的。数字密钥不是储存在网络中,而...

  • Mastering Bitcoin

    目录 1 介绍 2 比特币如何工作 3 比特币Client 4 密钥、地址、钱包 5 事务(交易) 6 比特币网络...

网友评论

      本文标题:比特币源码研读----密钥和地址

      本文链接:https://www.haomeiwen.com/subject/mhjxoftx.html