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 语言工程师快速入门区块链开发的最佳选择。

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


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

查看所有标签

猜你喜欢:

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

创新者

创新者

[美] 沃尔特·艾萨克森 / 关嘉伟、牛小婧 / 中信出版社 / 2017-4 / 88.00元

《创新者》是沃尔特·艾萨克森继全球畅销书《史蒂夫·乔布斯传》之后的又一部力作,不仅讲述了计算机和互联网从无到有的发展历程,为我们 生动地刻画出数字时代的创新者群像,还深度挖掘互联网的精神内核,解读了“诗意科学”这个重大主题。 在近200年的数字化进程中群星闪耀,艾萨克森从第一个计算机程序的创造者、浪漫主义诗人拜伦之女埃达•洛夫莱斯伯爵夫人说起,细数了这一群将科学与人文融合的创新者,他们包括第......一起来看看 《创新者》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

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

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具