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 = { DOM_SEP__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
63
64 EXPECT_THAT(
65 calldata_events.dump_events(),
66 AllOf(SizeIs(1),
67 ElementsAre(AllOf(Field(&CalldataEvent::context_id, 1), Field(&CalldataEvent::calldata, SizeIs(100))))));
68}
69
70TEST_F(CalldataHashingTest, Hash)
71{
72 std::vector<FF> calldata = testing::random_fields(500);
73 std::vector<FF> prepended_calldata_fields = { DOM_SEP__PUBLIC_CALLDATA };
74 prepended_calldata_fields.insert(prepended_calldata_fields.end(), calldata.begin(), calldata.end());
75
76 auto hash = RawPoseidon2::hash(prepended_calldata_fields);
77 EXPECT_CALL(poseidon2, hash(prepended_calldata_fields)).WillOnce(Return(hash));
78
80 EXPECT_THAT(
81 calldata_events.dump_events(),
82 AllOf(SizeIs(1),
83 ElementsAre(AllOf(Field(&CalldataEvent::context_id, 1), Field(&CalldataEvent::calldata, calldata)))));
84}
85
86TEST_F(CalldataHashingTest, Empty)
87{
88 std::vector<FF> calldata = {};
89 // If we recieve empty calldata, we just hash the separator:
90 std::vector<FF> prepended_calldata_fields = { DOM_SEP__PUBLIC_CALLDATA };
91
92 auto hash = RawPoseidon2::hash(prepended_calldata_fields);
93 EXPECT_CALL(poseidon2, hash(prepended_calldata_fields)).WillOnce(Return(hash));
94
96 EXPECT_THAT(
97 calldata_events.dump_events(),
98 AllOf(SizeIs(1),
99 ElementsAre(AllOf(Field(&CalldataEvent::context_id, 1), Field(&CalldataEvent::calldata, calldata)))));
100}
101
102} // namespace
103} // namespace bb::avm2::simulation
#define DOM_SEP__PUBLIC_CALLDATA
void assert_calldata_hash(const FF &cd_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:185
uint32_t context_id
CalldataHasher calldata_hasher
EventEmitter< CalldataEvent > calldata_events
std::vector< MemoryValue > calldata