Skip to content
Merged
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: 4 additions & 0 deletions noir-projects/contract-snapshots/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ const EXPAND_CASES: &[(&str, &str)] = &[
"avm_gadgets_test_contract",
"../noir-contracts/contracts/test/avm_gadgets_test_contract",
),
(
"public_fns_with_emit_repro_contract",
"../noir-contracts/contracts/test/public_fns_with_emit_repro_contract",
),
];

fn main() {
Expand Down

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions noir-projects/noir-contracts/Nargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ members = [
"contracts/test/parent_contract",
"contracts/test/pending_note_hashes_contract",
"contracts/test/private_init_test_contract",
"contracts/test/public_fns_with_emit_repro_contract",
"contracts/test/public_immutable_contract",
"contracts/test/returning_tuple_contract",
"contracts/test/scope_test_contract",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "public_fns_with_emit_repro_contract"
authors = [""]
compiler_version = ">=0.25.0"
type = "contract"

[dependencies]
aztec = { path = "../../../../aztec-nr/aztec" }
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
use aztec::macros::aztec;

/// Bytecode-shape repro from https://github.com/AztecProtocol/aztec-nr/issues/35.
///
/// 15 `#[external("public")]` functions, each doing one storage read, one storage write,
/// and one `self.emit(Updated { .. })`. Pinned here so that:
/// - `nargo expand` is snapshotted in `noir-projects/contract-snapshots`, making any
/// change to the macro boilerplate visible across all 15 call sites in a single review.
/// - `bytecodeSizeBytes/PublicFnsWithEmitRepro` lands on the bench dashboard, so any
/// improvement (or regression) in the per-public-fn emit shape is tracked over time.
#[aztec]
pub contract PublicFnsWithEmitRepro {
use aztec::macros::events::event;
use aztec::macros::functions::external;
use aztec::macros::storage::storage;
use aztec::state_vars::PublicMutable;

#[event]
struct Updated {
new_value: u64,
}

#[storage]
struct Storage<Context> {
value: PublicMutable<u64, Context>,
}

#[external("public")]
fn fn_01(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 1);
self.emit(Updated { new_value: old + v + 1 });
}
#[external("public")]
fn fn_02(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 2);
self.emit(Updated { new_value: old + v + 2 });
}
#[external("public")]
fn fn_03(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 3);
self.emit(Updated { new_value: old + v + 3 });
}
#[external("public")]
fn fn_04(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 4);
self.emit(Updated { new_value: old + v + 4 });
}
#[external("public")]
fn fn_05(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 5);
self.emit(Updated { new_value: old + v + 5 });
}
#[external("public")]
fn fn_06(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 6);
self.emit(Updated { new_value: old + v + 6 });
}
#[external("public")]
fn fn_07(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 7);
self.emit(Updated { new_value: old + v + 7 });
}
#[external("public")]
fn fn_08(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 8);
self.emit(Updated { new_value: old + v + 8 });
}
#[external("public")]
fn fn_09(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 9);
self.emit(Updated { new_value: old + v + 9 });
}
#[external("public")]
fn fn_10(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 10);
self.emit(Updated { new_value: old + v + 10 });
}
#[external("public")]
fn fn_11(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 11);
self.emit(Updated { new_value: old + v + 11 });
}
#[external("public")]
fn fn_12(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 12);
self.emit(Updated { new_value: old + v + 12 });
}
#[external("public")]
fn fn_13(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 13);
self.emit(Updated { new_value: old + v + 13 });
}
#[external("public")]
fn fn_14(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 14);
self.emit(Updated { new_value: old + v + 14 });
}
#[external("public")]
fn fn_15(v: u64) {
let old = self.storage.value.read();
self.storage.value.write(old + v + 15);
self.emit(Updated { new_value: old + v + 15 });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { AMMContractArtifact } from '@aztec/noir-contracts.js/AMM';
import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token';
import { AvmGadgetsTestContractArtifact } from '@aztec/noir-test-contracts.js/AvmGadgetsTest';
import { AvmTestContractArtifact } from '@aztec/noir-test-contracts.js/AvmTest';
import { PublicFnsWithEmitReproContractArtifact } from '@aztec/noir-test-contracts.js/PublicFnsWithEmitRepro';
import { StorageProofTestContractArtifact } from '@aztec/noir-test-contracts.js/StorageProofTest';
import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
import { AztecAddress } from '@aztec/stdlib/aztec-address';
Expand Down Expand Up @@ -136,6 +137,32 @@ describe('Public TX simulator apps tests: benchmarks', () => {
expect(result.revertCode.isOK()).toBe(true);
});

it('PublicFnsWithEmitRepro contract test', async () => {
// See comments on the contract source for motivation as to including this contract in our benchmarks.
tester.setMetricsPrefix(`${metricsPrefixPrefix}PublicFnsWithEmitRepro contract tests`);
const deployer = AztecAddress.fromNumber(42);

const reproContract = await tester.registerAndDeployContract(
/*constructorArgs=*/ [],
deployer,
/*contractArtifact=*/ PublicFnsWithEmitReproContractArtifact,
);

const result = await tester.executeTxWithLabel(
/*txLabel=*/ 'PublicFnsWithEmitRepro/fn_01',
/*sender=*/ deployer,
/*setupCalls=*/ [],
/*appCalls=*/ [
{
address: reproContract.address,
fnName: 'fn_01',
args: [/*v=*/ 1n],
},
],
);
expect(result.revertCode.isOK()).toBe(true);
});

it('Storage proof test', async () => {
tester.setMetricsPrefix(`${metricsPrefixPrefix}StorageProof contract tests`);
const deployer = AztecAddress.fromNumber(42);
Expand Down
Loading