若是你仍然未对Python语言的强大功能感到惊讶,那么在这部分咱们将学习如何在python中开发比特币地址或钱包。我只是想说与你的计算机通讯是多么容易,若是你经过python和Linux操做系统,能够用它作多少有趣的项目。php
在本文中,我将分析Electrum的源代码,这是纯粹用Python编写的比特币钱包,它应该适用于任何python 2.x,我相信即便使用python 3.x包,默认状况下,全部依赖项该软件使用的是默认包。所以,不须要额外的软件。java
免责声明:使用此代码和信息须要你自担风险,对于因使用修改后的代码而致使的任何损害,以及本文中提供的信息,我概不负责。若是你不知道本身在作什么,建议不要修改生成私钥的代码!node
我从Github下载了最新版本的Electrum源代码:python
https://github.com/spesmilo/electrum/releases/tag/2.8.3android
种子生成器文件基本上位于lib中,它名为mnemonic.py
,函数是make_seed()
,它是这段代码:git
你也能够经过内部命令从终端实际调用。因此,若是你安装了Electrum,那么它是这样的:程序员
electrum make_seed --nbits 125
安装Electrum后,将为你建立125位种子,但你也能够经过另外一个python文件调用该助记符脚本,并自定义它(例如生成多个,或将其与其余代码集成)。github
咱们将建立一个名为testcall.py
的新文件,咱们将在其中调用此助记符代码,但它必须位于同一个lib文件夹中。它看起来像这样:web
若是咱们使用python testcall.py
命令从终端调用它:mongodb
基本上咱们从mnemonic.py
文件中导入Mnemonic
类,只是将其称为助记符。我尚未谈过类,它们位于Python语言的更高级部分,基本上它们是将函数绑定在一块儿的对象。这里的make_seed()
函数包含在Mnemonic
类中,并经过它与其余依赖于其余函数的函数一块儿调用。它只须要1个函数就能够完成,可是像这样使用它更优雅,更不容易出错,由于它能够处理异常。我不是一个很好的Classes
专家,因此我就这样吧。
在Mnemonic
类中,能够定义1个参数,即语言,它具备如下值:
你能够在i18n.py
文件中看到国家/地区代码,但只有这些代码列表如今可用,在wordlist文件夹中可见。若是你建立中文种子,只需用国家代码替换该参数:
print Mnemonic('zh').make_seed('standard', 132, 1)
你还能够生成多种类型的种子,你能够在version.py
文件中看到:
Segregated Witness softfork
的比特币地址。num_bits
变量,它使用nbits
命令从命令行调用,基本上只是你的种子将拥有的位数熵(建议安全性最小值为128)custom_entropy
,基本上只是一个整数,可使用该整数乘以种子数,以防你的RNG很差,这将用你自定义生成的数字替换密码的一部分,具备相同的熵大小。所以,若是我这样称呼它,我选择了一个自定义熵数,这将以这种方式生成种子,固然熵数也必须是一个秘密:
print Mnemonic('en').make_seed('standard', 132, 2349823353453453459428932342349489238)
我真的不建议使用这个代码,它看起来有点奇怪,我不是加密专家,但我只是不喜欢这如何将熵插入你的数字。我据说乘数会减小熵,因此我不肯定代码的这一部分。事实上,我将向开发者发送关于此问题的信息,看看他对此有何回应。可是不用担忧,默认钱包生成不会调用自定义熵部分,所以若是你经过GUI在Electrum中生成钱包,或者将其保留设置为1,那么无需担忧。
好了,如今咱们知道如何生成种子,让咱们看看种子生成器究竟作了什么。毕竟使用Electrum的全部人都必须依赖此代码的安全性和完整性,不然若是这些代码被写得很糟糕,你可能会损失全部的钱。所以,若是咱们想在Electrum中存储大量比特币,咱们必须100%信任此代码。那么让咱们分析吧。
那么让咱们分析一下make_seed()
函数,这就是动做的位置,首先我会在其中放入许多打印代码,以便在每一步打印出每一个变量:
基本上我只是在每一步打印出每一个变量。好的,咱们使用python testcall.py
命令从testcall.py
文件中调用make_seed()
函数。testcall文件是这样的:
print Mnemonic('en').make_seed('standard', 132, 1)
只是一个标准的种子生成,它打印出来:
好吧,让咱们一步一步来。
version.py
,其中文件的代码是,它基本上将该standard
参数转换为01
,后者将成为种子的前缀。因此它将前缀设置为01
字符串。bwp
(每一个字的位数)变量取字列表长度的log2值,个人意思是那里有多少个单词,在这种状况下是英文列表:english.txt
。英语列表中有2048个单词,其中log2为11。num_bits
除以bwp
并向上舍入,转换为整数并再次乘以bwp
。我不知道为何这是必要的,由于它给出了相同的值,我想这只是某种预防措施。custom_entropy
保留为默认值1,则n_custom
将变为0,所以不会添加额外的熵。n
若是没有添加自定义熵,它仍然与num_bits
输入相同。n
变量就会成为主数,其中包含你最初经过num_bits
定义的熵量。所以,在咱们的状况下它保持等价,由于咱们不添加任何东西。my_entropy
将只选择0到2的n次方之间的随机数,其中n
是同名的n
,因此它将是一个很大的数字,这是种子的原型。01
开头的随机数,它将做为种子的校验和。0
,那么基本上咱们只需将my_entropy
数加1,直到前2位变为0
和1
.实际上它的前2位是hash格式。因此发生的是它用mnemonic_encode(i)
对其进行编码,并在用mnemonic_decode(seed)
对其进行解码以后,我猜想是否能够用单词编码,不然会产生一些错误。这就是assert
命令所作的,它会测试错误。is_new_seed()
函数,若是你如今生成一个种子,若是你以旧格式导入旧种子而后它进入旧函数。可是我上面执行的这段代码进入了新功能。这就是奇迹发生的地方。is_new_seed()
函数实际位于bitcoin.py
文件中:mnenonic.py
文件中的normalize_text()
函数对种子进行规范化,我认为中文或其余奇怪的语言会被转换成我认为的ASCII文本。因此这个功能与英文单词列表并很少。01
,由于咱们称之为标准钱包。Electrum将标准钱包定义为种子,其种子版本的HMAC-SHA512以01
开头,一个Segwit钱包,其编码种子版本的HMAC-SHA512以02
开头等等......因此基本上循环增长my_entropy
变量1
直到在咱们的例子中,它给出的使用Seed
版本编码的HMAC-SHA512的单词列表以01
开头。在找到该数字后,它退出循环,并返回种子。就是这样,这就是Electrum生成种子的基本方式。这个种子的HMAC-SHA512总和将从01
开始,你甚至能够本身检查。因此在Linux中你能够安装一个名为GTKHash的工具来计算哈希值,因此让我演示一下,咱们取种子,而后添加HMAC消息种子版本,如该函数所定义:
所以,能够看到咱们是否将HMAC消息Seed版本与种子一块儿添加,它为咱们提供了以01
开头的512位hash,所以在这种状况下,这是与Electrum兼容的有效默认种子。
固然HMAC系统是牢不可破的,特别是它的512位版本多是量子计算机抗性的,所以没有办法对该系统的种子进行逆向工程。
可是有一个问题,若是咱们修复十六进制格式的前两个字符,显然HMAC-SHA512输出是十六进制格式,那么就会失去熵。
这就是为何咱们从132位的熵开始,由于咱们丢失了大约4位的熵,所以最后的输出只有128位的熵,这是咱们想要的默认状况,使用128位的安全熵,事实上,鉴于计算机的强大功能,建议如今使用120位以上。
因此咱们从132位开始,因为修复了前2个字符,咱们丢失了一些位,而后咱们保持128位,这在计算上是安全的。为了暴力破解这须要超级计算机经过2128种组合,这几乎是不可能的,由于地球上没有足够的能量来经历那么多组合,事实上有些人说你甚至不能算到这个数字范围,更不用说hash和其余内存密集型操做。
看起来Electrum能够安全使用。它已经过个人审核,虽然我不是加密专家,但从我研究和学习它看起来对我来讲是安全的。
我仍然对custom_entropy
事情持怀疑态度,我应该问一下dev究竟作了什么,但除此以外,默认钱包生成是天衣无缝的。我认为没有后门。
毕竟成千上万的人都使用Electrum,特别是那些持有大量的人,因此最好安全使用,并且在我看来是这样。
我在本文中分析了它的主要种子生成代码。固然代码远不止这些,可是咱们已经知道若是你在离线计算机上使用它生成种子,它应该是安全的。如今我没有查看它的网络相关部分,但我相信它们是安全的。
======================================================================
分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:
- java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行帐号建立、交易、转帐、代币开发以及过滤器和交易等内容。
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括帐户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
- EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、帐户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
- java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如建立地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如建立地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- tendermint区块链开发详解,本课程适合但愿使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。
汇智网原创翻译,转载请标明出处。这里是原文Electrum比特币钱包的代码分析