Flow maintains the following information about each node that
• has a seat in the current Epoch N
• has successfully bid for a seat for the next Epoch N+1
• had a seat in the last Epoch N-1
The various details about each node are exclusively maintained by two components:
The Protocol State
is governed by the consensus committee.
• The content of the protocol state is stored by each consensus node individually. (The protocol state is not part of the execution state.) Updates to the protocol state are published in Blocks and are agreed upon through BFT consensus.
• The protocol state provides the ultimate truth about which nodes hold active seats and which nodes' seats are inactive. It only holds information that is essential for determining whether a node is authorized to participate in an Epoch or not.
The Epoch Smart Contract
runs as part of Flow's execution system and stores its internal state as part of the execution state. The main focus of the Epoch Smart Contract
is to store auxiliary information.
We distinguish between the active protocol state
for the current epoch and the protocol state under construction
for the next Epoch.
The Protocol state maintains information about the Epoch setup. This information does not change over the course of an epoch.
Constant information about the Epoch Setup
For each node in the Flow network, the protocol state maintains a respective identity
. A node's identity
might change from block to block and can be fork-specific.
See also the definition in Identity-Changing Operations.
Most of the data stored in the protocol state is constant over the course of an Epoch:
<aside>
💡 Only nodes with EpochParticipationStatusActive
are allowed to contribute to the happy-path logic for extending the current chain (see Epoch Participant Lifecycle for further details).
Nodes with status EpochParticipationStatusJoining
or EpochParticipationStatusLeaving
are allowed to join the networking communication and listen but not issue any messages for extending the chain (voting, protposing blocks, approving results etc).
Once a protocol state is finalized, where a node’s status changes to EpochParticipationStatusEjected
, all honest nodes should refuse any communication with this node and drop all existing networking connections.
</aside>