主页 > imtoken官网地址打不 > 比特币源码研读 Go语言中文网站

比特币源码研读 Go语言中文网站

imtoken官网地址打不 2023-06-11 08:03:50

上面《比特币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,可以通过一些算法计算出公钥的地址。 详见《精通比特币》中的解释。

易语言比特币源码_比特币源码研读_比特币交易平台源码

如何从公钥生成比特币地址

这样就生成了一个符合规则的比特币地址和私钥,大家可以上网查看地址格式是否正确。