单个区块的数据结构
-
index: 区块在区块链中的高度(即序号),因为每加一个区块,该index就会加1。
-
data: 任何需要包括在此区块中的数据。
-
timestamp: 时间戳。(可用来防止攻击等)
-
hash: 根据区块内容计算的哈希值(SHA256)。
-
previousHash: 前一个区块的哈希值。方便回溯前面区块。
此处用到了hashlib中的sha256算法用于生成每个区块的哈希值,来确保区块的唯一性。
class Block:
def __init__(self, index, timestamp, data, previous_hash):
self.index = index
self.timestamp = timestamp
self.data = data
self.hash = self.calc_hash(data)
self.previous_hash = previous_hash
self.next = None
def calc_hash(self, data):
hash_str = data.encode('utf-8')
sha = hashlib.sha256()
sha.update(hash_str)
return sha.hexdigest()
区块链的实现类
主要实现了append用于添加数据,接收一个input作为区块的data
class BlockChain:
def __init__(self):
self.head = None
self.size = 0
def append(self, value):
if value is None:
return
self.size += 1
node = self.head
# 区分第一个区块
if node is None:
block = Block(0,datetime.datetime.now(), value, None)
self.head = block
else:
while node.next:
node = node.next
node.next = Block(node.index+1,datetime.datetime.now(), value, node.hash)
def show(self):
# 更直观的显示区块的内容
# 为节约篇幅,此处就不放了,文末源码处有
MAIN函数
用于测试代码,直接输入回车即可退出测试。
if __name__ == '__main__':
blockchain = BlockChain()
while True:
mydata = input("输入区块数据:")
if mydata == '':
break
blockchain.append(mydata)
blockchain.show()
print('END')
效果展示
PS E:\WorkSpace\BlockChain> python -u "e:\WorkSpace\BlockChain\python\blockchain.py"
输入区块数据:第一个区块
>> block No: 0
> time: 2021-04-13 14:32:00.962946
> data: 第一个区块
> pre_hash: None
> cur_hash: 328fffe02f9e57c15508352cb145aa68abcf83da69a059e975d2171b1e7f8f92
输入区块数据:测试
>> block No: 1
> time: 2021-04-13 14:32:03.508299
> data: 测试
> pre_hash: 328fffe02f9e57c15508352cb145aa68abcf83da69a059e975d2171b1e7f8f92
> cur_hash: 6aa8f49cc992dfd75a114269ed26de0ad6d4e7d7a70d9c8afb3d7a57a88a73ed
输入区块数据:
END
完整源码
import hashlib
import datetime
class Block:
def __init__(self, index, timestamp, data, previous_hash):
self.index = index
self.timestamp = timestamp
self.data = data
self.hash = self.calc_hash(data)
self.previous_hash = previous_hash
self.next = None
def calc_hash(self, data):
hash_str = data.encode('utf-8')
sha = hashlib.sha256()
sha.update(hash_str)
return sha.hexdigest()
class BlockChain:
def __init__(self):
self.head = None
self.size = 0
def append(self, value):
if value is None:
return
self.size += 1
node = self.head
if node is None:
block = Block(0,datetime.datetime.now(), value, None)
self.head = block
else:
while node.next:
node = node.next
node.next = Block(node.index+1,datetime.datetime.now(), value, node.hash)
def show(self):
node = self.head
while node.next:
node = node.next
print(">> block No: ",end='')
print(node.index)
print("> time: ",end='')
print(node.timestamp)
print("> data: ",end='')
print(node.data)
print("> pre_hash: ",end='')
print(node.previous_hash)
print("> cur_hash: ",end='')
print(node.hash)
print()
if __name__ == '__main__':
blockchain = BlockChain()
while True:
mydata = input("输入区块数据:")
if mydata == '':
break
blockchain.append(mydata)
blockchain.show()
print('END')