Skip to content

Commit 816aef3

Browse files
authored
feat: slash truncated checkpoint proposals (#23250)
Fix A-520
1 parent 6eedaa5 commit 816aef3

25 files changed

Lines changed: 1155 additions & 71 deletions

File tree

spartan/aztec-node/templates/_pod-template.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,10 @@ spec:
237237
- name: SLASH_INVALID_BLOCK_PENALTY
238238
value: {{ .Values.node.slash.invalidBlockPenalty | quote }}
239239
{{- end }}
240+
{{- if .Values.node.slash.invalidCheckpointProposalPenalty }}
241+
- name: SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY
242+
value: {{ .Values.node.slash.invalidCheckpointProposalPenalty | quote }}
243+
{{- end }}
240244
{{- if .Values.node.slash.proposeInvalidAttestationsPenalty }}
241245
- name: SLASH_PROPOSE_INVALID_ATTESTATIONS_PENALTY
242246
value: {{ .Values.node.slash.proposeInvalidAttestationsPenalty | quote }}

spartan/aztec-node/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ node:
152152
inactivityPenalty: ""
153153
inactivityTargetPercentage: ""
154154
invalidBlockPenalty: ""
155+
invalidCheckpointProposalPenalty: ""
155156
proposeInvalidAttestationsPenalty: ""
156157
attestDescendantOfInvalidPenalty: ""
157158
attestInvalidCheckpointProposalPenalty: ""

spartan/environments/network-defaults.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ slasher: &slasher
143143
SLASH_UNKNOWN_PENALTY: 10e18
144144
# Penalty for broadcasting an invalid block.
145145
SLASH_INVALID_BLOCK_PENALTY: 10e18
146+
# Penalty for broadcasting an invalid checkpoint proposal.
147+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 0
146148
# L2 slots grace period before considering an offense expired.
147149
SLASH_GRACE_PERIOD_L2_SLOTS: 0
148150

@@ -247,6 +249,7 @@ networks:
247249
SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 10e18
248250
SLASH_UNKNOWN_PENALTY: 10e18
249251
SLASH_INVALID_BLOCK_PENALTY: 10e18
252+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 0
250253
SLASH_GRACE_PERIOD_L2_SLOTS: 0
251254
ENABLE_VERSION_CHECK: true
252255

@@ -293,6 +296,7 @@ networks:
293296
SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 10e18
294297
SLASH_UNKNOWN_PENALTY: 10e18
295298
SLASH_INVALID_BLOCK_PENALTY: 10e18
299+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 0
296300
SLASH_GRACE_PERIOD_L2_SLOTS: 64
297301
ENABLE_VERSION_CHECK: true
298302

@@ -353,4 +357,5 @@ networks:
353357
SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 2000e18
354358
SLASH_UNKNOWN_PENALTY: 2000e18
355359
SLASH_INVALID_BLOCK_PENALTY: 2000e18
360+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY: 0
356361
SLASH_GRACE_PERIOD_L2_SLOTS: 1200

spartan/scripts/deploy_network.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,7 @@ SLASH_ATTEST_DESCENDANT_OF_INVALID_PENALTY = ${SLASH_ATTEST_DESCENDANT_OF_INVALI
595595
SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY = ${SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY:-null}
596596
SLASH_UNKNOWN_PENALTY = ${SLASH_UNKNOWN_PENALTY:-null}
597597
SLASH_INVALID_BLOCK_PENALTY = ${SLASH_INVALID_BLOCK_PENALTY:-null}
598+
SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY = ${SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY:-null}
598599
SLASH_OFFENSE_EXPIRATION_ROUNDS = ${SLASH_OFFENSE_EXPIRATION_ROUNDS:-null}
599600
SLASH_MAX_PAYLOAD_SIZE = ${SLASH_MAX_PAYLOAD_SIZE:-null}
600601
OTEL_COLLECTOR_ENDPOINT = "${OTEL_COLLECTOR_ENDPOINT}"

spartan/terraform/deploy-aztec-infra/main.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ locals {
209209
"validator.slash.attestInvalidCheckpointProposalPenalty" = var.SLASH_ATTEST_INVALID_CHECKPOINT_PROPOSAL_PENALTY
210210
"validator.slash.unknownPenalty" = var.SLASH_UNKNOWN_PENALTY
211211
"validator.slash.invalidBlockPenalty" = var.SLASH_INVALID_BLOCK_PENALTY
212+
"validator.slash.invalidCheckpointProposalPenalty" = var.SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY
212213
"validator.slash.offenseExpirationRounds" = var.SLASH_OFFENSE_EXPIRATION_ROUNDS
213214
"validator.slash.maxPayloadSize" = var.SLASH_MAX_PAYLOAD_SIZE
214215
"validator.node.env.TRANSACTIONS_DISABLED" = var.TRANSACTIONS_DISABLED

spartan/terraform/deploy-aztec-infra/variables.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,12 @@ variable "SLASH_INVALID_BLOCK_PENALTY" {
520520
nullable = true
521521
}
522522

523+
variable "SLASH_INVALID_CHECKPOINT_PROPOSAL_PENALTY" {
524+
description = "The slash invalid checkpoint proposal penalty"
525+
type = string
526+
nullable = true
527+
}
528+
523529
variable "SLASH_OFFENSE_EXPIRATION_ROUNDS" {
524530
description = "The slash offense expiration rounds"
525531
type = string

yarn-project/aztec-node/src/aztec-node/server.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import {
4242
import { PublicContractsDB, PublicProcessorFactory } from '@aztec/simulator/server';
4343
import {
4444
AttestationsBlockWatcher,
45+
BroadcastedInvalidCheckpointProposalWatcher,
4546
EpochPruneWatcher,
4647
type SlasherClientInterface,
4748
type Watcher,
@@ -720,6 +721,7 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, AztecNodeDeb
720721
let validatorsSentinel: Awaited<ReturnType<typeof createSentinel>> | undefined;
721722
let epochPruneWatcher: EpochPruneWatcher | undefined;
722723
let attestationsBlockWatcher: AttestationsBlockWatcher | undefined;
724+
let broadcastedInvalidCheckpointProposalWatcher: BroadcastedInvalidCheckpointProposalWatcher | undefined;
723725

724726
if (!proverOnly) {
725727
validatorsSentinel = await createSentinel(epochCache, archiver, p2pClient, config);
@@ -739,6 +741,15 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, AztecNodeDeb
739741
watchers.push(epochPruneWatcher);
740742
}
741743

744+
if (config.slashBroadcastedInvalidCheckpointProposalPenalty > 0n) {
745+
broadcastedInvalidCheckpointProposalWatcher = new BroadcastedInvalidCheckpointProposalWatcher(
746+
p2pClient,
747+
epochCache,
748+
config,
749+
);
750+
watchers.push(broadcastedInvalidCheckpointProposalWatcher);
751+
}
752+
742753
// We assume we want to slash for invalid attestations unless all max penalties are set to 0
743754
if (config.slashProposeInvalidAttestationsPenalty > 0n || config.slashAttestDescendantOfInvalidPenalty > 0n) {
744755
attestationsBlockWatcher = new AttestationsBlockWatcher(archiver, epochCache, config);
@@ -762,6 +773,10 @@ export class AztecNodeService implements AztecNode, AztecNodeAdmin, AztecNodeDeb
762773
await attestationsBlockWatcher.start();
763774
started.push(attestationsBlockWatcher);
764775
}
776+
if (broadcastedInvalidCheckpointProposalWatcher) {
777+
await broadcastedInvalidCheckpointProposalWatcher.start();
778+
started.push(broadcastedInvalidCheckpointProposalWatcher);
779+
}
765780
log.info(`All p2p services started`);
766781
})
767782
.catch(err => log.error('Failed to start p2p services after archiver sync', err));

0 commit comments

Comments
 (0)