python区块链代码(Python学习入门之区块链详解)python初学 / python在区块链技术中的应用...

wufei123 发布于 2024-06-10 阅读(9)

本篇文章小编给大家分享一下关于区块链(BlockChain)的相关知识,并用Python做一简单实现,下面话不多说,来一起看看详细的绍:

  一、定义区块结构  In [16]:  # block.py  import hashlib  import uuid  class Block(object):  def __init__(self, data=None, previous_hash=None):

   self.identifier = uuid.uuid4().hex # 产生唯一标示   self.nonce = None # nonce值   self.data = data # 区块内容

   self.previous_hash = previous_hash # 父节点哈希值  def hash(self, nonce=None):   计算区块的哈希值   message = hashlib.sha256()

   message.update(self.identifier.encode(utf-8))   message.update(str(nonce).encode(utf-8))   message.update(str(self.data).encode(utf-8))

   message.update(str(self.previous_hash).encode(utf-8))   return message.hexdigest()  def hash_is_valid(self, the_hash):

   校验区块哈希值有否有效   return the_hash.startswith(0000)  def __repr__(self):   return Block.format(self.hash(), self.nonce)

  以上就是一个区块结构,这里实现的是一个简化版,没有完全对应比特币中的区块这里的区块包含一个唯一标识符、父节点的哈希值、nonce值和该区块的内容字段可以看到一个区块的哈希值必须满足一定的条件才是有效的,比如以0000开始。

下面对这个区块结构进行初始化  In [37]:  # 创建一个内容为hello world的内容块  block = Block(Hello World)  block  Out[37]:  Block

238a65a101c8829d7fc406eb78a71cfc19ad702b437e2c1be8d9061ddb81e900, Nonce: None>  以上一个区块虽然创建完成,但其哈希值不是有效的。

  In [38]:  block.hash_is_valid(block.hash())  Out[38]:  False  改变nonce的值就可以得到一个新的哈希值  In [39]:  block.hash(1)。

  Out[39]:a6431938ba10270dfcfdf7a2371312446914fedadf79632c2c0adb3b463f4838  哈希值更新了,但还不是有效的哈希值为了得到有效哈希值,是一个不断更新nonce值的过程,或者说一个挖矿(mine)过程。

下面添加一个mine函数用来得到一个合适的nonce值  In [78]:  # block.py  import uuid   计算区块的哈希值   return Block.format(self.hash(self.nonce), self.nonce)

   新增挖矿函数  def mine(self):   # 初始化nonce为0   cur_nonce = self.nonce or 0   # 循环直到生成一个有效的哈希值   while True:

   the_hash = self.hash(nonce=cur_nonce)   if self.hash_is_valid(the_hash): # 如果生成的哈希值有效   self.nonce = cur_nonce # 保持当前nonce值

   break # 并退出   else:   cur_nonce += 1 # 若当前哈希值无效,更新nonce值,进行加1操作  In [75]:  # 挖矿,循环直至找到合适的nonce  block.mine()

  # 打印  block  Out[75]:  Block

  至此,第一个有效的区块生成完成,下面开始定义区块链  二、定义区块链结构  In [81]:  class BlockChain(object):  def __init__(self):   self.head = None # 指向最新的一个区块。

   self.blocks = {} # 包含所有区块的一个字典   添加区块函数  def add_block(self, new_block):   previous_hash = self.head.hash() if self.head else None

   new_block.previous_hash = previous_hash   self.blocks[new_block.identifier] = {   block: new_block,

   previous_hash: previous_hash,   previous: self.head,   }   self.head = new_block   num_existing_blocks = len(self.blocks)

   return Blockchain.format(   num_existing_blocks,   self.head.identifier if self.head else None

   )  定义好区块链结构后,下面就开始初始化一条区块链  In [82]:  # 初始化  chain = BlockChain()  # 打印  chain  Out[82]:  Blockchain。

  In [83]:  # 添加区块  chain.add_block(block)  # 打印  chain  Out[83]:  Blockchain

  In [84]:  # 添加更多的区块  for i in range(6):  new_block = Block(i)  new_block.mine()  chain.add_block(new_block)

  # 打印  chain  Out[84]:  Blockchain  以上就是一个简单区块链,后面还会涉及到区块链的有效性。

当区块链中一个区块被改变后,这个区块的哈希就会改变,从而影响到这块区块之后的区块,致使这个区块链不再有效这些将在后续继续深入以上便是小编给大家带来的全部内容,转发此文+关注 并私信小编“资料”即可免费领取2019最新python资料和零基础入门教程!

不定期分享干货,欢迎初学和进阶中的小伙伴!亲~私信回复【资料】即可获取Python学习资料哦,赶快领取吧!

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻34993