主页 > imtoken手机下载 > Electrum比特币钱包的Python代码分析

Electrum比特币钱包的Python代码分析

imtoken手机下载 2023-10-13 05:09:50

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

在本文中,我将分析 Electrum 的源代码,一个纯 Python 编写的比特币钱包,它应该适用于任何 python2.x,我相信即使是 python3.x 包,默认万一,软件的所有依赖项都被默认包使用。因此,不需要额外的软件。

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

理解代码

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

种子生成器文件基本在lib里面,叫mnemonic.py,函数是make_seed(),就是这样的代码:

您也可以通过内部命令从终端实际调用它。所以,如果你安装了 Electrum,它看起来像这样:

electrum make_seed --nbits 125

比特币英文代码是什么

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

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

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

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

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

比特币英文代码是什么

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

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

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

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

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

我真的不推荐使用这段代码,它看起来有点奇怪,我不是加密专家,但我只是不喜欢它如何将熵插入你的数字中。我听说乘数会减少熵,所以我不确定这部分代码。实际上,我会向开发人员发送有关此问题的消息,看看他如何回应。不过不用担心,默认的钱包生成不会调用自定义熵部分,所以如果您通过 GUI 在 Electrum 中生成钱包,或者将其设置为 1,则不用担心。

分析种子生成器

比特币英文代码是什么

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

那么我们来分析一下make_seed()函数,这就是动作的来源,首先我会在里面放很多打印代码,在每一步打印出每个变量:

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

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

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

比特币英文代码是什么

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

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

因此可以看出,如果我们将 HMAC 消息 Seed 版本与种子一起添加,它会为我们提供以 01 开头的 512 位哈希,因此在这种情况下,这是与 Electrum 兼容的有效默认种子。

当然,HMAC 系统是牢不可破的,特别是因为它的 512 位版本可能是量子计算机抗性的,所以没有办法对系统的种子进行逆向工程。

但是有一个问题,如果我们将前两个字符固定为十六进制格式,显然 HMAC-SHA512 输出是十六进制格式,那么我们就失去了熵。

比特币英文代码是什么

这就是为什么我们从 132 位的熵开始,因为我们损失了大约 4 位的熵,所以最终的输出只有 128 位的熵,这是我们想要的默认情况,使用 128 位的安全熵,实际上,鉴于电脑电源,现在建议使用120位以上。

所以我们从 132 位开始,由于固定前 2 个字符,我们丢失了一些位,然后我们保留 128 位,这在计算上是安全的。为了蛮力这需要一台超级计算机经过2128种组合,这几乎是不可能的,因为地球上没有足够的能量来经过这么多组合,实际上有人说你甚至不能数到那个数字范围,更不用说哈希和其他内存密集型操作了。

综上所述

看起来 Electrum 可以安全使用。它已经过我的审查,虽然我不是加密专家,但从我的研究和学习来看,它对我来说是安全的。

我仍然对 custom_entropy 的事情持怀疑态度,我应该问一下 dev 到底做了什么,但除此之外,默认的钱包生成是完美的。我不认为有后门。

毕竟有成千上万的人使用 Electrum,尤其是那些持有大量资金的人,所以最好安全地使用它,在我看来就是这样。

我在本文中分析了它的主要种子生成代码。当然代码远不止这些,但我们已经知道,如果你在离线计算机上使用它来播种它,它应该是安全的。现在我还没有看过它的网络相关部分,但我相信它们是安全的。

==================================================== === ======================

分享一些以太坊、EOS、比特币等区块链相关的互动在线编程实战教程: