Consider a group of D nodes that together run the DKG. We assign a unique index i ∈ [0, 1, ..., D-1] to each node (according to the canonical ordering from the Protocol State).

<aside> 💡 We explicitly consider the case where some DKG participants are actively malicious, trying to undermine the DKG protocol. The DKG protocol is designed to handle this as long as the number of malicious participants is below a fixed threshold. Currently, we have fixed that threshold to a protocol constant t = floor((n-1)/2)

</aside>

Hence, we assume (axiom) that the following conditions are satisfied:

High-Level Design

The last step completes the DKG

Whiteboard Messaging

Broadcast messages are implemented in the DKG smart contract. The DKG protocol requires that, for a given phase, whiteboard messages are reliably and consistently delivered to all nodes. Messages may be received in any order within a phase.

A DKG node must be able to guarantee it has received all the messages of a phase to be able to determine that phase has ended. For each epoch, the epoch smart contract determines in advance the point at which each phase ends, defined in terms of a consensus view. These are emitted in the EpochSetup service event as DKGPhase1FinalView and so on.

The DKG contract does not differentiate between messages based on the DKG phase they are part of. (⚠️ This is a change from a previous specification ⚠️)

Each DKG instance is uniquely identified by a DKG ID, composed of the chain ID of the Flow instance it is running in and the epoch counter of the epoch for which the DKG is being computed (not the current epoch while the DKG is running!). All messages must include this ID to prevent replay attacks from other DKG instances.