Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: replace leveldb with lmdb for merkle trees #4119

Merged
merged 13 commits into from
Jan 26, 2024
Merged
1 change: 1 addition & 0 deletions yarn-project/acir-simulator/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
"tslib": "^2.4.0"
},
"devDependencies": {
"@aztec/kv-store": "workspace:^",
"@aztec/merkle-tree": "workspace:^",
"@aztec/noir-contracts": "workspace:^",
"@jest/globals": "^29.5.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { EthAddress } from '@aztec/foundation/eth-address';
import { Fr, GrumpkinScalar } from '@aztec/foundation/fields';
import { DebugLogger, createDebugLogger } from '@aztec/foundation/log';
import { FieldsOf } from '@aztec/foundation/types';
import { AztecLmdbStore } from '@aztec/kv-store';
import { AppendOnlyTree, Pedersen, StandardTree, newTree } from '@aztec/merkle-tree';
import {
ChildContractArtifact,
Expand All @@ -50,8 +51,6 @@ import {

import { jest } from '@jest/globals';
import { MockProxy, mock } from 'jest-mock-extended';
import { default as levelup } from 'levelup';
import { type MemDown, default as memdown } from 'memdown';
import { getFunctionSelector } from 'viem';

import { KeyPair } from '../acvm/index.js';
Expand All @@ -62,8 +61,6 @@ import { AcirSimulator } from './simulator.js';

jest.setTimeout(60_000);

const createMemDown = () => (memdown as any)() as MemDown<any, any>;

describe('Private Execution test suite', () => {
let oracle: MockProxy<DBOracle>;
let acirSimulator: AcirSimulator;
Expand Down Expand Up @@ -136,7 +133,7 @@ describe('Private Execution test suite', () => {
throw new Error(`Unknown tree ${name}`);
}
if (!trees[name]) {
const db = levelup(createMemDown());
const db = await AztecLmdbStore.openTmp();
const pedersen = new Pedersen();
trees[name] = await newTree(StandardTree, db, pedersen, name, treeHeights[name]);
}
Expand Down
3 changes: 3 additions & 0 deletions yarn-project/acir-simulator/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
{
"path": "../foundation"
},
{
"path": "../kv-store"
},
{
"path": "../merkle-tree"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ export class BlockStore {
#log = createDebugLogger('aztec:archiver:block_store');

constructor(private db: AztecKVStore) {
this.#blocks = db.createMap('archiver_blocks');
this.#blocks = db.openMap('archiver_blocks');

this.#txIndex = db.createMap('archiver_tx_index');
this.#contractIndex = db.createMap('archiver_contract_index');
this.#txIndex = db.openMap('archiver_tx_index');
this.#contractIndex = db.openMap('archiver_contract_index');
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export class ContractClassStore {
#contractClasses: AztecMap<string, Buffer>;

constructor(db: AztecKVStore) {
this.#contractClasses = db.createMap('archiver_contract_classes');
this.#contractClasses = db.openMap('archiver_contract_classes');
}

addContractClass(contractClass: ContractClassWithId): Promise<boolean> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export class ContractInstanceStore {
#contractInstances: AztecMap<string, Buffer>;

constructor(db: AztecKVStore) {
this.#contractInstances = db.createMap('archiver_contract_instances');
this.#contractInstances = db.openMap('archiver_contract_instances');
}

addContractInstance(contractInstance: ContractInstanceWithAddress): Promise<boolean> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export class ContractStore {
#log = createDebugLogger('aztec:archiver:contract_store');

constructor(private db: AztecKVStore, blockStore: BlockStore) {
this.#extendedContractData = db.createMap('archiver_extended_contract_data');
this.#extendedContractData = db.openMap('archiver_extended_contract_data');
this.#blockStore = blockStore;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { EthAddress } from '@aztec/circuits.js';
import { AztecLmdbStore } from '@aztec/kv-store';

import { describeArchiverDataStore } from '../archiver_store_test_suite.js';
Expand All @@ -8,7 +7,7 @@ describe('KVArchiverDataStore', () => {
let archiverStore: KVArchiverDataStore;

beforeEach(async () => {
archiverStore = new KVArchiverDataStore(await AztecLmdbStore.create(EthAddress.random()));
archiverStore = new KVArchiverDataStore(await AztecLmdbStore.openTmp());
});

describeArchiverDataStore('ArchiverStore', () => archiverStore);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ export class LogStore {
#log = createDebugLogger('aztec:archiver:log_store');

constructor(private db: AztecKVStore, private blockStore: BlockStore, logsMaxPageSize: number = 1000) {
this.#encryptedLogs = db.createMap('archiver_encrypted_logs');
this.#unencryptedLogs = db.createMap('archiver_unencrypted_logs');
this.#encryptedLogs = db.openMap('archiver_encrypted_logs');
this.#unencryptedLogs = db.openMap('archiver_unencrypted_logs');

this.#logsMaxPageSize = logsMaxPageSize;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ export class MessageStore {
#log = createDebugLogger('aztec:archiver:message_store');

constructor(private db: AztecKVStore) {
this.#messages = db.createMap('archiver_l1_to_l2_messages');
this.#pendingMessagesByFee = db.createCounter('archiver_messages_by_fee');
this.#lastL1BlockAddingMessages = db.createSingleton('archiver_last_l1_block_adding_messages');
this.#lastL1BlockCancellingMessages = db.createSingleton('archiver_last_l1_block_cancelling_messages');
this.#messages = db.openMap('archiver_l1_to_l2_messages');
this.#pendingMessagesByFee = db.openCounter('archiver_messages_by_fee');
this.#lastL1BlockAddingMessages = db.openSingleton('archiver_last_l1_block_adding_messages');
this.#lastL1BlockCancellingMessages = db.openSingleton('archiver_last_l1_block_cancelling_messages');
}

/**
Expand Down
6 changes: 0 additions & 6 deletions yarn-project/aztec-node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,17 +47,11 @@
"@aztec/world-state": "workspace:^",
"koa": "^2.14.2",
"koa-router": "^12.0.0",
"levelup": "^5.1.1",
"lmdb": "^2.9.1",
"memdown": "^6.1.1",
"tslib": "^2.4.0"
},
"devDependencies": {
"@jest/globals": "^29.5.0",
"@types/jest": "^29.5.0",
"@types/leveldown": "^4.0.4",
"@types/levelup": "^5.1.2",
"@types/memdown": "^3.0.0",
"@types/node": "^18.7.23",
"jest": "^29.5.0",
"ts-jest": "^29.1.0",
Expand Down
92 changes: 0 additions & 92 deletions yarn-project/aztec-node/src/aztec-node/db.ts

This file was deleted.

23 changes: 6 additions & 17 deletions yarn-project/aztec-node/src/aztec-node/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import { computeGlobalsHash, computePublicDataTreeLeafSlot } from '@aztec/circui
import { L1ContractAddresses, createEthereumChain } from '@aztec/ethereum';
import { AztecAddress } from '@aztec/foundation/aztec-address';
import { createDebugLogger } from '@aztec/foundation/log';
import { AztecLmdbStore } from '@aztec/kv-store';
import { AztecKVStore, AztecLmdbStore } from '@aztec/kv-store';
import { AztecKVTxPool, P2P, createP2PClient } from '@aztec/p2p';
import {
GlobalVariableBuilder,
Expand All @@ -56,10 +56,7 @@ import {
getConfigEnvVars as getWorldStateConfig,
} from '@aztec/world-state';

import { LevelUp } from 'levelup';

import { AztecNodeConfig } from './config.js';
import { openDb } from './db.js';

/**
* The aztec node.
Expand All @@ -78,7 +75,7 @@ export class AztecNodeService implements AztecNode {
protected readonly chainId: number,
protected readonly version: number,
protected readonly globalVariableBuilder: GlobalVariableBuilder,
protected readonly merkleTreesDb: LevelUp,
protected readonly merkleTreesDb: AztecKVStore,
private log = createDebugLogger('aztec:node'),
) {
const message =
Expand Down Expand Up @@ -106,8 +103,7 @@ export class AztecNodeService implements AztecNode {
}

const log = createDebugLogger('aztec:node');
const store = await AztecLmdbStore.create(config.l1Contracts.rollupAddress, config.dataDirectory);
const [_, worldStateDb] = await openDb(config, log);
const store = await AztecLmdbStore.open(config.l1Contracts.rollupAddress, config.dataDirectory);

// first create and sync the archiver
const archiverStore = new KVArchiverDataStore(store, config.maxLogs);
Expand All @@ -121,14 +117,9 @@ export class AztecNodeService implements AztecNode {
const p2pClient = await createP2PClient(store, config, new AztecKVTxPool(store), archiver);

// now create the merkle trees and the world state synchronizer
const merkleTrees = await MerkleTrees.new(worldStateDb);
const merkleTrees = await MerkleTrees.new(store);
const worldStateConfig: WorldStateConfig = getWorldStateConfig();
const worldStateSynchronizer = await ServerWorldStateSynchronizer.new(
worldStateDb,
merkleTrees,
archiver,
worldStateConfig,
);
const worldStateSynchronizer = new ServerWorldStateSynchronizer(store, merkleTrees, archiver, worldStateConfig);

// start both and wait for them to sync from the block source
await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]);
Expand All @@ -151,7 +142,7 @@ export class AztecNodeService implements AztecNode {
ethereumChain.chainInfo.id,
config.version,
getGlobalVariableBuilder(config),
worldStateDb,
store,
log,
);
}
Expand Down Expand Up @@ -285,8 +276,6 @@ export class AztecNodeService implements AztecNode {
await this.p2pClient.stop();
await this.worldStateSynchronizer.stop();
await this.blockSource.stop();
this.log('Closing Merkle Trees');
await this.merkleTreesDb.close();
this.log.info(`Stopped`);
}

Expand Down
16 changes: 0 additions & 16 deletions yarn-project/aztec-node/src/declaration.d.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,15 @@ import {
computeAuthWitMessageHash,
computeMessageSecretHash,
} from '@aztec/aztec.js';
import { AztecLmdbStore } from '@aztec/kv-store';
import { Pedersen, SparseTree, newTree } from '@aztec/merkle-tree';
import { SlowTreeContract, TokenBlacklistContract, TokenContract } from '@aztec/noir-contracts';

import { jest } from '@jest/globals';
import levelup from 'levelup';
import { type MemDown, default as memdown } from 'memdown';

import { setup } from './fixtures/utils.js';
import { TokenSimulator } from './simulators/token_simulator.js';

export const createMemDown = () => (memdown as any)() as MemDown<any, any>;

const TIMEOUT = 90_000;

describe('e2e_blacklist_token_contract', () => {
Expand All @@ -48,7 +45,7 @@ describe('e2e_blacklist_token_contract', () => {
const getMembershipProof = async (index: bigint, includeUncommitted: boolean) => {
return {
index,
value: Fr.fromBuffer((await slowUpdateTreeSimulator.getLeafValue(index, includeUncommitted))!),
value: Fr.fromBuffer(slowUpdateTreeSimulator.getLeafValue(index, includeUncommitted)!),
// eslint-disable-next-line camelcase
sibling_path: (await slowUpdateTreeSimulator.getSiblingPath(index, includeUncommitted)).toFieldArray(),
};
Expand Down Expand Up @@ -107,7 +104,7 @@ describe('e2e_blacklist_token_contract', () => {
slowTree = await SlowTreeContract.deploy(wallets[0]).send().deployed();

const depth = 254;
slowUpdateTreeSimulator = await newTree(SparseTree, levelup(createMemDown()), new Pedersen(), 'test', depth);
slowUpdateTreeSimulator = await newTree(SparseTree, await AztecLmdbStore.openTmp(), new Pedersen(), 'test', depth);

const deployTx = TokenBlacklistContract.deploy(wallets[0], accounts[0], slowTree.address).send({});
const receipt = await deployTx.wait();
Expand Down
Loading
Loading