用SimWiz.Py快速進行區塊鏈仿真實驗

simwiz.py是一個用於區塊鏈仿真系統開發的Python包,適合快速實現共識算法的仿真,或者進行大規模區塊鏈網絡的實驗,例如物聯網+區塊鏈系統等。官方下載地址:http://sc.hubwiz.com/codebag/simwiz-python/。

1、開發包概述

simwiz.py區塊鏈仿真開發包的主要特點如下:

  • 基於離散事件仿真機制,可以單機模擬包含大量節點的區塊鏈網絡
  • 內置仿真網絡和區塊鏈數據結構,可快速進行共識算法和區塊鏈網絡的仿真實驗
  • 簡潔的API接口,非常容易上手,便於二次開發

simwiz.py運行在Python 3.x環境下,當前版本1.0.0,主要類及關係如下圖所示:

用SimWiz.Py快速進行區塊鏈仿真實驗

simwiz.py的主要代碼文件參見官網說明:http://sc.hubwiz.com/codebag/simwiz-python/ 。

2、使用演示程序

在終端進入simwiz.py開發包目錄,執行如下命令運行內置的演示程序:

<code>~$ 

cd

simwiz.py ~/simwiz.py$ python3 demo.py /<code>

演示程序中,4個節點構成的區塊鏈網絡會定期輸出其內部區塊鏈構成,結果如下:

用SimWiz.Py快速進行區塊鏈仿真實驗

可以看到各節點(0 ~ 3)在每個出塊週期(1 ~ 7)都通過共識算法保持了區塊鏈數據的一致。

3、啟動仿真區塊鏈

使用Simulation類來創建仿真實例,並調用其run()方法啟動仿真。例如,下面的代碼創建一個包含4個默認節點的區塊鏈網絡的仿真對象,並執行1000毫秒的仿真:

<code>from simwiz import *                                     

minters = 4
nodes = [                                                
  BlockchainNode(interval=100,minters=minters) 
  for i in range(minters)
]  
net = Network(nodes)                                     
sim = Simulation(net)                                    

sim.run(1000)                                            
/<code>

4、自定義共識算法的實現

simwiz.py開發包內置的BlockchainNode類採用的共識算法類似於DPoS,即根據時間槽來決定當前的出塊節點。可以通過繼承BlockchainNode並重寫其on_timer方法與on_message方法,實現自定義的共識算法。例如,讓每個節點按預設的概率出塊:

<code>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) /<code>

按概率出塊的區塊鏈共識算法都可以採用這個PoxNode模型來仿真,例如PoW(工作量證明)共識算法,每個節點的出塊概率是與節點算力相對應的,即:節點出塊概率 = 節點算力 / 全網算力。

下面的代碼利用PoxNode來仿真一個包含100個節點的PoW網絡:

<code>miners = 100                                             
prob = 0.01                                              
interval = 100                                           
nodes = [                                                
  PoxNode(prob,interval,miners) 
  for i in range(100) 
]
sim = Simulation(Network(nodes))                         
sim.run(10000)                                           
/<code>

SimWiz.Py官方下載地址:http://sc.hubwiz.com/codebag/simwiz-python/


分享到:


相關文章: