Skip to content

Commit a6725b2

Browse files
committed
feat!: add immutables_hash to contract instance
1 parent 999138f commit a6725b2

38 files changed

Lines changed: 108 additions & 20 deletions

File tree

barretenberg/cpp/pil/vm2/bytecode/contract_instance_retrieval.pil

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,20 @@ include "update_check.pil";
5353
* caller.exists,
5454
* caller.deployer_addr, // situational - only if caller needs it
5555
* caller.current_class_id,
56-
* caller.init_hash // situational - only if caller needs it
56+
* caller.init_hash, // situational - only if caller needs it
57+
* caller.immutables_hash // situational - only if caller needs it
5758
* } in contract_instance_retrieval.sel {
5859
* contract_instance_retrieval.address,
5960
* contract_instance_retrieval.nullifier_tree_root,
6061
* contract_instance_retrieval.public_data_tree_root,
6162
* contract_instance_retrieval.exists,
6263
* contract_instance_retrieval.deployer_addr,
6364
* contract_instance_retrieval.current_class_id,
64-
* contract_instance_retrieval.init_hash
65+
* contract_instance_retrieval.init_hash,
66+
* contract_instance_retrieval.immutables_hash
6567
* };
6668
*
67-
* Situational columns (deployer_addr, init_hash) can be omitted if the caller doesn't need
69+
* Situational columns (deployer_addr, init_hash, immutables_hash) can be omitted if the caller doesn't need
6870
* them. When omitted, they are only hinted for address derivation. This is secure because
6971
* incorrect values would break derivation of the given address.
7072
*
@@ -103,6 +105,7 @@ namespace contract_instance_retrieval;
103105
pol commit current_class_id;
104106
pol commit original_class_id; // HINTED!
105107
pol commit init_hash;
108+
pol commit immutables_hash;
106109

107110
// Current state — these should be looked up and constrained by the caller.
108111
pol commit nullifier_tree_root;
@@ -242,6 +245,8 @@ namespace contract_instance_retrieval;
242245
sel * (1 - exists) * original_class_id = 0; // technically not needed since original_class_id is hinted, but good for consistency
243246
#[INSTANCE_MEMBER_INIT_HASH_IS_ZERO_IF_DNE]
244247
sel * (1 - exists) * init_hash = 0;
248+
#[INSTANCE_MEMBER_IMMUTABLES_HASH_IS_ZERO_IF_DNE]
249+
sel * (1 - exists) * immutables_hash = 0;
245250

246251
// Address derivation lookup (only if the nullifier exists or for protocol contract instances).
247252
#[ADDRESS_DERIVATION]

barretenberg/cpp/src/barretenberg/vm2/common/avm_io.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ struct ContractInstanceHint {
135135
ContractClassId current_contract_class_id;
136136
ContractClassId original_contract_class_id;
137137
FF initialization_hash;
138+
FF immutables_hash;
138139
PublicKeysHint public_keys;
139140

140141
bool operator==(const ContractInstanceHint& other) const = default;
@@ -146,6 +147,7 @@ struct ContractInstanceHint {
146147
current_contract_class_id,
147148
original_contract_class_id,
148149
initialization_hash,
150+
immutables_hash,
149151
public_keys);
150152
};
151153

barretenberg/cpp/src/barretenberg/vm2/common/aztec_types.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ struct ContractInstance {
119119
ContractClassId current_contract_class_id = 0;
120120
ContractClassId original_contract_class_id = 0;
121121
FF initialization_hash = 0;
122-
PublicKeys public_keys;
122+
FF immutables_hash = 0;
123+
PublicKeys public_keys{};
123124

124125
bool operator==(const ContractInstance& other) const = default;
125126

@@ -136,6 +137,8 @@ struct ContractInstance {
136137
original_contract_class_id,
137138
"initializationHash",
138139
initialization_hash,
140+
"immutablesHash",
141+
immutables_hash,
139142
"publicKeys",
140143
public_keys);
141144
}

