89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
import random
|
|
import json
|
|
import uuid
|
|
import copy
|
|
import time
|
|
|
|
from .node import Node
|
|
|
|
CHAIN_GENESIS = {"genesis_time": "0001-01-01T00:00:00Z",
|
|
"chain_id": "",
|
|
"validators": [],
|
|
"app_hash": ""}
|
|
|
|
|
|
class Network():
|
|
|
|
def __init__(self, max_size=1, namespace='default', chain_id=None):
|
|
# NOTE: a maximum of 19 validators can be allocated
|
|
self.max_size = max_size
|
|
self.priv_validator_list = load_validators(max_size)
|
|
self.namespace = namespace
|
|
self.genesis = copy.deepcopy(CHAIN_GENESIS)
|
|
self.genesis['chain_id'] = chain_id or uuid.uuid4().hex
|
|
self.genesis['validators'] = [extract_validator(v) for v in self.priv_validator_list]
|
|
self.nodes = []
|
|
|
|
for i in range(0, max_size):
|
|
self.nodes.append(Node(self.priv_validator_list[i], self.genesis, self.namespace))
|
|
|
|
def ensure_started(self, n=None, concurrent=True):
|
|
""" Ensure that n nodes of the network are running
|
|
NOTE: In order for the network to work properly 2/3 of the nodes
|
|
should be operational
|
|
"""
|
|
if n is None:
|
|
n = self.max_size
|
|
|
|
n = min(n, self.max_size)
|
|
for i in range(0, n):
|
|
if not self.nodes[i].is_running:
|
|
self.nodes[i].start(not concurrent)
|
|
|
|
nodes_online = 0
|
|
while concurrent:
|
|
print("Online nodes::", nodes_online)
|
|
if nodes_online >= n:
|
|
break
|
|
|
|
for i in range(0, n):
|
|
if self.nodes[i].is_running:
|
|
nodes_online += 1
|
|
|
|
time.sleep(1)
|
|
|
|
def stop(self, n=None):
|
|
""" Stop n nodes are stopped """
|
|
if n is None:
|
|
n = self.max_size
|
|
|
|
n = min(n, self.max_size)
|
|
for i in range(0, n):
|
|
self.nodes[i].stop()
|
|
|
|
def ensure_connected(self):
|
|
"""Ensure that running nodes are connected"""
|
|
online_nodes = []
|
|
for i in range(0, self.max_size):
|
|
if self.nodes[i].is_running:
|
|
online_nodes.append(self.nodes[i])
|
|
|
|
for i in range(0, len(online_nodes)):
|
|
seeds = []
|
|
for j in range(i+1, len(online_nodes)):
|
|
seeds.append(online_nodes[j].tendermint_uri)
|
|
|
|
if len(seeds):
|
|
online_nodes[i].dial_seeds(seeds)
|
|
|
|
|
|
def load_validators(count):
|
|
with open('validators.json') as json_data:
|
|
return random.sample(json.load(json_data), count)
|
|
|
|
|
|
def extract_validator(priv_validator):
|
|
return {"pub_key": priv_validator['pub_key'],
|
|
"power": 10,
|
|
"name": ""}
|