hyperledger/iroha
Iroha - A simple, decentralized ledger http://iroha.tech
yac.hpp
Go to the documentation of this file.
1 
6 #ifndef IROHA_YAC_HPP
7 #define IROHA_YAC_HPP
8 
9 #include "consensus/yac/transport/yac_network_interface.hpp" // for YacNetworkNotifications
10 #include "consensus/yac/yac_gate.hpp" // for HashGate
11 
12 #include <map>
13 #include <memory>
14 #include <unordered_set>
15 
16 #include "consensus/yac/cluster_order.hpp" // for ClusterOrdering
17 #include "consensus/yac/outcome_messages.hpp" // because messages passed by value
18 #include "consensus/yac/storage/yac_vote_storage.hpp" // for VoteStorage
19 #include "logger/logger_fwd.hpp"
20 
21 namespace iroha::consensus::yac {
22  class YacCryptoProvider;
23  class Timer;
24 
25  class Yac : public HashGate, public YacNetworkNotifications {
26  public:
31  static std::shared_ptr<Yac> create(
32  YacVoteStorage vote_storage,
33  std::shared_ptr<YacNetwork> network,
34  std::shared_ptr<YacCryptoProvider> crypto,
35  std::shared_ptr<Timer> timer,
37  Round round,
38  logger::LoggerPtr log);
39 
40  Yac(YacVoteStorage vote_storage,
41  std::shared_ptr<YacNetwork> network,
42  std::shared_ptr<YacCryptoProvider> crypto,
43  std::shared_ptr<Timer> timer,
45  Round round,
46  logger::LoggerPtr log);
47 
48  // ------|Hash gate|------
49 
50  void vote(YacHash hash,
51  ClusterOrdering order,
52  std::optional<ClusterOrdering> alternative_order =
53  std::nullopt) override;
54 
55  std::optional<Answer> processRoundSwitch(
56  consensus::Round const &round,
57  shared_model::interface::types::PeerList const &peers) override;
58 
59  // ------|Network notifications|------
60 
61  std::optional<Answer> onState(std::vector<VoteMessage> state) override;
62 
63  void stop() override;
64 
65  private:
66  // ------|Private interface|------
67 
72  void votingStep(VoteMessage vote,
73  ClusterOrdering order,
74  uint32_t attempt = 0);
75 
78 
84  std::optional<std::shared_ptr<shared_model::interface::Peer>> findPeer(
85  const VoteMessage &vote);
86 
88  void removeUnknownPeersVotes(
89  std::vector<VoteMessage> &votes,
91 
92  // ------|Apply data|------
93  std::optional<Answer> applyState(const std::vector<VoteMessage> &state);
94 
95  // ------|Propagation|------
96  void propagateState(const std::vector<VoteMessage> &msg);
97  void propagateStateDirectly(const shared_model::interface::Peer &to,
98  const std::vector<VoteMessage> &msg);
99  void tryPropagateBack(const std::vector<VoteMessage> &state);
100 
101  // ------|Logger|------
102  logger::LoggerPtr log_;
103 
104  // ------|One round|------
106  std::optional<shared_model::interface::types::PeerList> alternative_order_;
107  Round round_;
108 
109  // ------|Fields|------
110  YacVoteStorage vote_storage_;
111  std::shared_ptr<YacNetwork> network_;
112  std::shared_ptr<YacCryptoProvider> crypto_;
113  std::shared_ptr<Timer> timer_;
114  std::map<Round, std::unordered_set<VoteMessage>> future_states_;
115  };
116 } // namespace iroha::consensus::yac
117 
118 #endif // IROHA_YAC_HPP
std::optional< Answer > processRoundSwitch(consensus::Round const &round, shared_model::interface::types::PeerList const &peers) override
Definition: yac.cpp:59
Definition: cluster_order.hpp:20
Definition: peer.hpp:20
Definition: yac_hash_provider.hpp:25
void vote(YacHash hash, ClusterOrdering order, std::optional< ClusterOrdering > alternative_order=std::nullopt) override
Definition: yac.cpp:83
std::shared_ptr< Logger > LoggerPtr
Definition: logger_fwd.hpp:22
Definition: yac_gate.hpp:28
Definition: yac_vote_storage.hpp:60
static std::shared_ptr< Yac > create(YacVoteStorage vote_storage, std::shared_ptr< YacNetwork > network, std::shared_ptr< YacCryptoProvider > crypto, std::shared_ptr< Timer > timer, shared_model::interface::types::PeerList order, Round round, logger::LoggerPtr log)
Definition: yac.cpp:29
hash256_t hash(const T &pb)
Definition: pb_common.hpp:43
Definition: yac.hpp:25
void stop() override
Prevent any new outgoing network activity. Be passive.
Definition: yac.cpp:55
Yac(YacVoteStorage vote_storage, std::shared_ptr< YacNetwork > network, std::shared_ptr< YacCryptoProvider > crypto, std::shared_ptr< Timer > timer, shared_model::interface::types::PeerList order, Round round, logger::LoggerPtr log)
Definition: yac.cpp:40
Definition: vote_message.hpp:20
Definition: round.hpp:31
std::vector< std::shared_ptr< shared_model::interface::Peer > > PeerList
Type of peers collection.
Definition: types.hpp:95
std::optional< Answer > onState(std::vector< VoteMessage > state) override
Definition: yac.cpp:135
Definition: yac_network_interface.hpp:22
Definition: cluster_order.hpp:16