区块链仿真Python开发包,适合共识算法快速实验或大规模区块链网络的仿真实验。
simwiz.py是一个用于区块链仿真系统开发的Python包,适合快速实现共识 算法的仿真,或者进行大规模区块链网络的实验,例如物联网+区块链系统等。
simwiz.py区块链仿真开发包的主要特点如下:
simwiz.py运行在Python 3.x环境下,当前版本1.0.0,主要类及关系如下图所示:
simwiz.py的主要代码文件如下:
代码文件 | 说明 |
---|---|
simwiz/simulation.py | 仿真入口类 |
simwiz/event_queue.py | 仿真事件队列类 |
simwiz/event.py | 仿真事件类 |
simwiz/network.py | 仿真网络类 |
simwiz/node.py | 仿真节点类 |
simwiz/location.py | 仿真节点地理位置类 |
simwiz/blockchain.py | 仿真区块链类 |
simwiz/block.py | 仿真区块类 |
simwiz/transaction.py | 仿真交易类 |
simwiz/blockchain_node.py | 仿真区块链节点类 |
simwiz/utils.py | 辅助工具类 |
demo.py | 仿真演示程序 |
在终端进入simwiz.py开发包目录,执行如下命令运行内置的演示程序:
~$ cd simwiz.py
~/simwiz.py$ python3 demo.py
演示程序中,4个节点构成的区块链网络会定期输出其内部区块链构成, 结果如下:
可以看到各节点(0 ~ 3)在每个出块周期(1 ~ 7)都通过共识算法保持了区块链数据的一致。
使用Simulation类来创建仿真实例,并调用其run()
方法启动仿真。
例如,下面的代码创建一个包含4个默认节点的区块链网络的仿真对象,
并执行1000毫秒的仿真:
from simwiz import * # 引入simwiz包
minters = 4
nodes = [ # 创建4个节点
BlockchainNode(interval=100,minters=minters)
for i in range(minters)
]
net = Network(nodes) # 4个节点组网
sim = Simulation(net) # 创建仿真对象
sim.run(1000) # 仿真1秒钟
simwiz.py开发包内置的BlockchainNode类采用的共识算法类似于DPOS,即根据时间槽来
决定当前的出块节点。可以通过继承BlockchainNode并重写其on_timer
方法与on_message
方法,
实现自定义的共识算法。例如,让每个节点按预设的概率出块:
from simwiz import *
import random
class PoxNode(BlockchainNode):
def __init__(self,prob,interval,minters):
super.__init__(interval,minters)
self.prob = prob # 当前节点的出块概率
def on_timer(self,sim):
if random.random() < self.prob:
block = self.blockchain.create_next_block() # 出块
msg = pojo({ # 创建区块消息
'type': 'block',
'payload': block
})
sim.broadcast(self,msg) # 广播区块消息
def on_message(self,sim,message):
if message.type == 'block':
self.blockchain.commit_block(message.payload) # 提交收到的区块
if message.type == 'transaction':
self.blockchain.cache_tx(message.payload) # 暂存收到的交易
按概率出块的区块链共识算法都可以采用这个PoxNode模型来仿真,例如
PoW(工作量证明)共识算法,每个节点的出块概率是与节点算力相对应的,
即:节点出块概率 = 节点算力 / 全网算力
。
下面的代码利用PoxNode来仿真一个包含100个节点的PoW网络:
miners = 100 # 100个挖矿节点
prob = 0.01 # 按均匀分布采样每个节点的出块概率
interval = 100 # 出块周期设置为100毫秒
nodes = [ # 创建节点对象
PoxNode(prob,interval,miners)
for i in range(100)
]
sim = Simulation(Network(nodes)) # 创建仿真对象
sim.run(10000) # 执行10秒的仿真
本站所提供软件包仅用于学习和研究,请依法合规使用。
本站所提供软件包均提供完整源码,使用前请认真阅读源代码和文档以确保充分理解软件包的设计与功能实现,本站不承担 因不当使用本站所提供软件包而造成的任何法律风险或财产损失责任。