本篇文章小编给大家分享一下关于区块链(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学习资料哦,赶快领取吧!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。