Python区块链教程

创建矿工

Python区块链创建矿工详细操作教程
要启用挖掘,我们需要开发一个挖掘功能。挖掘功能需要在给定的消息字符串上生成摘要,并提供工作量证明。让我们在本章中对此进行讨论。

消息摘要功能

我们将编写一个名为 sha256 的实用程序功能,用于在给定消息上创建摘要-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()
sha256 函数将 消息作为参数,将其编码为ASCII,生成十六进制摘要并将该值返回给调用方。

挖矿功能

我们现在开发 mine 函数,该函数实现了我们自己的挖掘策略。在这种情况下,我们的策略是在给定消息上生成哈希值,该哈希值以给定数字1开头。给定数字1表示 mine 函数的参数,该函数指定为难度级别。
例如,如果您将难度级别指定为2,则给定消息上生成的哈希值应以两个1(例如11xxxxxxxx)开头。如果难度级别为3,则生成的哈希值应以三个1(例如111xxxxxxxx)开头。鉴于这些要求,我们现在将开发挖掘功能,如下面的步骤所示。

步骤1

挖掘功能需要两个参数-消息和难度级别。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
def mine(message, difficulty=1):

步骤2

难度级别必须大于或等于1,我们通过以下assert语句确保这一点-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
assert difficulty >= 1

步骤3

我们使用设置的难度级别创建 前缀变量。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
prefix = '1' * difficulty
请注意,如果难度级别为2,则前缀为" 11",如果难度级别为3,则前缀为" 111",依此类推。我们将检查生成的消息摘要中是否存在此前缀。为了消化消息本身,我们使用以下两行代码-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
for i in range(1000):
   digest = sha256(str(hash(message)) + str(i))
在每次迭代中,我们都会继续在消息哈希中添加新的数字 i ,并在合并后的消息上生成新的摘要。由于 sha256 函数的输入在每次迭代中都会更改,因此 digest 值也会更改。我们检查此 摘要值是否具有高于设置的 前缀
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
if digest.startswith(prefix):
如果条件满足,我们将终止 for 循环并将 digest 值返回给调用方。
整个 我的代码如下所示-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
def mine(message, difficulty=1):
   assert difficulty >= 1
   prefix = '1' * difficulty
   for i in range(1000):
      digest = sha256(str(hash(message)) + str(i))
      if digest.startswith(prefix):
         print ("after " + str(i) + " iterations found nonce: "+ digest)
      return digest
为您的理解,我们添加了 print 语句,该语句打印摘要值以及从函数返回之前满足条件所需的迭代次数。

测试挖掘功能

要测试我们的挖掘功能,只需执行以下语句-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
mine ("test message", 2)
运行上面的代码时,您将看到类似于下面的输出-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-28
after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c
请注意,生成的摘要以" 11"开头。如果将难度级别更改为3,则生成的摘要将以" 111"开头,当然,它可能需要更多的迭代次数。如您所见,具有更大处理能力的矿工将能够更早地挖掘给定的消息。这就是矿工相互竞争以赚取收入的方式。
现在,我们准备向我们的区块链添加更多块。让我们在下一章中学习这一点。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4