2018-02-19 19:34:32 m0_38113129 阅读数 3433

1、准备服务器

    最近在准备一个比特币钱包的项目,需要在CENTOS服务器上部署比特币钱包,由于该项目是部署的核心钱包,需要同步所有的blocks, 需要的磁盘空间大约在170G左右。

服务器的配置:

  • CPU: 2核以上
  • 内存: 2G以上
  • 数据盘: 170G以上(注意需要专门增加一块存储盘,否则全节点区块链存不下)
  • 带宽: 2Mbps以上
  • 操作系统:centos 7.0  64位

2、准备钱包软件

   到比特币官方网站下载最新版本的核心核心钱包,下载地址:https://bitcoin.org/bin/bitcoin-core-0.15.1/bitcoin-0.15.1-x86_64-linux-gnu.tar.gz

   下载到服务器之后,解压之后 进行目录bitcoin-0.15

cd bin  (进入bin 目录)bitcoind --datadir=/www/bitcoin/data/ --daemon

运行命令 ./bitcoind --datadir=/www/bitcoin/data/ --daemon   ( --datadir 参数是存放核心钱包的文件,总共需要的空间是170G,这个目录一定要指定,不指定,就是目录当前用户的目录)

运行成功该命令,这时钱包程序会同步线上所有的BLOCKS,你会发现/www/bitcoin/data/的空间不断再增大

运行命令./bitcoin-cli --datadir=/www/bitcoin/data/ getinfo   (查看当前钱包信息)  

{
  "deprecation-warning": "WARNING: getinfo is deprecated and will be fully removed in 0.16. Projects should transition to using getblockchaininfo, getnetworkinfo, and getwalletinfo before upgrading to 0.16",
  "version": 150100,
  "protocolversion": 70015,
  "walletversion": 139900,
  "balance": 0.01000000,
  "blocks": 509920,
  "timeoffset": -1,
  "connections": 8,
  "proxy": "",
  "difficulty": 2874674234415.941,
  "testnet": false,
  "keypoololdest": 1517114450,
  "keypoolsize": 1999,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""

}

能够显示以上类似信息,就代表比特币核心钱包安装完成了。






2017-11-08 17:07:03 sunnyishere 阅读数 2648
说比特币之前,先来说说虚拟货币,以及虚拟币的价值。比如说,百度文库文下载章需要付点数,自己上传文件被别人下载可以得到点数,点数就是虚拟货币,如果没有点数,又能想下文档,可以用钱兑换,这就是虚拟货币与真实货币的关系。至于一个点数研究值多少钱,又怎么给一篇文档定价,一般会借鉴类似资源的定价,使用的人多了,虚拟货币的价值也逐渐趋于稳定。

       比特币是最流行的虚拟货币,它是基于P2P的数字货币,在互联网的某处,每10分钟产生13个币,至于新产生的币归谁,就看谁挖到了(也就是挖矿,具体算法后面说明)。一般大家最大的疑问是:算法产生的一串数就能对应真金白银吗?来看看货币的价值:钱是一张纸,印这张纸花多少钱是它的自然属性,它能当多少钱花是它的社会属性,我们更关注它能当多少钱花。钱的使用价值是以发行方的信用作担保的,也就是说有国家在,就不用担心你的钱明天变成废纸。那谁给比特币谁作担保呢?上学的时候学:说一个事物,要么是主观的,要么是客观的,现在说,介于主观和客观之间叫互为主体(intersubjective),即:相信的人多了,它就存在了。随着比特币越来越多的被用在交易中,互联网上东西以它估值,它的价值也越来越稳定,它就有了价值。比特币的思想是去中心化,它基于算法产生,因此也并不随着发行它的组织灭亡而灭亡。


      比特币是2009年中本聪发明。根据算法,每210,000个区块,比特币的区块奖励就会减半。简单的说,前段两年10分钟产生25个比特币,现在10分钟产生13个。它的总量是递增的,但递增的速度是逐步减小的,到2140年就不再增长了,还有100多年。那这每分钟产生的13个币归谁所有呢?比特币其实就是一堆算法所生成方程的特解。特解是指方程组所能得到无限个(其实比特币是有限个)解中的一组。而每一个特解都能解开方程并且是唯一的。挖矿的过程就是通过庞大的计算量不断的去寻求这个方程组的特解,这个方程组被设计成了只有 2100 万个特解,所以比特币的上限就是 2100 万。这里的计算就是所谓挖矿。

      一开始没人认同它的价值,也没那么多人挖。但随着它的发展,8年涨了221万倍。越来越多人加入挖矿的行列。开始用PC挖,后来拿显卡的GPU挖,一个机器挂十几个显卡,现在用专业矿机,减低了功耗,又提升了性能。狼越来越多,肉越来越少。计算也越来越复杂,你的机器还没算出来呢,10分钟已经过去了,于是又有人发明了组团挖,把运算量拆成小块,分配到各个机器,于是众多机器组成了矿池。如能挖到,则按算力分成。现在能挖到的,要么是组织一帮散户挖,要么是自己的矿机集群。再拿PC挖,基本是不可能了。

下面我们就来看看矿池。



1.      比特币体系:
是由无数个节点矿池组成,这些节点矿池是单独存在的,同时是相互连接的,所有数据都是同步的。

2.      矿池:
一般的矿池由多台服务器组成,负责分配任务,集成结果,由矿主配置。并与控制板交互。

3.      控制板:
控制板与矿池服务器相连通过网线连接,控制多台矿机,需要矿工配置(在设置界面中输入服务器地址,用户名等)。据说一个树莓派加一个USB-HUB可以控制20-60台矿机。控制板上的程序也是预先写好的,与指定矿机匹配,无需矿工修改程序。

