BFT finality¶
| Parameter | Value |
|---|---|
| Epoch / checkpoint spacing | 32 blocks |
| Quorum | strictly more than 2/3 of the epoch set's effective stake |
| Minimum genesis validators | 4 |
| Max link span | 4096 blocks |
| Vote transport | signed votes over authenticated JSON-RPC (g4_submitVote); certificates travel in blocks over devp2p |
Flow¶
sequenceDiagram
participant S as Validator signer
participant N as Own node
participant C as Chain
S->>N: g4_link (source = justified, target = latest checkpoint)
N-->>S: RLP vote context
S->>S: journal check (no double / surround vote), fsync
S->>N: g4_submitVote(context, signed vote)
N->>N: verify signature vs epoch set, reject stale / replayed
N->>C: certificate transaction once > 2/3 stake signed
C-->>C: justify target, finalize source
Safety mechanisms¶
- Signer journal: persistent, fsync before releasing a vote, refuses double votes (same target height, different hash) and surround votes, anchored against stale backups. Never restore it from an old backup.
- Equivocation evidence: a node that sees two conflicting votes from one validator records them (
g4_evidence) and relays a slashing transaction; 25 % of the validator's stake is burned. - Vote flood resistance: forged, malformed, stale and replayed submissions are rejected and counted
(
g4_status.vote_counters); rejected traffic cannot crowd out valid votes.
Liveness¶
With less than 2/3 of stake online, PoW block production continues but finality stalls. The candidate liveness/v1
genesis profile (experimental; active on the local testnet) adds a duty window for late certificates and force-exits
validators that carry no vote for K consecutive checkpoints (not slashed); g4_status then reports
liveness_ejected_validators and liveness_participation_records.
Sources at 72057fe3ec: testnet/release/network/network.json · core/source/cmd/pqwerai-core/g4.go
Found a problem? Report a documentation issue · Build testnet-rc1+72057fe3ec