From f241645d1ec2a08412aa01f9bad692dbf30dce8c Mon Sep 17 00:00:00 2001 From: Rahul Garg Date: Tue, 26 Jun 2018 11:37:10 -0700 Subject: [PATCH] add status function for all modules --- src/hbbft.erl | 13 +++++++++++++ src/hbbft_acs.erl | 6 +++++- src/hbbft_bba.erl | 12 +++++++++++- src/hbbft_cc.erl | 10 +++++++++- src/hbbft_rbc.erl | 11 ++++++++++- test/hbbft_worker.erl | 5 +++++ 6 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/hbbft.erl b/src/hbbft.erl index 5447954..5c9b5cf 100644 --- a/src/hbbft.erl +++ b/src/hbbft.erl @@ -11,6 +11,7 @@ serialize/1, serialize/2, deserialize/2, + status/1, is_serialized/1]). -record(hbbft_data, { @@ -58,6 +59,18 @@ -type rbc_wrapped_output() :: hbbft_utils:unicast({{acs, non_neg_integer()}, {{rbc, non_neg_integer()}, hbbft_rbc:val_msg()}}) | hbbft_utils:multicast({{acs, non_neg_integer()}, {{rbc, non_neg_integer()}, hbbft_rbc:echo_msg() | hbbft_rbc:ready_msg()}}). -type bba_wrapped_output() :: hbbft_utils:multicast({{acs, non_neg_integer()}, hbbft_acs:bba_msg()}). + +status(HBBFT) -> + #{batch_size => HBBFT#hbbft_data.batch_size, + buf => length(HBBFT#hbbft_data.buf), + round => HBBFT#hbbft_data.round, + acs_init => HBBFT#hbbft_data.acs_init, + acs => hbbft_acs:status(HBBFT#hbbft_data.acs), + sent_txns => HBBFT#hbbft_data.sent_txns, + sent_sig => HBBFT#hbbft_data.sent_sig, + acs_results => length(HBBFT#hbbft_data.acs_results) + }. + -spec init(tpke_privkey:privkey(), pos_integer(), non_neg_integer(), non_neg_integer(), pos_integer()) -> hbbft_data(). init(SK, N, F, J, BatchSize) -> #hbbft_data{secret_key=SK, n=N, f=F, j=J, batch_size=BatchSize, acs=hbbft_acs:init(SK, N, F, J)}. diff --git a/src/hbbft_acs.erl b/src/hbbft_acs.erl index 26b3939..8e3cdeb 100644 --- a/src/hbbft_acs.erl +++ b/src/hbbft_acs.erl @@ -1,6 +1,6 @@ -module(hbbft_acs). --export([init/4, input/2, handle_msg/3, serialize/1, deserialize/2]). +-export([init/4, input/2, handle_msg/3, serialize/1, deserialize/2, status/1]). -record(rbc_state, { rbc_data :: hbbft_rbc:rbc_data(), @@ -56,6 +56,10 @@ -export_type([acs_data/0, msgs/0, bba_msg/0, acs_serialized_data/0, bba_state/0, rbc_state/0, bba_serialized_state/0, rbc_serialized_state/0]). +status(ACSData) -> + #{rbc => maps:map(fun(_K, #rbc_state{rbc_data=RBCData, result=R}) -> #{rbc => hbbft_rbc:status(RBCData), result => R} end, ACSData#acs_data.rbc), + bba => maps:map(fun(_K, #bba_state{bba_data=BBAData, result=R, input=I}) -> #{bba => hbbft_bba:status(BBAData), result => R, input => I} end, ACSData#acs_data.bba)}. + -spec init(tpke_privkey:privkey(), pos_integer(), non_neg_integer(), non_neg_integer()) -> acs_data(). init(SK, N, F, J) -> %% instantiate all the RBCs diff --git a/src/hbbft_bba.erl b/src/hbbft_bba.erl index cc8ac83..947d8f6 100644 --- a/src/hbbft_bba.erl +++ b/src/hbbft_bba.erl @@ -1,6 +1,6 @@ -module(hbbft_bba). --export([init/3, input/2, handle_msg/3, serialize/1, deserialize/2]). +-export([init/3, input/2, handle_msg/3, serialize/1, deserialize/2, status/1]). -record(bba_data, { state = init :: init | waiting | done, @@ -49,6 +49,16 @@ -export_type([bba_data/0, bba_serialized_data/0, bval_msg/0, aux_msg/0, coin_msg/0, msgs/0, conf_msg/0]). +status(BBAData) -> + #{state => BBAData#bba_data.state, + round => BBAData#bba_data.round, + coin => hbbft_cc:status(BBAData#bba_data.coin), + aux_sent => BBAData#bba_data.aux_sent, + conf_sent => BBAData#bba_data.conf_sent, + coin_sent => BBAData#bba_data.coin_sent, + output => BBAData#bba_data.output + }. + -spec init(tpke_privkey:privkey(), pos_integer(), non_neg_integer()) -> bba_data(). init(SK, N, F) -> #bba_data{secret_key=SK, n=N, f=F}. diff --git a/src/hbbft_cc.erl b/src/hbbft_cc.erl index 63ef8b0..7599f97 100644 --- a/src/hbbft_cc.erl +++ b/src/hbbft_cc.erl @@ -1,6 +1,6 @@ -module(hbbft_cc). --export([init/4, get_coin/1, handle_msg/3, serialize/1, deserialize/2]). +-export([init/4, get_coin/1, handle_msg/3, serialize/1, deserialize/2, status/1]). -record(cc_data, { state = waiting :: waiting | done, @@ -27,6 +27,14 @@ -export_type([cc_data/0, cc_serialized_data/0, share_msg/0]). + +status(undefined) -> + undefined; +status(CCData) -> + #{state => CCData#cc_data.state, + shares => CCData#cc_data.shares + }. + %% Figure12. Bullet1 %% Trusted Setup Phase: A trusted dealer runs pk, {ski } ← %% ThresholdSetup to generate a common public key, as well as diff --git a/src/hbbft_rbc.erl b/src/hbbft_rbc.erl index 03d4833..075db90 100644 --- a/src/hbbft_rbc.erl +++ b/src/hbbft_rbc.erl @@ -1,6 +1,6 @@ -module(hbbft_rbc). --export([init/4, input/2, handle_msg/3]). +-export([init/4, input/2, handle_msg/3, status/1]). -record(rbc_data, { state = init :: init | waiting | done, @@ -35,6 +35,15 @@ -export_type([rbc_data/0, val_msg/0, echo_msg/0, ready_msg/0, msgs/0]). %% API. + +status(RBCData) -> + #{state => RBCData#rbc_data.state, + num_echoes => length(maps:values(RBCData#rbc_data.num_echoes)), + num_readies => length(maps:values(RBCData#rbc_data.num_readies)), + ready_sent => RBCData#rbc_data.ready_sent, + leader => RBCData#rbc_data.leader + }. + -spec init(pos_integer(), non_neg_integer(), non_neg_integer(), non_neg_integer()) -> rbc_data(). init(N, F, Pid, Leader) -> #rbc_data{n=N, f=F, pid=Pid, leader=Leader}. diff --git a/test/hbbft_worker.erl b/test/hbbft_worker.erl index 0e79e06..0d48acf 100644 --- a/test/hbbft_worker.erl +++ b/test/hbbft_worker.erl @@ -130,6 +130,7 @@ handle_info(Msg, State) -> dispatch({NewHBBFT, {send, ToSend}}, State) -> do_send(ToSend, State), + io:format("HBBFT Status: ~p~n", [hbbft:status(NewHBBFT)]), State#state{hbbft=maybe_serialize_HBBFT(NewHBBFT, State#state.to_serialize)}; dispatch({NewHBBFT, {result, {transactions, Txns}}}, State) -> NewBlock = case State#state.blocks of @@ -140,15 +141,19 @@ dispatch({NewHBBFT, {result, {transactions, Txns}}}, State) -> #block{prev_hash=hash_block(PrevBlock), transactions=Txns, signature= <<>>} end, %% tell the badger to finish the round + io:format("HBBFT Status: ~p~n", [hbbft:status(NewHBBFT)]), dispatch(hbbft:finalize_round(maybe_deserialize_hbbft(NewHBBFT, State#state.sk), Txns, term_to_binary(NewBlock)), State#state{tempblock=NewBlock}); dispatch({NewHBBFT, {result, {signature, Sig}}}, State = #state{tempblock=NewBlock0}) -> NewBlock = NewBlock0#block{signature=Sig}, [ gen_server:cast({global, name(Dest)}, {block, NewBlock}) || Dest <- lists:seq(0, State#state.n - 1)], + io:format("HBBFT Status: ~p~n", [hbbft:status(NewHBBFT)]), dispatch(hbbft:next_round(maybe_deserialize_hbbft(NewHBBFT, State#state.sk)), State#state{blocks=[NewBlock|State#state.blocks], tempblock=undefined}); dispatch({NewHBBFT, ok}, State) -> + io:format("HBBFT Status: ~p~n", [hbbft:status(NewHBBFT)]), State#state{hbbft=maybe_serialize_HBBFT(NewHBBFT, State#state.to_serialize)}; dispatch({NewHBBFT, Other}, State) -> io:format("UNHANDLED ~p~n", [Other]), + io:format("HBBFT Status: ~p~n", [hbbft:status(NewHBBFT)]), State#state{hbbft=maybe_serialize_HBBFT(NewHBBFT, State#state.to_serialize)}; dispatch(Other, State) -> io:format("UNHANDLED2 ~p~n", [Other]),