版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DanielDingshengli/article/details/86379280
本博客适合对区块链概念有所了解的
极简区块链
看图
代码框架
import hashlib //哈希运算库
import datetime
class DingDingBlock():
def __init__(self, index, timestamp, data, last_hash): //四要素
self.index = index
self.timestamp = timestamp
self.data = data
self.last_hash = last_hash
self.hash = self.hash_DingDing()
def hash_DingDing(self):
pass
def validate(self):
pass
def create_first_DingDingBlock()://创世区块
return DingDingBlock(0, datetime.datetime.now(), "荆轲刺秦王", "0")
def create_DingDingBlock(last_block)://后续区块
pass
//检测
哈希
def hash_DingDing(self):
sha = hashlib.sha256()
datastr = str(self.index) + str(self.timestamp) + str(self.data) +str(self.last_hash)
sha.update(datastr.encode("utf-8"))
return sha.hexdigest()
开始
def create_first_DingDingBlock():
return DingDingBlock(0, datetime.datetime.now(), "荆轲刺秦王", "0")
def create_DingDingBlock(last_block):
this_index = last_block.index + 1
this_timestamp = datetime.datetime.now()
this_data = "穿山甲说"+str(this_index)
this_last_hash = last_block.hash
return DingDingBlock(this_index, this_timestamp, this_data, this_last_hash)
DingDingBlockChain = [create_first_DingDingBlock()]
head_block = DingDingBlockChain[0]
print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)
for i in range(88):
DingDingBlock_add = create_DingDingBlock(head_block)
DingDingBlockChain.append(DingDingBlock_add)
head_block = DingDingBlock_add
print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)
输出:
区块检测
import hashlib
import datetime
class DingDingBlock():
def __init__(self, index, timestamp, data, last_hash):
self.index = index
self.timestamp = timestamp
self.data = data
self.last_hash = last_hash
self.hash = self.hash_DingDing()
def hash_DingDing(self):
sha = hashlib.sha256()
datastr = str(self.index) + str(self.timestamp) + str(self.data) +str(self.last_hash)
sha.update(datastr.encode("utf-8"))
return sha.hexdigest()
def validate(self):
if self.hash != self.hash_DingDing():
print("**区块{}被修改**\n".format(self.index))
def create_first_DingDingBlock():
return DingDingBlock(0, datetime.datetime.now(), "荆轲刺秦王", "0")
def create_DingDingBlock(last_block):
this_index = last_block.index + 1
this_timestamp = datetime.datetime.now()
this_data = "穿山甲说"+str(this_index)
this_last_hash = last_block.hash
return DingDingBlock(this_index, this_timestamp, this_data, this_last_hash)
DingDingBlockChain = [create_first_DingDingBlock()]
head_block = DingDingBlockChain[0]
# print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)
for i in range(88):
DingDingBlock_add = create_DingDingBlock(head_block)
DingDingBlockChain.append(DingDingBlock_add)
head_block = DingDingBlock_add
# print(head_block.index, head_block.timestamp, head_block.data, head_block.last_hash, head_block.hash)
#检测错误
DingDingBlockChain[10].data = "穿山甲死了"
for i in range(89):
DingDingBlockChain[i].validate()
结果:
更完善的检测
DingDingBlockChain[10].data = "穿山甲死了"
DingDingBlockChain[10].hash = DingDingBlockChain[10].hash_DingDing()
def validate():
for i ,block in enumerate(DingDingBlockChain):
DingDingBlockChain[i].validate()
if DingDingBlockChain[i-1].hash_DingDing() != DingDingBlockChain[i].last_hash:
print("检测出错误区块{}".format(i-1))
if __name__ == "__main__":
validate()