Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
public_inputs_builder.test.cpp
Go to the documentation of this file.
2
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5
6#include "barretenberg/aztec/aztec_constants.hpp"
10
11namespace bb::avm2::simulation {
12namespace {
13
14using ::testing::NiceMock;
15
16TrackedSideEffects make_distinct_storage_writes(size_t n)
17{
18 TrackedSideEffects side_effects;
19 for (size_t i = 0; i < n; ++i) {
20 // Offset by 1 so the protocol fee write at the end (i = n - 1 in the 64-entry case)
21 // doesn't collide with slot 0.
22 const FF slot = FF(static_cast<uint64_t>(i + 1));
23 const FF value = FF(static_cast<uint64_t>(i + 1) * 100);
24 side_effects.storage_writes_slots_by_insertion.push_back(slot);
25 side_effects.storage_writes_slot_to_value.emplace(slot, value);
26 }
27 return side_effects;
28}
29
30// 63 distinct user SSTOREs — exercises the documented per-tx user budget
31// (MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX). extract_outputs must accept this.
32TEST(PublicInputsBuilderExtractOutputsTest, AcceptsUserWriteBudget)
33{
34 static_assert(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX == 63);
35
36 NiceMock<MockLowLevelMerkleDB> merkle_db;
37 const auto side_effects = make_distinct_storage_writes(MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
38 ASSERT_EQ(side_effects.storage_writes_slot_to_value.size(), 63u);
39
40 PublicInputsBuilder builder;
41 EXPECT_NO_THROW(builder.extract_outputs(merkle_db,
42 /*end_gas_used=*/Gas{},
43 /*transaction_fee=*/FF(0),
44 /*reverted=*/false,
45 side_effects));
46
47 const PublicInputs public_inputs = builder.build();
48 EXPECT_EQ(public_inputs.accumulated_data_array_lengths.public_data_writes, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
49}
50
51// 64 distinct writes — the documented user budget (63) plus a single protocol fee write,
52// matching MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX. The AvmAccumulatedData layout,
53// the Noir TxEffect and the rollup blob bounds all reserve a slot for this 64th entry,
54// so extract_outputs should accept it. Today it rejects with
55// "Too many side effects ... Storage writes: 64".
56TEST(PublicInputsBuilderExtractOutputsTest, RejectsValidTotalWriteBudget)
57{
58 static_assert(MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX == MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + 1);
59
60 NiceMock<MockLowLevelMerkleDB> merkle_db;
61 const auto side_effects = make_distinct_storage_writes(MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
62 ASSERT_EQ(side_effects.storage_writes_slot_to_value.size(), 64u);
63
64 PublicInputsBuilder builder;
65 EXPECT_NO_THROW(builder.extract_outputs(merkle_db,
66 /*end_gas_used=*/Gas{},
67 /*transaction_fee=*/FF(0),
68 /*reverted=*/false,
69 side_effects))
70 << "extract_outputs should accept 64 distinct public-data writes (63 user + 1 protocol fee), "
71 << "matching MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX and the AvmAccumulatedData layout.";
72}
73
74} // namespace
75} // namespace bb::avm2::simulation
StrictMock< MockHighLevelMerkleDB > merkle_db
AluTraceBuilder builder
Definition alu.test.cpp:124
AVM range check gadget for witness generation.
AvmFlavorSettings::FF FF
Definition field.hpp:10
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)