Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
calldata_hashing.test.cpp
Go to the documentation of this file.
2
3#include "gmock/gmock.h"
4#include <cstdint>
5#include <gtest/gtest.h>
6#include <memory>
7#include <optional>
8#include <vector>
9
20
21namespace bb::avm2::simulation {
22
23using ::testing::AllOf;
24using ::testing::ElementsAre;
25using ::testing::Field;
26using ::testing::Return;
27using ::testing::SizeIs;
28using ::testing::StrictMock;
29
31
32namespace {
33
34class CalldataHashingTest : public ::testing::Test {
35 protected:
36 CalldataHashingTest()
38 {}
39
40 uint32_t context_id = 1;
41 StrictMock<MockPoseidon2> poseidon2;
42 EventEmitter<CalldataEvent> calldata_events;
43 CalldataHasher calldata_hasher;
44};
45
46TEST_F(CalldataHashingTest, SimpleHash)
47{
48 // The hardcoded value is taken from noir-projects/aztec-nr/aztec/src/hash.nr:
49 FF hash = FF("0x191383c9f8964afd3ea8879a03b7dda65d6724773966d18dcf80e452736fc1f3");
50
51 std::vector<FF> calldata_fields = {};
52 calldata_fields.reserve(100);
53 for (uint32_t i = 0; i < 100; i++) {
54 calldata_fields.push_back(FF(i));
55 }
56
57 std::vector<FF> prepended_calldata_fields = { GENERATOR_INDEX__PUBLIC_CALLDATA };
58 prepended_calldata_fields.insert(prepended_calldata_fields.end(), calldata_fields.begin(), calldata_fields.end());
59
60 EXPECT_CALL(poseidon2, hash(prepended_calldata_fields)).WillOnce(Return(hash));
61
62 auto output_hash = calldata_hasher.compute_calldata_hash(calldata_fields);
63
64 EXPECT_EQ(output_hash, hash);
65 EXPECT_THAT(calldata_events.dump_events(),
66 AllOf(SizeIs(1),
67 ElementsAre(AllOf(Field(&CalldataEvent::context_id, 1),
69 Field(&CalldataEvent::calldata, SizeIs(100))))));
70}
71
72TEST_F(CalldataHashingTest, Hash)
73{
74 std::vector<FF> calldata = testing::random_fields(500);
75 std::vector<FF> prepended_calldata_fields = { GENERATOR_INDEX__PUBLIC_CALLDATA };
76 prepended_calldata_fields.insert(prepended_calldata_fields.end(), calldata.begin(), calldata.end());
77
78 auto hash = RawPoseidon2::hash(prepended_calldata_fields);
79 EXPECT_CALL(poseidon2, hash(prepended_calldata_fields)).WillOnce(Return(hash));
80
82 EXPECT_THAT(calldata_events.dump_events(),
83 AllOf(SizeIs(1),
84 ElementsAre(AllOf(Field(&CalldataEvent::context_id, 1),
86 Field(&CalldataEvent::calldata, calldata)))));
87}
88
89TEST_F(CalldataHashingTest, Empty)
90{
91 std::vector<FF> calldata = {};
92 // If we recieve empty calldata, we just hash the separator:
93 std::vector<FF> prepended_calldata_fields = { GENERATOR_INDEX__PUBLIC_CALLDATA };
94
95 auto hash = RawPoseidon2::hash(prepended_calldata_fields);
96 EXPECT_CALL(poseidon2, hash(prepended_calldata_fields)).WillOnce(Return(hash));
97
99 EXPECT_THAT(calldata_events.dump_events(),
100 AllOf(SizeIs(1),
101 ElementsAre(AllOf(Field(&CalldataEvent::context_id, 1),
103 Field(&CalldataEvent::calldata, calldata)))));
104}
105
106} // namespace
107} // namespace bb::avm2::simulation
#define GENERATOR_INDEX__PUBLIC_CALLDATA
FF compute_calldata_hash(std::span< const FF > calldata) override
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
void hash(State &state) noexcept
std::vector< FF > random_fields(size_t n)
Definition fixtures.cpp:23
AvmFlavorSettings::FF FF
Definition field.hpp:10
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:188
typename Flavor::FF FF
uint32_t context_id
CalldataHasher calldata_hasher
EventEmitter< CalldataEvent > calldata_events
std::vector< FF > calldata