"""区块包括区块头和区块体两个部分。区块头由版本、父区块哈希值、数据、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("区块链包含区块个数:%d\n" %len(blockchain.blocks)) for block in blockchain.blocks: print("父区块区块哈希: %s" %block.prev_hash) print('区块内容:%s' %block.data) print('区块哈希:%s' %block.hash) print('\n')
以上代码源于《自学区块链》 范凌杰 机械工业出版社