Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions yarn-project/archiver/src/archiver/archiver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
import { InboxLeaf, computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
import {
makeAndSignCommitteeAttestationsAndSigners,
makeAttestationFromCheckpoint,
makeCheckpointAttestationFromCheckpoint,
makeStateReference,
mockCheckpointAndMessages,
} from '@aztec/stdlib/testing';
Expand Down Expand Up @@ -1949,7 +1949,7 @@ describe('Archiver', () => {
*/
const makeRollupTx = (checkpoint: Checkpoint, signers: Secp256k1Signer[] = []) => {
const attestations = signers
.map(signer => makeAttestationFromCheckpoint(checkpoint, signer))
.map(signer => makeCheckpointAttestationFromCheckpoint(checkpoint, signer))
.map(attestation => CommitteeAttestation.fromSignature(attestation.signature))
.map(committeeAttestation => committeeAttestation.toViem());
const header = checkpoint.header.toViem();
Expand Down
6 changes: 3 additions & 3 deletions yarn-project/archiver/src/archiver/archiver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ function mapArchiverConfig(config: Partial<ArchiverConfig>) {
return {
pollingIntervalMs: config.archiverPollingIntervalMS,
batchSize: config.archiverBatchSize,
skipValidateBlockAttestations: config.skipValidateBlockAttestations,
skipValidateCheckpointAttestations: config.skipValidateCheckpointAttestations,
maxAllowedEthClientDriftSeconds: config.maxAllowedEthClientDriftSeconds,
ethereumAllowNoDebugHosts: config.ethereumAllowNoDebugHosts,
};
Expand Down Expand Up @@ -192,7 +192,7 @@ export class Archiver
private config: {
pollingIntervalMs: number;
batchSize: number;
skipValidateBlockAttestations?: boolean;
skipValidateCheckpointAttestations?: boolean;
maxAllowedEthClientDriftSeconds: number;
ethereumAllowNoDebugHosts?: boolean;
},
Expand Down Expand Up @@ -999,7 +999,7 @@ export class Archiver
const validCheckpoints: PublishedCheckpoint[] = [];

for (const published of publishedCheckpoints) {
const validationResult = this.config.skipValidateBlockAttestations
const validationResult = this.config.skipValidateCheckpointAttestations
? { valid: true as const }
: await validateCheckpointAttestations(published, this.epochCache, this.l1constants, this.log);

Expand Down
4 changes: 2 additions & 2 deletions yarn-project/archiver/src/archiver/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ export const archiverConfigMappings: ConfigMappingsType<ArchiverConfig> = {
parseEnv: (val: string | undefined) => (val ? +val : undefined),
description: 'The maximum possible size of the archiver DB in KB. Overwrites the general dataStoreMapSizeKb.',
},
skipValidateBlockAttestations: {
description: 'Whether to skip validating block attestations (use only for testing).',
skipValidateCheckpointAttestations: {
description: 'Skip validating checkpoint attestations (for testing purposes only)',
...booleanConfigHelper(false),
},
maxAllowedEthClientDriftSeconds: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ describe('CalldataRetriever', () => {
// Compute the expected payloadDigest using ConsensusPayload (same logic as the validator)
const checkpointHeader = CheckpointHeader.fromViem(header);
const consensusPayload = new ConsensusPayload(checkpointHeader, archiveRoot);
const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.blockAttestation);
const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation);
const expectedPayloadDigest = keccak256(payloadToSign);

const result = await retriever.getCheckpointFromRollupTx(txHash, [], checkpointNumber, {
Expand Down
4 changes: 2 additions & 2 deletions yarn-project/archiver/src/archiver/l1/calldata_retriever.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export class CalldataRetriever {
*/
async getCheckpointFromRollupTx(
txHash: `0x${string}`,
blobHashes: Buffer[],
_blobHashes: Buffer[],
checkpointNumber: CheckpointNumber,
expectedHashes: {
attestationsHash?: Hex;
Expand Down Expand Up @@ -459,7 +459,7 @@ export class CalldataRetriever {
// Use ConsensusPayload to compute the digest - this ensures we match the exact logic
// used by the network for signing and verification
const consensusPayload = new ConsensusPayload(header, archiveRoot);
const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.blockAttestation);
const payloadToSign = consensusPayload.getPayloadToSign(SignatureDomainSeparator.checkpointAttestation);
const computedPayloadDigest = keccak256(payloadToSign);

// Compare as buffers to avoid case-sensitivity and string comparison issues
Expand Down
4 changes: 2 additions & 2 deletions yarn-project/archiver/src/archiver/validation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { type Logger, createLogger } from '@aztec/foundation/log';
import { CommitteeAttestation, EthAddress } from '@aztec/stdlib/block';
import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
import { orderAttestations } from '@aztec/stdlib/p2p';
import { makeAttestationFromCheckpoint } from '@aztec/stdlib/testing';
import { makeCheckpointAttestationFromCheckpoint } from '@aztec/stdlib/testing';

import { type MockProxy, mock } from 'jest-mock-extended';
import assert from 'node:assert';
Expand All @@ -25,7 +25,7 @@ describe('validateCheckpointAttestations', () => {

const makeCheckpoint = async (signers: Secp256k1Signer[], committee: EthAddress[], slot?: number) => {
const checkpoint = await Checkpoint.random(CheckpointNumber(1), { slotNumber: SlotNumber(slot ?? 1) });
const attestations = signers.map(signer => makeAttestationFromCheckpoint(checkpoint, signer));
const attestations = signers.map(signer => makeCheckpointAttestationFromCheckpoint(checkpoint, signer));
const committeeAttestations = orderAttestations(attestations, committee);
return new PublishedCheckpoint(checkpoint, L1PublishedData.random(), committeeAttestations);
};
Expand Down
24 changes: 12 additions & 12 deletions yarn-project/aztec-node/src/sentinel/sentinel.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ import {
getAttestationInfoFromPublishedL2Block,
} from '@aztec/stdlib/block';
import { type L1RollupConstants, getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
import type { BlockAttestation } from '@aztec/stdlib/p2p';
import { makeBlockAttestation, randomPublishedL2Block } from '@aztec/stdlib/testing';
import type { CheckpointAttestation } from '@aztec/stdlib/p2p';
import { makeCheckpointAttestation, randomPublishedL2Block } from '@aztec/stdlib/testing';
import type {
ValidatorStats,
ValidatorStatusHistory,
Expand Down Expand Up @@ -90,19 +90,19 @@ describe('sentinel', () => {
let signers: Secp256k1Signer[];
let validators: EthAddress[];
let block: PublishedL2Block;
let attestations: BlockAttestation[];
let attestations: CheckpointAttestation[];
let proposer: EthAddress;
let committee: EthAddress[];

beforeEach(async () => {
signers = times(4, Secp256k1Signer.random);
validators = signers.map(signer => signer.address);
block = await randomPublishedL2Block(Number(slot));
attestations = signers.map(signer => makeBlockAttestation({ signer, archive: block.block.archive.root }));
attestations = signers.map(signer => makeCheckpointAttestation({ signer, archive: block.block.archive.root }));
proposer = validators[0];
committee = [...validators];

p2p.getAttestationsForSlot.mockResolvedValue(attestations);
p2p.getCheckpointAttestationsForSlot.mockResolvedValue(attestations);
});

it('flags block as mined', async () => {
Expand All @@ -113,13 +113,13 @@ describe('sentinel', () => {
});

it('flags block as proposed when it is not mined but there are attestations', async () => {
p2p.getAttestationsForSlot.mockResolvedValue(attestations);
p2p.getCheckpointAttestationsForSlot.mockResolvedValue(attestations);
const activity = await sentinel.getSlotActivity(slot, epoch, proposer, committee);
expect(activity[proposer.toString()]).toEqual('block-proposed');
});

it('flags block as missed when there are no attestations', async () => {
p2p.getAttestationsForSlot.mockResolvedValue([]);
p2p.getCheckpointAttestationsForSlot.mockResolvedValue([]);
const activity = await sentinel.getSlotActivity(slot, epoch, proposer, committee);
expect(activity[proposer.toString()]).toEqual('block-missed');
});
Expand All @@ -136,7 +136,7 @@ describe('sentinel', () => {
expect(attestorsFromBlock.map(a => a.toString())).toEqual(signers.slice(0, 2).map(a => a.address.toString()));

await sentinel.handleBlockStreamEvent({ type: 'blocks-added', blocks: [block] });
p2p.getAttestationsForSlot.mockResolvedValue(attestations.slice(2, 3));
p2p.getCheckpointAttestationsForSlot.mockResolvedValue(attestations.slice(2, 3));

const activity = await sentinel.getSlotActivity(slot, epoch, proposer, committee);
expect(activity[committee[1].toString()]).toEqual('attestation-sent');
Expand Down Expand Up @@ -169,7 +169,7 @@ describe('sentinel', () => {
await sentinel.handleBlockStreamEvent({ type: 'blocks-added', blocks: [block] });

// No additional attestations from p2p
p2p.getAttestationsForSlot.mockResolvedValue([]);
p2p.getCheckpointAttestationsForSlot.mockResolvedValue([]);

const activity = await sentinel.getSlotActivity(slot, epoch, proposer, committee);

Expand All @@ -184,7 +184,7 @@ describe('sentinel', () => {

it('identifies missed attestors if block is mined', async () => {
await sentinel.handleBlockStreamEvent({ type: 'blocks-added', blocks: [block] });
p2p.getAttestationsForSlot.mockResolvedValue(attestations.slice(0, -1));
p2p.getCheckpointAttestationsForSlot.mockResolvedValue(attestations.slice(0, -1));

const activity = await sentinel.getSlotActivity(slot, epoch, proposer, committee);
expect(activity[committee[1].toString()]).toEqual('attestation-sent');
Expand All @@ -193,7 +193,7 @@ describe('sentinel', () => {
});

it('identifies missed attestors if block is proposed', async () => {
p2p.getAttestationsForSlot.mockResolvedValue(attestations.slice(0, -1));
p2p.getCheckpointAttestationsForSlot.mockResolvedValue(attestations.slice(0, -1));

const activity = await sentinel.getSlotActivity(slot, epoch, proposer, committee);
expect(activity[committee[1].toString()]).toEqual('attestation-sent');
Expand All @@ -202,7 +202,7 @@ describe('sentinel', () => {
});

it('does not tag attestors as missed if there was no block and no attestations', async () => {
p2p.getAttestationsForSlot.mockResolvedValue([]);
p2p.getCheckpointAttestationsForSlot.mockResolvedValue([]);

const activity = await sentinel.getSlotActivity(slot, epoch, proposer, committee);
expect(activity[proposer.toString()]).toEqual('block-missed');
Expand Down
2 changes: 1 addition & 1 deletion yarn-project/aztec-node/src/sentinel/sentinel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ export class Sentinel extends (EventEmitter as new () => WatcherEmitter) impleme
// We gather from both p2p (contains the ones seen on the p2p layer) and archiver
// (contains the ones synced from mined blocks, which we may have missed from p2p).
const block = this.slotNumberToBlock.get(slot);
const p2pAttested = await this.p2p.getAttestationsForSlot(slot, block?.archive);
const p2pAttested = await this.p2p.getCheckpointAttestationsForSlot(slot, block?.archive);
// Filter out attestations with invalid signatures
const p2pAttestors = p2pAttested.map(a => a.getSender()).filter((s): s is EthAddress => s !== undefined);
const attestors = new Set(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,14 @@ import { getAddressFromPrivateKey } from '@aztec/ethereum/account';
import { getL1ContractsConfigEnvVars } from '@aztec/ethereum/config';
import { RollupContract } from '@aztec/ethereum/contracts';
import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
import { BlockNumber } from '@aztec/foundation/branded-types';
import { SecretValue } from '@aztec/foundation/config';
import { retryUntil } from '@aztec/foundation/retry';
import { type EthPrivateKey, KeystoreManager, loadKeystores, mergeKeystores } from '@aztec/node-keystore';
import { StatefulTestContractArtifact } from '@aztec/noir-test-contracts.js/StatefulTest';
import type { Sequencer, SequencerClient, SequencerPublisherFactory } from '@aztec/sequencer-client';
import type { TestSequencer, TestSequencerClient } from '@aztec/sequencer-client/test';
import type { BlockProposalOptions } from '@aztec/stdlib/p2p';
import type { CheckpointHeader } from '@aztec/stdlib/rollup';
import type { Tx } from '@aztec/stdlib/tx';
import type { BlockHeader, Tx } from '@aztec/stdlib/tx';
import { NodeKeystoreAdapter, ValidatorClient } from '@aztec/validator-client';

import { jest } from '@jest/globals';
Expand Down Expand Up @@ -361,8 +359,9 @@ describe('e2e_multi_validator_node', () => {

const originalCreateProposal = validatorClient.createBlockProposal.bind(validatorClient);
const createBlockProposal = (
blockNumber: BlockNumber,
header: CheckpointHeader,
blockHeader: BlockHeader,
indexWithinCheckpoint: number,
inHash: Fr,
archive: Fr,
txs: Tx[],
proposerAddress: EthAddress | undefined,
Expand All @@ -371,15 +370,15 @@ describe('e2e_multi_validator_node', () => {
if (proposerAddress) {
requestedCoinbaseAddresses.set(
proposerAddress.toString().toLowerCase(),
header.coinbase.toString().toLowerCase(),
blockHeader.globalVariables.coinbase.toString().toLowerCase(),
);
requestedFeeRecipientAddresses.set(
proposerAddress.toString().toLowerCase(),
header.feeRecipient.toString().toLowerCase(),
blockHeader.globalVariables.feeRecipient.toString().toLowerCase(),
);
}

return originalCreateProposal(blockNumber, header, archive, txs, proposerAddress, options);
return originalCreateProposal(blockHeader, indexWithinCheckpoint, inHash, archive, txs, proposerAddress, options);
};
validatorClient.createBlockProposal = jest.fn(createBlockProposal);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ describe('e2e_epochs/epochs_invalidate_block', () => {
await node.setConfig({
skipInvalidateBlockAsProposer: true,
skipCollectingAttestations: true,
skipValidateBlockAttestations: true,
skipValidateCheckpointAttestations: true,
minTxsPerBlock: 0,
});
}
Expand Down Expand Up @@ -389,7 +389,7 @@ describe('e2e_epochs/epochs_invalidate_block', () => {
await node.setConfig({
skipInvalidateBlockAsProposer: false,
skipCollectingAttestations: false,
skipValidateBlockAttestations: false,
skipValidateCheckpointAttestations: false,
});
}),
);
Expand Down
Loading
Loading