python区块链(Python学习入门之区块链详解)
本篇文章小编给大家分享一下关于区块链(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<;Hash! {}, Nonce! {}>;。format(self。hash(), self。nonce)
以上就是一个区块结构,这里实现的是一个简化版,没有完全对应比特币中的区块。这里的区块包含一个唯一标识符、父节点的哈希值、比特币行情nonce值和该区块的内容字段。可以看到一个区块的哈希值必须满足一定的条件才是有效的,比如以0000开始。下面对这个区块结构进行初始化。
In [37]!
# 创建一个内容为hello world的内容块
block = Block(Hello World)
block
Out[37]!
Block<;Hash! 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<;Hash! {}, Nonce! {}>;。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<;Hash! 000087359d5264153d624556f0a0c6f25cba06e453975c1c02587862e823911b, Nonce! 64751>;
至此,第一个有效的区块生成完成,下面开始定义区块链。
二、定义区块链结构
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<;{} Blocks, Head! {}>;。format(
num_existing_blocks,
self。head。identifier if self。head else None
)
定义好区块链结构后,下面就开始初始化一条区块链。
In [82]!
# 初始化
chain = BlockChain()
# 打印
chain
Out[82]!
Blockchain<;0 Blocks, Head! None>;
In [83]!
# 添加区块
chain。add_block(block)
# 打印
chain
Out[83]!
Blockchain<;1 Blocks, Head! 364c0cf963384ca28a2763499a140405>;
In [84]!
# 添加更多的区块
for i in range(6)!
new_block = Block(i)
new_block。mine()
chain。add_block(new_block)
# 打印
chain
Out[84]!
Blockchain<;7 Blocks, Head! e7cb24ec7acd42a4aaebe7faee9e0713>;
以上就是一个简单区块链,后面还会涉及到区块链的有效性。当区块链中一个区块被改变后,这个区块的哈希就会改变,从而影响到这块区块之后的区块,致使这个区块链不再有效。这些将在后续继续深入。
以上便是小编给大家带来的全部内容,转发此文+关注 并私信小编“资料”即可免费领取2019最新python资料和零基础入门教程!
不定期分享干货,欢迎初学和进阶中的小伙伴!
亲~私信回复【资料】即可获取Python学习资料哦,赶快领取吧!
","content_hash"!"4c6c3dec
评论