4.      矿机:
以运算为主,本身系统简单,矿工无需关注。

 

      如果有少量机器的话,就做矿工,参加别人的矿池,拿分成。如果有大量机器则自营矿厂,矿厂也分大小,小规模的矿场可以与其它矿厂共享任务,大的矿厂自成体系。后面文章会讲到实现的具体方法。

      现在,区块链是个热闹技术,还被联系到自由平等,很高大上的样子,先看看为什么说区块链经济带来新的商业文明?比如说我们要买一个东西,可能将原来买东西的经验做为参考;如果之前没买过此类东西,可能向周围的人咨询;如果周围的人也不知道,可能会根据品牌选择。一个产品一家公司一般会用比较长的时间和投入来构建大家对它的信任。区块链中的信任是基于算法和无法被篡改的性质,它根据历史数据构造信任网络(历史数据是大家都能看到的,且不能被篡改的),从而减小了大小机构构造的商业信任的能力差距。这有点像淘宝的或者脉脉的评价系统,只要达到一定体量,恶意数据将被淹没在更大量的真实数据之中。从这个角度讲,它的确是重新构建了信任体系:从权威专制变成了群众投票。

      它的主要优点是透明和去中心化。比如淘宝的评价在淘宝服务器上,其实是有可能被管理员或者黑客修改的。但区块链的数据存储在每个P2P的节点上(去中心化),不可能全给改了。因而增加了信息的透明度和真实性。像卖东西,做公证,都开始实验性地使用该技术。另外,比特币还增进了交易的全球化;区块链技术本身也给交易提供了保障,减少了运营成本。还可以提高公共事业的透明度等等。

      它的缺点是,在效率上低于中心化的实现方式。因此,中心化已经做得很的领域,就无需改为去中心化;它的应用场合可能正是那些不那么权威,却有众多群众可以举手的领域。

      2017年9月4日下午,央行等七部门联合发布公告,正式叫停包括ICO在内的“代币发行融资”。公告发布之日起, 代币发行融资应当立即停止,现有者应清退。中国的代币产业因而受到了严重的打击,不过比特币现在的价钱也不低,因此仍有很多人在挖。另外,区块链技术也可能是之后一个重要的技术。

2017-04-23 10:05:12 jQQ53016353 阅读数 978

区块链爱好者(QQ:53016353)


比特币开发基金会参照Linux基金的模式建立,致力于为全球用户标准化、推广和保护比特币。比特币就像Linux一样,是一个非常成功的开源项目,真正体现了“开源”的概念。

 
基金当然不会做任何事情—事情是由人们去做的。比特币基金是一个开放的、成员驱动型的组织,希望你或者你的组织不仅是成为成员,也要帮助基金完成其使命。
 
请访问基金会网站了解详细内容,不过记住这些并不是一成不变的;基金的架构可以通过成员投票被改变,基金将按照人们希望的方式去运作。


比特币开发基金会常见问题解答:
 
Q:这就是那个9月公告吗?
是。
 
Q:我们怎么知道你们不会拿了比特币就跑?
我们不会。基金的初始成员都是有良好声望的人,使用的都是真实姓名。
 
Q:我们怎么知道你们不会被黑客黑掉比特币?
大部分的资金,我们会使用离线钱包,并会备份好私钥;在不久的将来,我们将会使用多重签名的离线钱包,由多个成员控制,这样资金会更加安全。
 
Q:这是中情局的幌子么?背后有不可告人的秘密?
不是。背后什么也没有。
 
Q:基金是公司形式,任何公司(特别是美国公司)都是邪恶的。
OK,那么你可以不要加入我们,然后去建立你自己的非公司非邪恶的组织,或者不要理我们的基金就好,随便你怎么想。
 
Q:基金让如何使用资金?
这依赖于能够从成员处或者捐助方得到多少资金。可以看一下执行理事写的计划,也可以看一下Linux基金的网站类似的相关内容,我也望比特币基金能按照类似的方式去做。
2018-11-12 15:06:50 mongo_node 阅读数 75

如果你仍然未对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 make_seed --nbits 125

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

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

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

基本上我们从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()函数,这就是动作的位置,首先我会在其中放入许多打印代码,以便在每一步打印出每个变量:

基本上我只是在每一步打印出每个变量。好的,我们使用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,所以它将是一个很大的数字,这是种子的原型。
  • 然后我们进入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文件中:

  • 这里发生的事情很有意思,首先使用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消息种子版本,如该函数所定义:

因此,可以看到我们是否将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比特币钱包的代码分析

2018-11-12 15:24:00 rejames 阅读数 431

如果你仍然未对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(),它是这段代码:

11831773-260f0cbc55034a65.png

image

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

electrum make_seed --nbits 125

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

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

11831773-2e7de4f624293425.png

image

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

11831773-2b816ecd3a1bdf55.png

image

基本上我们从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()函数,这就是动作的位置,首先我会在其中放入许多打印代码,以便在每一步打印出每个变量:

11831773-88806d32419fd603.png

image

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

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

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

11831773-8c021a3f83519e21.png

image

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

  • 首先导入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文件中:

11831773-21f267cd6d79a81a.png

image

  • 这里发生的事情很有意思,首先使用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消息种子版本,如该函数所定义:

11831773-875beddd0b42a4ac.png

image

因此,可以看到我们是否将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、比特币等区块链相关的交互式在线编程实战教程:

  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。

汇智网原创翻译,转载请标明出处。这里是原文Electrum比特币钱包的代码分析

没有更多推荐了,返回首页