天天看點

用simwiz.py仿真區塊鍊網絡與共識算法【Python】

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

1、開發包概述

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

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

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

用simwiz.py仿真區塊鍊網絡與共識算法【Python】

simwiz.py的主要代碼檔案參見官網說明:

2、使用示範程式

在終端進入simwiz.py開發包目錄,執行如下指令運作内置的示範程式:

~$ cd simwiz.py
~/simwiz.py$ python3 demo.py           

示範程式中,4個節點構成的區塊鍊網絡會定期輸出其内部區塊鍊構成,結果如下:

用simwiz.py仿真區塊鍊網絡與共識算法【Python】

可以看到各節點(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官方下載下傳位址: