Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
sklppy88 committed Nov 13, 2024
1 parent b36c137 commit 3d0a9e2
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export interface ContractArtifactDatabase {
* Adds a new contract artifact to the database or updates an existing one.
* @param id - Id of the corresponding contract class.
* @param contract - Contract artifact to add.
* @throws - If there are duplicate private function selectors.
*/
addContractArtifact(id: Fr, contract: ContractArtifact): Promise<void>;
/**
Expand Down
12 changes: 11 additions & 1 deletion yarn-project/pxe/src/database/kv_pxe_database.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
type TaggingSecret,
computePoint,
} from '@aztec/circuits.js';
import { type ContractArtifact } from '@aztec/foundation/abi';
import { type ContractArtifact, FunctionSelector, FunctionType } from '@aztec/foundation/abi';
import { toBufferBE } from '@aztec/foundation/bigint-buffer';
import { Fr } from '@aztec/foundation/fields';
import {
Expand Down Expand Up @@ -130,6 +130,16 @@ export class KVPxeDatabase implements PxeDatabase {
}

public async addContractArtifact(id: Fr, contract: ContractArtifact): Promise<void> {
const privateSelectors = contract.functions
.filter(functionArtifact => functionArtifact.functionType === FunctionType.PRIVATE)
.map(privateFunctionArtifact =>
FunctionSelector.fromNameAndParameters(privateFunctionArtifact.name, privateFunctionArtifact.parameters).toString(),
);

if (privateSelectors.length !== new Set(privateSelectors).size) {
throw new Error('Repeated function selectors of private functions');
}

await this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract));
}

Expand Down
13 changes: 13 additions & 0 deletions yarn-project/pxe/src/database/pxe_database_test_suite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ import { makeHeader } from '@aztec/circuits.js/testing';
import { randomInt } from '@aztec/foundation/crypto';
import { Fr, Point } from '@aztec/foundation/fields';
import { BenchmarkingContractArtifact } from '@aztec/noir-contracts.js/Benchmarking';
import { TestContractArtifact } from '@aztec/noir-contracts.js/Test';

import { type IncomingNoteDao } from './incoming_note_dao.js';
import { randomIncomingNoteDao } from './incoming_note_dao.test.js';
import { type OutgoingNoteDao } from './outgoing_note_dao.js';
import { randomOutgoingNoteDao } from './outgoing_note_dao.test.js';
import { type PxeDatabase } from './pxe_database.js';
import { FunctionType } from '@aztec/foundation/abi';

/**
* A common test suite for a PXE database.
Expand Down Expand Up @@ -391,6 +393,17 @@ export function describePxeDatabase(getDatabase: () => PxeDatabase) {
await expect(database.getContractArtifact(id)).resolves.toEqual(artifact);
});

it('does not store a contract artifact with a duplicate private function selector', async () => {
const artifact = TestContractArtifact;
const index = artifact.functions.findIndex(fn => fn.functionType === FunctionType.PRIVATE);

const copiedFn = structuredClone(artifact.functions[index]);
artifact.functions.push(copiedFn);

const id = Fr.random();
await expect(database.addContractArtifact(id, artifact)).rejects.toThrow('Repeated function selectors of private functions');
});

it('stores a contract instance', async () => {
const address = AztecAddress.random();
const instance = SerializableContractInstance.random().withAddress(address);
Expand Down

0 comments on commit 3d0a9e2

Please sign in to comment.