barretenberg/cpp/src/barretenberg/vm2/constraining/relations/contract_instance_retrieval.test.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ ContractInstance create_test_contract_instance(uint32_t salt_value = 123)
4545
.current_contract_class_id = FF(0xdeadbeefULL),
4646
.original_contract_class_id = FF(0xcafebabeULL),
4747
.initialization_hash = FF(0x11111111ULL),
48+
.immutables_hash = FF(0x22222222ULL),
4849
.public_keys =
4950
PublicKeys{
5051
.nullifier_key = { FF(0x100), FF(0x101) },
@@ -72,6 +73,7 @@ TEST(ContractInstanceRetrievalConstrainingTest, CompleteValidTrace)
7273
const auto current_class_id = FF(0xdeadbeefULL);
7374
const auto original_class_id = FF(0xcafebabeULL);
7475
const auto init_hash = FF(0x11111111ULL);
76+
const auto immutables_hash = FF(0x22222222ULL);
7577
const auto nullifier_key_x = FF(0x100);
7678
const auto nullifier_key_y = FF(0x101);
7779
const auto incoming_viewing_key_x = FF(0x200);
@@ -92,6 +94,7 @@ TEST(ContractInstanceRetrievalConstrainingTest, CompleteValidTrace)
9294
{ C::contract_instance_retrieval_current_class_id, current_class_id },
9395
{ C::contract_instance_retrieval_original_class_id, original_class_id },
9496
{ C::contract_instance_retrieval_init_hash, init_hash },
97+
{ C::contract_instance_retrieval_immutables_hash, immutables_hash },
9598
{ C::contract_instance_retrieval_public_data_tree_root, public_data_tree_root },
9699
{ C::contract_instance_retrieval_nullifier_tree_root, nullifier_tree_root },
97100
{ C::contract_instance_retrieval_nullifier_tree_height, NULLIFIER_TREE_HEIGHT },
@@ -147,6 +150,7 @@ TEST(ContractInstanceRetrievalConstrainingTest, MultipleInstancesTrace)
147150
{ C::contract_instance_retrieval_current_class_id, contract_instance.current_contract_class_id },
148151
{ C::contract_instance_retrieval_original_class_id, contract_instance.original_contract_class_id },
149152
{ C::contract_instance_retrieval_init_hash, contract_instance.initialization_hash },
153+
{ C::contract_instance_retrieval_immutables_hash, contract_instance.immutables_hash },
150154
{ C::contract_instance_retrieval_public_data_tree_root, FF(base_public_data_tree_root + i) },
151155
{ C::contract_instance_retrieval_nullifier_tree_root, FF(base_nullifier_tree_root + i) },
152156
{ C::contract_instance_retrieval_nullifier_tree_height, NULLIFIER_TREE_HEIGHT },
@@ -199,6 +203,7 @@ TEST(ContractInstanceRetrievalConstrainingTest, NonExistentInstanceTrace)
199203
{ C::contract_instance_retrieval_current_class_id, 0 },
200204
{ C::contract_instance_retrieval_original_class_id, 0 },
201205
{ C::contract_instance_retrieval_init_hash, 0 },
206+
{ C::contract_instance_retrieval_immutables_hash, 0 },
202207
{ C::contract_instance_retrieval_public_data_tree_root, public_data_tree_root },
203208
{ C::contract_instance_retrieval_nullifier_tree_root, nullifier_tree_root },
204209
{ C::contract_instance_retrieval_nullifier_tree_height, NULLIFIER_TREE_HEIGHT },
@@ -242,6 +247,12 @@ TEST(ContractInstanceRetrievalConstrainingTest, NonExistentInstanceTrace)
242247
"INSTANCE_MEMBER_INIT_HASH_IS_ZERO_IF_DNE");
243248
// reset
244249
trace.set(C::contract_instance_retrieval_init_hash, 1, 0);
250+
// mutate immutables_hash
251+
trace.set(C::contract_instance_retrieval_immutables_hash, 1, 1);
252+
EXPECT_THROW_WITH_MESSAGE(check_relation<contract_instance_retrieval>(trace),
253+
"INSTANCE_MEMBER_IMMUTABLES_HASH_IS_ZERO_IF_DNE");
254+
// reset
255+
trace.set(C::contract_instance_retrieval_immutables_hash, 1, 0);
245256
}
246257

247258
TEST(ContractInstanceRetrievalConstrainingTest, MaximumFieldValuesTrace)
@@ -260,6 +271,7 @@ TEST(ContractInstanceRetrievalConstrainingTest, MaximumFieldValuesTrace)
260271
{ C::contract_instance_retrieval_current_class_id, max_field },
261272
{ C::contract_instance_retrieval_original_class_id, max_field },
262273
{ C::contract_instance_retrieval_init_hash, max_field },
274+
{ C::contract_instance_retrieval_immutables_hash, max_field },
263275
{ C::contract_instance_retrieval_public_data_tree_root, max_field },
264276
{ C::contract_instance_retrieval_nullifier_tree_root, max_field },
265277
{ C::contract_instance_retrieval_nullifier_tree_height, NULLIFIER_TREE_HEIGHT },

barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp

Lines changed: 5 additions & 5 deletions
Large diffs are not rendered by default.

