Summary
Galileo v3.0.6 enables double-sign slashing on the 0G testnet. When a validator signs conflicting votes at the same height, the consensus layer applies a balance penalty and (after the Slashing fork) coordinates on-chain stake reduction via the execution layer.
All node operators on Galileo must upgrade CL and EL before the fork timestamps below.
Testnet (Galileo) Schedule
| Milestone | UTC | Behavior |
|---|---|---|
| Slashing Fork | 2026-06-15 00:00:00 | New SSZ layout, ExecutionPayload.slashed, on-chain slashValidator system calls. Re-slash after fork triggers validator exit and proposer ban.
|
What's New
Consensus Layer (0g-chain-ng)
- CometBFT
DUPLICATE_VOTEmisbehavior → double-sign slashing in beacon state transition - Penalty: 2% of effective balance (min 1 gwei); capped at 500 0G after Slashing fork
- Up to 16 slashed validators per block (
MaxSlashedValidatorsPerPayload) ExecutionPayload.slashed/ExecutionPayloadHeader.slashedRoot(Slashing fork+)- Payload slashed list validated against CometBFT evidence at FinalizeBlock
- Backward-compatible SSZ for pre-fork blocks (528/584 → 532/616 byte layouts) — upgrade without wiping chain data
- Backward-compatible Engine JSON:
slashedomitted pre-fork to avoid EL-32602 Invalid params - Pre-fork slashed validators may still propose; only post-fork re-slash initiates exit and bans proposing
Execution Layer
0g-geth
ExecutableData.slashedinengine_newPayloadV4ProcessStakingSlashings→StakingContract.slashValidatorsystem call- Block body / P2P / RPC expose
slashed(not included in block hash)
0g-reth (+ alloy, alloy-evm)
ExecutionPayloadV3.slashed,BlockBody.slashedBlockSlashedDB table for persistenceapply_staking_slashingsexecutes on-chain slash during block execution
On-Chain Contracts
StakingContract.slashValidator(address, amount)— system-call onlyValidatorContract.slash(amount, exited)— reduces stake;exited=trueon post-fork slash path
Upgrade Instructions
- Upgrade 0g-chain-ng to
Galileo-v3.0.6. - Upgrade 0g-geth or 0g-reth to the slashing-compatible release.
- Verify Engine API JWT is configured between CL and EL.
- Restart nodes before 2026-06-15 00:00:00 UTC.
- No chain wipe required for operators upgrading from a pre-slashing build.
Breaking Changes
- SSZ layout change at Slashing fork (
ExecutionPayload528→532 bytes, header 584→616 bytes). - Engine API schema extension: post-fork
engine_newPayloadV4includes optionalslashedarray. - Pre-fork slashed validators remain active proposers until Slashing fork; re-slash after fork forces exit.
Component Versions
| Component | Tag / Branch |
|---|---|
| 0g-chain-ng (CL) | Galileo-v3.0.6
|
| 0g-geth (EL) | slashing release (align with CL) |
| 0g-reth (EL) | slashing release (align with CL) |
Verification Checklist
- CL + EL upgraded and synced before 2026-06-15 00:00:00 UTC
- Engine JWT auth working (
engine_newPayloadsucceeds on startup) - Double-sign test: CL balance penalty applied
- Post 2026-06-15:
ExecutionPayload.slashedmatches evidence; ELslashValidatorsucceeds - Pre-fork slashed validator can still propose; post-fork re-slash triggers exit
Full Changelog
- feat: Slashing fork version (testnet)
- feat: CometBFT duplicate-vote → CL double-sign slashing
- feat:
ExecutionPayload.slashed/ SSZ extension and backward-compatible decode - feat: Engine JSON fork-gating for
slashedfield - feat: Proposer ban only after post-fork slash exit (
IsProposerBannedDueToSlashing) - feat: EL
ProcessStakingSlashings/apply_staking_slashings - feat:
StakingContract.slashValidatorandValidatorContract.slash