simwiz.py是一個用于區塊鍊仿真系統開發的Python包,适合快速實作共識算法的仿真,或者進行大規模區塊鍊網絡的實驗,例如物聯網+區塊鍊系統等。官方下載下傳位址: http://sc.hubwiz.com/codebag/simwiz-python/ 。
1、開發包概述
simwiz.py區塊鍊仿真開發包的主要特點如下:
- 基于離散事件仿真機制,可以單機模拟包含大量節點的區塊鍊網絡
- 内置仿真網絡和區塊鍊資料結構,可快速進行共識算法和區塊鍊網絡的仿真實驗
- 簡潔的API接口,非常容易上手,便于二次開發
simwiz.py運作在Python 3.x環境下,目前版本1.0.0,主要類及關系如下圖所示:

simwiz.py的主要代碼檔案參見官網說明:
2、使用示範程式
在終端進入simwiz.py開發包目錄,執行如下指令運作内置的示範程式:
~$ cd simwiz.py
~/simwiz.py$ python3 demo.py
示範程式中,4個節點構成的區塊鍊網絡會定期輸出其内部區塊鍊構成,結果如下:
可以看到各節點(0 ~ 3)在每個出塊周期(1 ~ 7)都通過共識算法保持了區塊鍊資料的一緻。
3、啟動仿真區塊鍊
使用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秒鐘
4、自定義共識算法的實作
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秒的仿真
SimWiz.Py官方下載下傳位址: