Python区块链 创建矿工

Python区块链 创建矿工

为了实现采矿,我们需要开发一个采矿功能。挖矿功能需要在给定的消息串上生成一个摘要,并提供一个工作证明。让我们在本章中讨论这个问题。

消息摘要功能

我们将编写一个名为 sha256 的实用函数,用于在给定的消息上创建一个摘要 —

def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()

sha256 函数接收一个 信息 作为参数,将其编码为ASCII码,生成一个十六进制的摘要,并将该值返回给调用者。

挖矿函数

我们现在开发的 挖矿 函数,实现了我们自己的挖矿策略。在这种情况下,我们的策略是在给定的信息上生成一个前缀为给定数量的1的哈希值。给定的1的数量被指定 为矿 函数的参数,指定为难度级别。

例如,如果你指定的难度等级为2,那么在给定信息上生成的哈希值应该以两个1开始–比如11xxxxxxxx。如果难度等级为3,生成的哈希值应该以三个1开始–如111xxxxxxxx。鉴于这些要求,我们现在将开发采矿函数,如下面的步骤所示。

第1步

挖掘函数需要两个参数–消息和难度等级。

def mine(message, difficulty=1):

第2步

难度级别需要大于或等于1,我们使用下面的assert语句来确保这一点−

assert difficulty >= 1

第3步

我们使用设定的难度水平创建一个 前缀 变量。

prefix = '1' * difficulty

请注意,如果难度等级为2,前缀将是 “11”,如果难度等级为3,前缀将是 “111”,以此类推。我们将检查这个前缀是否存在于生成的信息摘要中。为了对消息本身进行摘要,我们使用下面两行代码–

for i in range(1000):
   digest = sha256(str(hash(message)) + str(i))

我们在每次迭代中都会在消息的哈希值中加入一个新的数字 i ,并对合并后的消息产生一个新的摘要。由于 sha256 函数的输入在每次迭代中都会发生变化, 摘要 值也会发生变化。我们检查这个 摘要 值是否有上面设置的 前缀。

if digest.startswith(prefix):

如果条件得到满足,我们将终止 for 循环并将 摘要 值返回给调用者。

整个 矿井 代码显示在这里 –

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

为了便于你理解,我们增加了 打印 语句,在从函数返回之前,打印出摘要值和满足条件的迭代次数。

测试挖矿函数

要测试我们的挖矿函数,只需执行以下语句—

mine ("test message", 2)

当你运行上述代码时,你会看到与下面类似的输出 —

after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

请注意,生成的摘要以 “11 “开始。如果你把难度等级改为3,生成的摘要将以 “111 “开始,当然,它可能需要更多的迭代次数。正如你所看到的,一个拥有更多处理能力的矿工将能够更早地挖掘出一个给定的信息。这就是矿工们为赚取收入而相互竞争的方式。

现在,我们已经准备好向我们的区块链添加更多的区块。让我们在下一章中学习这个。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程