Python区块链Creating Miners教程

目录
  • 消息摘要函数
  • 挖掘函数
    • 第1步
    • 第2步
    • 第3步
  • 测试挖掘函数

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

消息摘要函数

我们将编写一个名为 sha256 的实用程序函数来创建给定消息的摘要 :

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

sha256 函数将消息作为参数进行编码它为ASCII,生成十六进制摘要并将值返回给调用者.

挖掘函数

我们现在开发 mine 实现我们自己的挖掘策略的功能.在这种情况下,我们的策略是在给定消息上生成一个前缀为给定数字1的散列.给定的1的数量被指定为 mine 函数的参数,指定为难度级别.

例如,如果指定难度级别为2,则在给定消息上生成的散列应该从两个1开始 - 如11xxxxxxxx.如果难度级别为3,则生成的散列应以三个1开始 - 如111xxxxxxxx.鉴于这些要求,我们现在将开发挖掘函数,如下面给出的步骤所示.

第1步

挖掘函数有两个参数 - 消息和难度级别.

def mine(message, difficulty=1):

第2步

难度级别需要大于或等于1,我们使用以下断言语句 : 确保这一点;

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

为了您的理解,我们添加了打印摘要的 print 语句值和在从函数返回之前满足条件所需的迭代次数.

测试挖掘函数

测试我们的迷你ng函数,只需执行以下语句 :

mine("test message",2)

当你运行上面的代码时,你会看到类似于下面和下面的输出;

after 138 iterations found nonce:

11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

请注意,生成的摘要以"11"开头.如果将难度级别更改为3,则生成的摘要将以"111"开头,当然,它可能需要更多次迭代.如您所见,具有更强处理能力的矿工将能够更早地挖掘给定的消息.这就是矿工们为了赚取收入而相互竞争的方式.

