def draw_extra4(): n = np.arange(10, 60, 10) datas = [(n, 2 * n**2 - n - 1, 'kPBFT'), (n, n**2 + n * 3 - 2, '本协议')] draw_plt(datas=datas, xlabel='共识节点的数量', ylabel='通信量', mode='save', save_name='node & communication')
def draw_extra3_1(): """写链错误率对好写链比例的影响.""" MESSAGE_POOL_SIZE = 100 NODES = 30 ROUND = 50 P_N = 0.1 STRATEGY = 1 W = 5 P_WRITE_WRONG = np.arange(0.1, 0.5001, 0.05) P_VOTE_WRONG = [0.2, 0.3, 0.4, 0.5] res = {rate: dict() for rate in P_VOTE_WRONG} for pvw in P_VOTE_WRONG: print(f'P_VOTE_WRONG rate {pvw}') for pww in P_WRITE_WRONG: tmp = [] for _ in range(5): bc = BlockChain(message_pool_size=MESSAGE_POOL_SIZE, n=NODES, p_n=P_N, rd=ROUND, strategy=STRATEGY, w=W, p_write_wrong=pww, p_vote_wrong=pvw, verbose=False) write_stat = bc.start() tmp.append(write_stat['bc_good_prob_in_append']) res[pvw][pww] = np.mean(tmp) # 绘制结果曲线 draw_plt(datas=[(res[k].keys(), res[k].values(), f'投票错误的概率={k}') for k in P_VOTE_WRONG], xlabel='领导节点发布错误区块的概率', ylabel='正确区块所占比例', mode='save', save_name='Block Chain pww & writerate')
def draw_extra1_1(): """全节点转共识节点概率对上链比例的影响.""" MESSAGE_POOL_SIZE = 1000 NODES = 30 ROUND = [20, 50, 100] P_N = np.arange(0.1, 1.01, 0.1) STRATEGY = 1 W = 5 P_WRITE_WRONG = 0.2 P_VOTE_WRONG = 0.2 res = {rd: dict() for rd in ROUND} for rd in ROUND: print(f'Round {rd}') for pn in P_N: tmp = [] for _ in range(5): bc = BlockChain(message_pool_size=MESSAGE_POOL_SIZE, n=NODES, p_n=pn, rd=rd, strategy=STRATEGY, w=W, p_write_wrong=P_WRITE_WRONG, p_vote_wrong=P_VOTE_WRONG, verbose=False) write_stat = bc.start() tmp.append(write_stat['bc_good_prob']) res[rd][pn] = np.mean(tmp) # 绘制结果曲线 draw_plt(datas=[(res[k].keys(), res[k].values(), f' ={k}') for k in ROUND], xlabel='Probability of Consensus Nodes from Full Nodes', ylabel='Good Write Probability', mode='show', save_name='Block Chain p_n & goodwriterate & round')
def draw3(): params = { 'message_pool_size': 10000, 'n': 60, 'rd': [2000, 5000, 10000], 'p_n': np.arange(0.1, 1.01, 0.1), 'strategy': 1, 'w': 5, } res = dict() for rd in params['rd']: res[rd] = dict() for rd in params['rd']: print('rd %d' % rd) for p_n in params['p_n']: p_n = round(p_n, 2) tmp = [] for _ in range(5): bc = BlockChain(message_pool_size=params['message_pool_size'], n=params['n'], p_n=p_n, rd=rd, strategy=params['strategy'], w=params['w'], verbose=False) tmp.append(bc.start()['bc_size']) res[rd][p_n] = np.mean(tmp) / (3 * params['n'] * p_n - 2) # 绘制结果曲线 draw_plt(datas=[(res[k].keys(), res[k].values(), f'通信量={k}') for k in [2000, 5000, 10000]], xlabel='全节点的活跃度', ylabel='领导节点产生的轮数', mode='save', save_name='Block Chain p_n & Leader Node Counts n=60')