Electrum比特币钱包的代码分析

栏目: Python · 发布时间: 5年前

内容简介:如果你仍然未对Python语言的强大功能感到惊讶,那么在这部分我们将学习如何在python中开发比特币地址或钱包。我只是想说与你的计算机通信是多么容易,如果你通过python和Linux操作系统,可以用它做多少有趣的项目。在本文中,我将分析Electrum的源代码,这是纯粹用Python编写的比特币钱包,它应该适用于任何python 2.x,我相信即使使用python 3.x包,默认情况下,所有依赖项该软件使用的是默认包。因此,不需要额外的软件。免责声明:使用此代码和信息需要你自担风险,对于因使用修改后的

如果你仍然未对 Python 语言的强大功能感到惊讶,那么在这部分我们将学习如何在python中开发比特币地址或钱包。我只是想说与你的计算机通信是多么容易,如果你通过python和 Linux 操作系统,可以用它做多少有趣的项目。

在本文中,我将分析Electrum的源代码,这是纯粹用Python编写的比特币钱包,它应该适用于任何python 2.x,我相信即使使用python 3.x包,默认情况下,所有依赖项该软件使用的是默认包。因此,不需要额外的软件。

免责声明:使用此代码和信息需要你自担风险,对于因使用修改后的代码而导致的任何损害,以及本文中提供的信息,我概不负责。如果你不知道自己在做什么,建议不要修改生成私钥的代码!

了解代码

我从Github下载了最新版本的Electrum源代码:

https://github.com/spesmilo/electrum/releases/tag/2.8.3

种子生成器文件基本上位于lib中,它名为 mnemonic.py ,函数是 make_seed() ,它是这段代码:

Electrum比特币钱包的代码分析

你也可以通过内部命令从终端实际调用。所以,如果你安装了Electrum,那么它是这样的:

electrum make_seed --nbits 125

安装Electrum后,将为你创建125位种子,但你也可以通过另一个python文件调用该助记符脚本,并自定义它(例如生成多个,或将其与其他代码集成)。

我们将创建一个名为 testcall.py 的新文件,我们将在其中调用此助记符代码,但它必须位于同一个lib文件夹中。它看起来像这样:

Electrum比特币钱包的代码分析

如果我们使用 python testcall.py 命令从终端调用它:

Electrum比特币钱包的代码分析

基本上我们从 mnemonic.py 文件中导入 Mnemonic 类,只是将其称为助记符。我还没有谈过类,它们位于Python语言的更高级部分,基本上它们是将函数绑定在一起的对象。这里的 make_seed() 函数包含在 Mnemonic 类中,并通过它与其他依赖于其他函数的函数一起调用。它只需要1个函数就可以完成,但是像这样使用它更优雅,更不容易出错,因为它可以处理异常。我不是一个很好的 Classes 专家,所以我就这样吧。

Mnemonic 类中,可以定义1个参数,即语言,它具有以下值:

  • None =英语
  • en =英语
  • es =西班牙语
  • zh =中文
  • ja =日语
  • pt =葡萄牙语

你可以在 i18n.py 文件中看到国家/地区代码,但只有这些代码列表现在可用,在wordlist文件夹中可见。如果你创建中文种子,只需用国家代码替换该参数:

print Mnemonic('zh').make_seed('standard', 132, 1)

你还可以生成多种类型的种子,你可以在 version.py 文件中看到:

  • standard:普通钱包。
  • segwit:支持即将推出的基于 Segregated Witness softfork 的比特币地址。
  • 2fa:基于双因素身份验证的钱包。
  • 下一个参数是 num_bits 变量,它使用 nbits 命令从命令行调用,基本上只是你的种子将拥有的位数熵(建议安全性最小值为128)
  • 最后一个参数是 custom_entropy ,基本上只是一个整数,可以使用该整数乘以种子数,以防你的RNG不好,这将用你自定义生成的数字替换密码的一部分,具有相同的熵大小。

因此,如果我这样称呼它,我选择了一个自定义熵数,这将以这种方式生成种子,当然熵数也必须是一个秘密:

