mirror of
https://github.com/bigchaindb/bigchaindb.git
synced 2024-10-13 13:34:05 +00:00
71 lines
2.0 KiB
Python
71 lines
2.0 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:
|
|
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):
|
|
if n is None:
|
|
n = self.max_size
|
|
|
|
for i in range(0, n):
|
|
self.nodes[i].stop()
|
|
|
|
|
|
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": ""}
|