主页 > imtoken官网地址打不 > 比特币源码研读 Go语言中文网站
比特币源码研读 Go语言中文网站
上面《比特币btcd代码初体验》中提到,除了主网,比特币还有Testnet和Regtest网络。
Testnet是一个公共测试网络,所有开发者都可以访问这个网络。 为了避免恶意囤积测试网比特币,这个测试网会每隔一段时间清空一次,重新启动一个新的创世块。 这应该也是代码中有时会看到testnet3的原因。
Regtest 是本地测试网络。 该网络不会对外公开,仅用于本地开发和测试。
此外还有隔离见证测试网Segnet。 在btcd代码中,还可以看到simnet的测试网络选项。 外观上和Regtest一样是本地测试网,具体区别没有深入研究。
本文主要从btcd的相关代码入手,研究如何生成比特币的私钥、公钥和地址。 详见《精通比特币》第二版(中文版)。 简单的说:
第一步也是最重要的一步是从随机数生成私钥。 比特币软件使用操作系统底层的随机数生成器生成 256 位的熵,称为私钥。
在第二步中,可以通过椭圆曲线乘法从私钥计算出公钥。
第三步,根据公钥计算出比特币地址。
以下代码是从《告白比特币——使用Golang在比特币区块链上存储誓言》中复制过来的代码
分析如下:
随机数和私钥
privKey,错误:= btcec。 NewPrivateKey(btcec.S256())
首先,在之前clone的btcd代码中,有一个叫做btcec的模块,实现了比特币需要的椭圆曲线密码算法。 S256 返回实现 secp256k1 标准的特殊椭圆曲线。 再看NewPrivateKey的实现细节,发现在crypto包中传入了一条椭圆曲线和一个随机数生成器。
这段代码直接返回私钥和公钥,即上面的第一步和第二步。 需要注意的是,这段代码中的key是一个PrivateKey类型的对象,里面有变量存放公钥。
这只是与比特币源码学习(一)——私钥篇的对比。 可以发现在C++版本中,随机数生成的随机性应该更强一些比特币源码研读,因为它同时使用了几个不同的随机源。 ,而Golang版本只使用软件提供的rand方法。 这可能存在潜在的隐患。 如果软件在某个环境下的随机数分布不平衡,随机数算法会在某个区域选择一个高概率的随机数。 那么2^256的理论范围就会大大缩小,从而增加随机碰撞的可能性。
世界互联网论坛
privKeyWif,错误:= btcutil.NewWIF(privKey,&chaincfg.MainNetParams比特币源码研读,false)
继续看代码,这句话是用钱包导入格式(WIF)来表达256位私钥。 同一个256位数字私钥通过不同的编码可以有不同的表示,WIF就是其中一种格式。
相同的密钥,不同的格式
需要注意的是,这里使用了属于同一个btcd项目的btcutil代码,可以看作是一个通用包。
地址
pubKeyAddress,错误:= btcutil.NewAddressPubKey(pubKeySerial,&chaincfg.MainNetParams)
类似于私钥的WIF,可以通过一些算法计算出公钥的地址。 详见《精通比特币》中的解释。
如何从公钥生成比特币地址
这样就生成了一个符合规则的比特币地址和私钥,大家可以上网查看地址格式是否正确。