现在,我们准备为区块链添加更多区块.让我们在下一章中学习这一点,更多关于Python区块链Creating Miners的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python区块链创建Block Class教程

    一个块由不同数量的事务组成.为简单起见,在我们的例子中,我们假设该块由固定数量的事务组成,在这种情况下为3.由于块需要存储这三个事务的列表,我们将声明一个名为 verified_transactions 的实例变量,如下所示 : self.verified_transactions = [] 我们已将此变量命名为 verified_transactions ,以表明只有经过验证的有效交易将被添加到块中.每个块还保存前一个块的哈希值,以便块链变为不可变. 为了存储前一个哈希,我们声明一个实例变量如

  • Python区块链创世块创建教程

    区块链包含彼此链接的区块列表.要存储整个列表,我们将创建一个名为TPCoins : 的列表变量; TPCoins = [] 我们还将编写一个名为 dump_blockchain 的实用程序方法来转储整个区块链的内容.我们首先打印区块链的长度,以便我们知道区块链中当前存在多少个区块 def dump_blockchain (self):    print ("Number of blocks in the chain: " + str(len (self))) 请注意,随着时间的推移,数

  • Python区块链块的添加教程

    目录 添加第一个区块 添加更多块 转储整个区块链 每个矿工将从先前创建的交易池中获取交易.要跟踪已挖掘的消息数量,我们必须创建一个全局变量 : last_transaction_index = 0 我们现在让我们的第一个矿工在区块链中添加一个区块. 添加第一个区块 到添加一个新块,我们首先创建一个 Block 类的实例 block = Block() 我们从队列中选取前3个交易并减去; for i in range(3):    temp_transaction = transactions[l

  • Python区块链范围结论及Genesis Block的添加教程

    目录 Genesis Block添加 结论 Genesis Block添加 将块添加到区块链包括将创建的块附加到我们的 TPCoins 列表. TPCoins.append (block0) 请注意,与系统中的其余块不同,genesis块只包含一个由TPCoins系统的发起者启动的事务.现在,您将通过调用我们的全局函数转储区块链的内容 dump_blockchain : dump_blockchain(TPCoins) 执行此功能时,您将看到以下输出 : Number of blocks in 

  • Python区块链创建Genesis Block教程

    我们假设TPCoins的发起人最初向已知客户 Dinesh 发出500个TPCoins.为此,他首先创建一个Dinesh实例 : Dinesh = Client() 然后我们创建一个创世纪交易,并向Dinesh的公共地址发送500个TPCoins. t0 = Transaction (    "Genesis",    Dinesh.identity,    500.0 ) 现在,我们创建 Block的实例类并将其命名为 ;block0 block0 = Block() 我们将 pre

  • Python区块链交易类教程

    目录 创建 Transaction 类 测试交易类 创建 Transaction 类 在本章中,让我们创建一个 Transaction 类,以便客户能够向某人汇款.请注意,客户可以是货币的发件人或收件人.当您想要收款时,其他一些发件人将创建一个交易并在其中指定您的公开地址.我们将事务类的初始化定义如下 : def __init__(self, sender, recipient, value):    self.sender = sender    self.recipient = recipi

  • python区块链创建多个交易教程

    目录 创建多个交易 显示事务 交易队列 创建多个客户端 创建第一个事务 添加更多交易 转储交易 创建多个交易 各个客户进行的交易在系统中排队;矿工从这个队列中获取交易并将其添加到块中.然后他们将挖掘区块,获胜的矿工将有权将区块添加到区块链中,从而为自己赚取一些钱. 我们将在稍后讨论这个挖掘过程区块链的创建.在我们为多个事务编写代码之前,让我们添加一个小实用程序函数来打印给定事务的内容. 显示事务 display_transaction 函数接受事务类型的单个参数.接收到的事务中的字典对象被复制到

  • Python区块链客户端类开发教程

    目录 开发客户端 客户端类 客户端 测试客户端 开发客户端 客户是持有TPCoins并从网络上的其他供应商处交换商品/服务的客户,包括他自己的.我们应该为此目的定义 Client 类.要为客户端创建全局唯一标识,我们使用PKI(公钥基础结构).在本章中,让我们详细讨论一下. 客户应该能够将钱包从另一个已知的人那里汇款.同样,客户应该能够接受来自第三方的钱.对于花钱,客户将创建一个指定发件人姓名和支付金额的交易.为了收款,客户将向第三方提供他的身份 : 本质上是钱的发送者.我们不存储客户持有的钱包

  • Python区块链Creating Miners教程

    目录 消息摘要函数 挖掘函数 第1步 第2步 第3步 测试挖掘函数 为了实现挖掘,我们需要开发一个挖掘功能.挖掘功能需要在给定的消息字符串上生成摘要并提供工作证明.让我们在本章讨论这个. 消息摘要函数 我们将编写一个名为 sha256 的实用程序函数来创建给定消息的摘要 : def sha256(message): return hashlib.sha256(message.encode('ascii')).hexdigest() sha256 函数将消息作为参数进行编码它为ASCII,生成十六

  • python区块链简易版交易实现示例

    目录 说明 引言 比特币交易 交易输出 发送币 余额查看 总结 说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容.文章末尾有"本节完整源码实现地址". 引言 交易(transaction)是比特币的核心所在,而区块链唯一的目的,也正是为了能够安全可靠地存储交易.在区块链中,交易一旦被创建,就没有任何人能够再去修改或是删除它.今天,我们将会开始

  • python区块链基本原型简版实现示例

    目录 说明 引言 区块 区块头 区块链 总结 说明 本文根据https://github.com/liuchengxu/blockchain-tutorial的内容,用python实现的,但根据个人的理解进行了一些修改,大量引用了原文的内容.文章末尾有"本节完整源码实现地址". 引言 区块链是 21 世纪最具革命性的技术之一,它仍然处于不断成长的阶段,而且还有很多潜力尚未显现. 本质上,区块链只是一个分布式数据库而已. 不过,使它独一无二的是,区块链是一个公开的数据库,而不是一个私人数

随机推荐