barretenberg/cpp/src/barretenberg/vm2/generated/flavor_variables.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,10 @@ namespace bb::avm2 {
141141

142142
struct AvmFlavorVariables {
143143
static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 119;
144-
static constexpr size_t NUM_WITNESS_ENTITIES = 2955;
144+
static constexpr size_t NUM_WITNESS_ENTITIES = 2956;
145145
static constexpr size_t NUM_SHIFTED_ENTITIES = 364;
146-
static constexpr size_t NUM_WIRES = 2511;
147-
static constexpr size_t NUM_ALL_ENTITIES = 3438;
146+
static constexpr size_t NUM_WIRES = 2512;
147+
static constexpr size_t NUM_ALL_ENTITIES = 3439;
148148

149149
// Need to be templated for recursive verifier
150150
template <typename FF_>

barretenberg/cpp/src/barretenberg/vm2/generated/relations/contract_instance_retrieval.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ template <typename FF_> class contract_instance_retrievalImpl {
1414
public:
1515
using FF = FF_;
1616

17-
static constexpr std::array<size_t, 18> SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 3, 2, 3, 3, 5, 3, 3,
18-
3, 3, 4, 4, 4, 4, 4, 4, 3 };
17+
static constexpr std::array<size_t, 19> SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 3, 2, 3, 3, 5, 3, 3, 3,
18+
3, 4, 4, 4, 4, 4, 4, 4, 3 };
1919

2020
template <typename AllEntities> inline static bool skip(const AllEntities& in)
2121
{
@@ -47,6 +47,7 @@ template <typename FF> class contract_instance_retrieval : public Relation<contr
4747
static constexpr size_t SR_INSTANCE_MEMBER_CLASS_ID_IS_ZERO_IF_DNE = 14;
4848
static constexpr size_t SR_INSTANCE_MEMBER_ORIGINAL_CLASS_ID_IS_ZERO_IF_DNE = 15;
4949
static constexpr size_t SR_INSTANCE_MEMBER_INIT_HASH_IS_ZERO_IF_DNE = 16;
50+
static constexpr size_t SR_INSTANCE_MEMBER_IMMUTABLES_HASH_IS_ZERO_IF_DNE = 17;
5051

5152
static std::string get_subrelation_label(size_t index)
5253
{
@@ -73,6 +74,8 @@ template <typename FF> class contract_instance_retrieval : public Relation<contr
7374
return "INSTANCE_MEMBER_ORIGINAL_CLASS_ID_IS_ZERO_IF_DNE";
7475
case SR_INSTANCE_MEMBER_INIT_HASH_IS_ZERO_IF_DNE:
7576
return "INSTANCE_MEMBER_INIT_HASH_IS_ZERO_IF_DNE";
77+
case SR_INSTANCE_MEMBER_IMMUTABLES_HASH_IS_ZERO_IF_DNE:
78+
return "INSTANCE_MEMBER_IMMUTABLES_HASH_IS_ZERO_IF_DNE";
7679
}
7780
return std::to_string(index);
7881
}

barretenberg/cpp/src/barretenberg/vm2/generated/relations/contract_instance_retrieval_impl.hpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,19 @@ void contract_instance_retrievalImpl<FF_>::accumulate(ContainerOverSubrelations&
148148
static_cast<View>(in.get(C::contract_instance_retrieval_init_hash));
149149
std::get<16>(evals) += (tmp * scaling_factor);
150150
}
151-
{
151+
{ // INSTANCE_MEMBER_IMMUTABLES_HASH_IS_ZERO_IF_DNE
152152
using View = typename std::tuple_element_t<17, ContainerOverSubrelations>::View;
153+
auto tmp = static_cast<View>(in.get(C::contract_instance_retrieval_sel)) *
154+
(FF(1) - static_cast<View>(in.get(C::contract_instance_retrieval_exists))) *
155+
static_cast<View>(in.get(C::contract_instance_retrieval_immutables_hash));
156+
std::get<17>(evals) += (tmp * scaling_factor);
157+
}
158+
{
159+
using View = typename std::tuple_element_t<18, ContainerOverSubrelations>::View;
153160
auto tmp = (static_cast<View>(in.get(C::contract_instance_retrieval_should_check_for_update)) -
154161
static_cast<View>(in.get(C::contract_instance_retrieval_should_check_nullifier)) *
155162
static_cast<View>(in.get(C::contract_instance_retrieval_exists)));
156-
std::get<17>(evals) += (tmp * scaling_factor);
163+
std::get<18>(evals) += (tmp * scaling_factor);
157164
}
158165
}
159166

barretenberg/cpp/src/barretenberg/vm2/simulation/lib/hinting_dbs.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ std::optional<ContractInstance> HintingContractsDB::get_contract_instance(const
3131
.current_contract_class_id = instance->current_contract_class_id,
3232
.original_contract_class_id = instance->original_contract_class_id,
3333
.initialization_hash = instance->initialization_hash,
34+
.immutables_hash = instance->immutables_hash,
3435
.public_keys =
3536
PublicKeysHint{ .master_nullifier_public_key = instance->public_keys.nullifier_key,
3637
.master_incoming_viewing_public_key = instance->public_keys.incoming_viewing_key,

barretenberg/cpp/src/barretenberg/vm2/simulation/lib/raw_data_dbs.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ std::optional<ContractInstance> HintedRawContractDB::get_contract_instance(const
113113
.current_contract_class_id = contract_instance_hint.current_contract_class_id,
114114
.original_contract_class_id = contract_instance_hint.original_contract_class_id,
115115
.initialization_hash = contract_instance_hint.initialization_hash,
116+
.immutables_hash = contract_instance_hint.immutables_hash,
116117
.public_keys =
117118
PublicKeys{
118119
.nullifier_key = contract_instance_hint.public_keys.master_nullifier_public_key,

0 commit comments

Comments
 (0)