
"""区块包括区块头和区块体两个部分。区块头由版本、父区块哈希值、数据、Merkle根、时间戳、目标难度、
#Nonce值组成;区块体实际上可以包含任何内容,在比特币中包含交易输入数量、交易输出数量
和长度不等的交易记录等信息。在以太坊中的区块体中除了交易数据还包含中智能合约"""
#简单版区块链
"""简化后的区块包括父区块哈希值、数据、时间戳、哈希值这四个字段,区块的哈希值由父区块哈希值、数据、时间戳、3个字段拼接通过
哈希算法计算而成"""
import hashlib
from datetime import datetime
class Block:
'''区块结构
prev_hash: 父区块哈希值
data: 区块内容
timestamp: 区块创建时间
hash: 区块哈希值
'''
def __init__(self,data,prev_hash):
#将传入的父区块哈希值和数据保存到类变量中
self.prev_hash = prev_hash
self.data = data
#获取当前时间
self.timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
#计算区块的哈希值
message = hashlib.sha256()
message.update(str(self.prev_hash).encode('utf-8'))
message.update(str(self.data).encode('utf-8'))
message.update(str(self.timestamp).encode('utf-8'))
self.hash = message.hexdigest()
'''区块链是由区块组成的链条,定义了区块的结构后还需要定义一个区块链的结构。将各个区块通过哈希值前后依次相连,然后
将这些区块都放到一个数组中,初始化时列表为空,新的区块依次放到这个列表中,再定义一个函数来是实现向这个列表中
添加区块的功能,从而定义了这个区块链的结构'''
class BlockChain:
"""区块链结构体
blocks: 包含的区块列表"""
def __init__(self):
self.blocks = []
def add_block(self,block):
'''添加区块'''
self.blocks.append(block)
'''以上完成了最简单的区块链结构,下面在此基础上一步步对其完善直至实现一个真正的区块链系统。
实现区块链原型'''
'''(1)先创建第一个区块,或者叫作创世区块'''
#生成创世区块 创世区块是第一个区块,无父区块哈希;
genesis_block = Block(data='创世区块',prev_hash="")
'''(2)再创建2个区块,prev_hash 分别为父区块哈希值'''
'''创建两个区块,数据是关于张三的转账记录,pre_hash依次是前一个区块的哈希值'''
new_block = Block(data="张三转给李四1比特币", prev_hash=genesis_block.hash)
new_block2 = Block(data="张三转给王五2个比特币",prev_hash = new_block.hash)
'''(3)新创建一个区块链,并将上面的区块添加到区块链中'''
#新建一个区块链
blockchain = BlockChain()
#将上面的几个区块添加到区块链中
blockchain.add_block(genesis_block)
blockchain.add_block(new_block)
blockchain.add_block(new_block2)
'''最后打印输出当前区块链的信息,可以看到这个区块链包含了三个区块'''
#打印区块链
print("区块链包含区块个数:%dn" %len(blockchain.blocks))
for block in blockchain.blocks:
print("父区块区块哈希: %s" %block.prev_hash)
print('区块内容:%s' %block.data)
print('区块哈希:%s' %block.hash)
print('n')
以上代码源于《自学区块链》 范凌杰 机械工业出版社