[−][src]Crate sc_consensus_babe
BABE (Blind Assignment for Blockchain Extension)
BABE is a slot-based block production mechanism which uses a VRF PRNG to randomly perform the slot allocation. On every slot, all the authorities generate a new random number with the VRF function and if it is lower than a given threshold (which is proportional to their weight/stake) they have a right to produce a block. The proof of the VRF function execution will be used by other peer to validate the legitimacy of the slot claim.
The engine is also responsible for collecting entropy on-chain which will be used to seed the given VRF PRNG. An epoch is a contiguous number of slots under which we will be using the same authority set. During an epoch all VRF outputs produced as a result of block production will be collected on an on-chain randomness pool. Epoch changes are announced one epoch in advance, i.e. when ending epoch N, we announce the parameters (randomness, authorities, etc.) for epoch N+2.
Since the slot assignment is randomized, it is possible that a slot is assigned to multiple validators in which case we will have a temporary fork, or that a slot is assigned to no validator in which case no block is produced. Which means that block times are not deterministic.
The protocol has a parameter c
[0, 1] for which 1 - c
is the probability
of a slot being empty. The choice of this parameter affects the security of
the protocol relating to maximum tolerable network delays.
In addition to the VRF-based slot assignment described above, which we will call primary slots, the engine also supports a deterministic secondary slot assignment. Primary slots take precedence over secondary slots, when authoring the node starts by trying to claim a primary slot and falls back to a secondary slot claim attempt. The secondary slot assignment is done by picking the authority at index:
blake2_256(epoch_randomness ++ slot_number) % authorities_len
.
The fork choice rule is weight-based, where weight equals the number of primary blocks in the chain. We will pick the heaviest chain (more primary blocks) and will go with the longest one in case of a tie.
An in-depth description and analysis of the protocol can be found here: https://research.web3.foundation/en/latest/polkadot/BABE/Babe.html
Modules
authorship | BABE authority selection and slot claiming. |
Structs
BabeBlockImport | A block-import handler for BABE. |
BabeConfiguration | Configuration data used by the BABE consensus engine. |
BabeIntermediate | Intermediate value passed to block importer. |
BabeLink | State that must be shared between the import queue and the authoring logic. |
BabeParams | Parameters for BABE. |
BabeVerifier | A verifier for Babe blocks. |
Config | A slot duration. Create with |
Epoch | BABE epoch information |
NextEpochDescriptor | Information about the next epoch. This is broadcast in the first block of the epoch. |
Enums
ConsensusLog | An consensus log item for BABE. |
Constants
BABE_ENGINE_ID | The |
VRF_OUTPUT_LENGTH | Length of VRF output. |
Statics
INTERMEDIATE_KEY | Intermediate key for Babe engine. |
Traits
BabeApi | API necessary for block authorship with BABE. |
CompatibleDigestItem | A digest item which is usable with BABE consensus. |
SyncOracle | An oracle for when major synchronization work is being undertaken. |
Functions
block_import | Produce a BABE block-import object to be used later on in the construction of an import-queue. |
import_queue | Start an import queue for the BABE consensus algorithm. |
start_babe | Start the babe worker. |
Type Definitions
AuthorityId | A Babe authority identifier. Necessarily equivalent to the schnorrkel public key used in the main Babe module. If that ever changes, then this must, too. |
AuthorityPair | A Babe authority keypair. Necessarily equivalent to the schnorrkel public key used in the main Babe module. If that ever changes, then this must, too. |
AuthoritySignature | A Babe authority signature. |
BabeAuthorityWeight | The weight of an authority. |
BabeImportQueue | The BABE import queue type. |
PreDigest | A BABE pre-runtime digest for std. |
SlotNumber | A slot number. |