在之前的文章(区块链基础一文)中,已经实现了一个简单的区块链。但凭借一个100行实现的区块链肯定是找不到一个好的工作机会的。 因此接下来打算实现一个功能较为全面的区块链项目,支持账户、交易、网络等功能。相关文档和代码会放到Github(https://github.com/flingjie/blockchain)上,欢迎交流和学习。
在本文中,将会基于之前开发的区块链实现一个简单的原型,过程如下:
- 定义区块结构;
- 定义区块链结构;
- 初始化一个区块链。
定义区块结构
In [10]:
# block.py
import hashlib
from datetime import datetime
class Block:
"""
区块结构体
prev_hash: 父区块哈希值
data: 区块内容
timestamp: 区块创建时间
hash: 区块哈希值
"""
def __init__(self, data, prev_hash):
self.previous_hash = prev_hash
self.data = data
self.timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 计算区块的哈希值
message = hashlib.sha256()
message.update(str(self.previous_hash).encode('utf-8'))
message.update(str(self.data).encode('utf-8'))
message.update(str(self.timestamp).encode('utf-8'))
self.hash = message.hexdigest()
其中需要注意的是第一个区块,也叫创世区块,它是一个特殊的区块,没有父区块,在区块链创建的时候会生成,定义如下:
In [11]:
# block.py
def create_genesis_block():
"""
生成创世区块,创世区块是第一个区块,故无父区块哈希
:return:
"""
return Block(data="Genesis Block", prev_hash="")
定义区块链结构
In [14]:
# blockchain.py
class BlockChain:
"""
区块链结构体
blocks: 包含的区块列表
"""
def __init__(self):
self.blocks = [create_genesis_block()]
def add_block(self, block):
"""
添加区块
:param block:
:return:
"""
self.blocks.append(block)
创建区块链
In [15]:
def create_bc():
"""
创建一个区块链
:return:
"""
bc = BlockChain()
bc.add_block("Jack send 0.3 btc to Alice")
bc.add_block("Alice send 0.1 btc to Tom")
上面的函数创建了一个区块链,并生成两个区块,加上创世区块一共三个区块。最后用Flask将生成的区块链展示一下。