print Mnemonic('en').make_seed('standard', 132, 2349823353453453459428932342349489238)

我真的不建议使用这个代码,它看起来有点奇怪,我不是加密专家,但我只是不喜欢这如何将熵插入你的数字。我听说乘数会减少熵,所以我不确定代码的这一部分。事实上,我将向开发者发送关于此问题的信息,看看他对此有何回应。但是不用担心,默认钱包生成不会调用自定义熵部分,因此如果你通过GUI在Electrum中生成钱包,或者将其保留设置为1,那么无需担心。

分析种子生成器

好了,现在我们知道如何生成种子,让我们看看种子生成器究竟做了什么。毕竟使用Electrum的所有人都必须依赖此代码的安全性和完整性,否则如果这些代码被写得很糟糕,你可能会损失所有的钱。因此,如果我们想在Electrum中存储大量比特币,我们必须100%信任此代码。那么让我们分析吧。

那么让我们分析一下 make_seed() 函数,这就是动作的位置,首先我会在其中放入许多打印代码,以便在每一步打印出每个变量:

Electrum比特币钱包的代码分析

基本上我只是在每一步打印出每个变量。好的,我们使用 python testcall.py 命令从 testcall.py 文件中调用 make_seed() 函数。testcall文件是这样的:

print Mnemonic('en').make_seed('standard', 132, 1)

只是一个标准的种子生成,它打印出来:

Electrum比特币钱包的代码分析

好吧,让我们一步一步来。

  • 首先导入 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 ,所以它将是一个很大的数字,这是种子的原型。
  • 然后我们进入while循环来搜索以 01 开头的随机数,它将作为种子的校验和。
  • 如果自定义熵为 0 ,那么基本上我们只需将 my_entropy 数加1,直到前2位变为 01 .实际上它的前2位是hash格式。所以发生的是它用 mnemonic_encode(i) 对其进行编码,并在用 mnemonic_decode(seed) 对其进行解码之后,我猜测是否可以用单词编码,否则会产生一些错误。这就是 assert 命令所做的,它会测试错误。
  • 然后它进入 is_new_seed() 函数,如果你现在生成一个种子,如果你以旧格式导入旧种子然后它进入旧函数。但是我上面执行的这段代码进入了新功能。这就是奇迹发生的地方。 is_new_seed() 函数实际位于 bitcoin.py 文件中:

Electrum比特币钱包的代码分析

  • 这里发生的事情很有意思,首先使用 mnenonic.py 文件中的 normalize_text() 函数对种子进行规范化,我认为中文或其他奇怪的语言会被转换成我认为的ASCII文本。所以这个功能与英文单词列表并不多。
  • 然后就是当事情变得有趣时,它采用种子列表的HMAC-SHA512哈希,在它的英文文本版本中基本上就是我们的情况。它检查前两个字符是 01 ,因为我们称之为标准钱包。Electrum将标准钱包定义为种子,其种子版本的HMAC-SHA512以 01 开头,一个Segwit钱包,其编码种子版本的HMAC-SHA512以 02 开头等等……所以基本上循环增加 my_entropy 变量 1 直到在我们的例子中,它给出的使用 Seed 版本编码的HMAC-SHA512的单词列表以 01 开头。在找到该数字后,它退出循环,并返回种子。

就是这样,这就是Electrum生成种子的基本方式。这个种子的HMAC-SHA512总和将从 01 开始,你甚至可以自己检查。所以在Linux中你可以安装一个名为 GTKHash工具 来计算哈希值,所以让我演示一下,我们取种子,然后添加HMAC消息种子版本,如该函数所定义:

Electrum比特币钱包的代码分析

因此,可以看到我们是否将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 语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Mining

Data Mining

Jiawei Han、Micheline Kamber、Jian Pei / Morgan Kaufmann / 2011-7-6 / USD 74.95

The increasing volume of data in modern business and science calls for more complex and sophisticated tools. Although advances in data mining technology have made extensive data collection much easier......一起来看看 《Data Mining》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具