Skip to content

Commit 95932af

Browse files
committed
fix(avm)!: last_child id constraints
1 parent 78de546 commit 95932af

6 files changed

Lines changed: 184 additions & 143 deletions

File tree

barretenberg/cpp/pil/vm2/context.pil

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ namespace execution;
174174
#[BYTECODE_ID_NEXT_ROW]
175175
NOT_LAST_EXEC * DEFAULT_CTX_ROW * (bytecode_id' - bytecode_id) = 0;
176176

177-
178177
// transaction fee gets set at the start of an enqueued call and remains the same throughout
179178
// TODO(dbanks12): tracegen and test this
180179
#[TRANSACTION_FEE_NEXT_ROW]
@@ -223,6 +222,17 @@ namespace execution;
223222
NOT_LAST_EXEC * NESTED_RET_REV_ONLY * (last_child_returndata_size' - register[0]) = 0;
224223
NOT_LAST_EXEC * (sel_enter_call + sel_error) * last_child_returndata_size' = 0;
225224

225+
226+
// nested_exit_call = 1 ==> last_child_id' = context_id
227+
// sel_enter_call = 1 ==> last_child_id' = 0
228+
// otherwise ==> last_child_id' = last_child_id
229+
#[EXIT_CALL_LAST_CHILD_ID]
230+
NOT_LAST_EXEC * NESTED_RET_REV_ONLY * (last_child_id' - context_id) = 0;
231+
#[ENTER_CALL_LAST_CHILD_ID]
232+
NOT_LAST_EXEC * (sel_enter_call + sel_error) * last_child_id' = 0;
233+
#[PROPAGATE_LAST_CHILD_ID]
234+
NOT_LAST_EXEC * DEFAULT_CTX_ROW * (last_child_id' - last_child_id) = 0;
235+
226236
// nested_exit_call = 1 ==> l2_gas_limit' = parent_l2_gas_limit
227237
// sel_enter_call = 1 ==> constraints come from call logic
228238
// otherwise = 0 ==> l2_gas_limit' = l2_gas_limit

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ TEST(ContextConstrainingTest, ContextSwitchingCallReturn)
129129
{ C::execution_next_context_id, 3 },
130130
{ C::execution_context_id, 1 },
131131
{ C::execution_parent_id, 0 },
132-
{ C::execution_pc, 2 }, // Based on next_pc of CALL step
132+
{ C::execution_last_child_id, 2 }, // Previous context id
133+
{ C::execution_pc, 2 }, // Based on next_pc of CALL step
133134
{ C::execution_msg_sender, 0 },
134135
{ C::execution_contract_address, 0 },
135136
{ C::execution_bytecode_id, top_bytecode_id }, // Restored from context stack

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

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ namespace bb::avm2 {
133133
struct AvmFlavorVariables {
134134
static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 133;
135135
static constexpr size_t NUM_WITNESS_ENTITIES = 2927;
136-
static constexpr size_t NUM_SHIFTED_ENTITIES = 316;
136+
static constexpr size_t NUM_SHIFTED_ENTITIES = 317;
137137
static constexpr size_t NUM_WIRES = NUM_WITNESS_ENTITIES + NUM_PRECOMPUTED_ENTITIES;
138-
static constexpr size_t NUM_ALL_ENTITIES = 3376;
138+
static constexpr size_t NUM_ALL_ENTITIES = 3377;
139139

140140
// Need to be templated for recursive verifier
141141
template <typename FF_>

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

Lines changed: 73 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ template <typename FF_> class contextImpl {
1414
public:
1515
using FF = FF_;
1616

17-
static constexpr std::array<size_t, 69> SUBRELATION_PARTIAL_LENGTHS = {
18-
3, 3, 3, 3, 4, 3, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5,
19-
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5
17+
static constexpr std::array<size_t, 72> SUBRELATION_PARTIAL_LENGTHS = {
18+
3, 3, 3, 3, 4, 3, 3, 4, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 6, 5, 5,
19+
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5
2020
};
2121

2222
template <typename AllEntities> inline static bool skip(const AllEntities& in)
@@ -75,66 +75,72 @@ template <typename FF> class context : public Relation<contextImpl<FF>> {
7575
case 30:
7676
return "RD_SIZE_OFFSET_NEXT_ROW";
7777
case 33:
78-
return "L2_GAS_LIMIT_NEXT_ROW";
78+
return "EXIT_CALL_LAST_CHILD_ID";
7979
case 34:
80-
return "L2_GAS_LIMIT_RESTORE_ON_EXIT";
80+
return "ENTER_CALL_LAST_CHILD_ID";
8181
case 35:
82-
return "DA_GAS_LIMIT_NEXT_ROW";
82+
return "PROPAGATE_LAST_CHILD_ID";
8383
case 36:
84-
return "DA_GAS_LIMIT_RESTORE_ON_EXIT";
84+
return "L2_GAS_LIMIT_NEXT_ROW";
8585
case 37:
86-
return "PARENT_L2_GAS_LIMIT_NEXT_ROW";
86+
return "L2_GAS_LIMIT_RESTORE_ON_EXIT";
8787
case 38:
88-
return "PARENT_L2_GAS_LIMIT_STORE_ON_ENTER";
88+
return "DA_GAS_LIMIT_NEXT_ROW";
8989
case 39:
90-
return "PARENT_DA_GAS_LIMIT_NEXT_ROW";
90+
return "DA_GAS_LIMIT_RESTORE_ON_EXIT";
9191
case 40:
92-
return "PARENT_DA_GAS_LIMIT_STORE_ON_ENTER";
92+
return "PARENT_L2_GAS_LIMIT_NEXT_ROW";
9393
case 41:
94-
return "PARENT_L2_GAS_USED_NEXT_ROW";
94+
return "PARENT_L2_GAS_LIMIT_STORE_ON_ENTER";
9595
case 42:
96-
return "PARENT_L2_GAS_USED_STORE_ON_ENTER";
96+
return "PARENT_DA_GAS_LIMIT_NEXT_ROW";
9797
case 43:
98-
return "PARENT_DA_GAS_USED_NEXT_ROW";
98+
return "PARENT_DA_GAS_LIMIT_STORE_ON_ENTER";
9999
case 44:
100+
return "PARENT_L2_GAS_USED_NEXT_ROW";
101+
case 45:
102+
return "PARENT_L2_GAS_USED_STORE_ON_ENTER";
103+
case 46:
104+
return "PARENT_DA_GAS_USED_NEXT_ROW";
105+
case 47:
100106
return "PARENT_DA_GAS_USED_STORE_ON_ENTER";
101-
case 50:
107+
case 53:
102108
return "L2_GAS_USED_CONTINUITY";
103-
case 51:
109+
case 54:
104110
return "L2_GAS_USED_ZERO_AFTER_CALL";
105-
case 52:
111+
case 55:
106112
return "L2_GAS_USED_INGEST_AFTER_EXIT";
107-
case 53:
113+
case 56:
108114
return "DA_GAS_USED_CONTINUITY";
109-
case 54:
115+
case 57:
110116
return "DA_GAS_USED_ZERO_AFTER_CALL";
111-
case 55:
117+
case 58:
112118
return "DA_GAS_USED_INGEST_AFTER_EXIT";
113-
case 56:
119+
case 59:
114120
return "NOTE_HASH_TREE_ROOT_CONTINUITY";
115-
case 57:
121+
case 60:
116122
return "NOTE_HASH_TREE_SIZE_CONTINUITY";
117-
case 58:
123+
case 61:
118124
return "NUM_NOTE_HASHES_EMITTED_CONTINUITY";
119-
case 59:
125+
case 62:
120126
return "NULLIFIER_TREE_ROOT_CONTINUITY";
121-
case 60:
127+
case 63:
122128
return "NULLIFIER_TREE_SIZE_CONTINUITY";
123-
case 61:
129+
case 64:
124130
return "NUM_NULLIFIERS_EMITTED_CONTINUITY";
125-
case 62:
131+
case 65:
126132
return "PUBLIC_DATA_TREE_ROOT_CONTINUITY";
127-
case 63:
133+
case 66:
128134
return "PUBLIC_DATA_TREE_SIZE_CONTINUITY";
129-
case 64:
135+
case 67:
130136
return "WRITTEN_PUBLIC_DATA_SLOTS_TREE_ROOT_CONTINUITY";
131-
case 65:
137+
case 68:
132138
return "WRITTEN_PUBLIC_DATA_SLOTS_TREE_SIZE_CONTINUITY";
133-
case 66:
139+
case 69:
134140
return "L1_L2_TREE_ROOT_CONTINUITY";
135-
case 67:
141+
case 70:
136142
return "NUM_UNENCRYPTED_LOGS_CONTINUITY";
137-
case 68:
143+
case 71:
138144
return "NUM_L2_TO_L1_MESSAGES_CONTINUITY";
139145
}
140146
return std::to_string(index);
@@ -158,37 +164,40 @@ template <typename FF> class context : public Relation<contextImpl<FF>> {
158164
static constexpr size_t SR_CD_SIZE_NEXT_ROW = 25;
159165
static constexpr size_t SR_RD_OFFSET_NEXT_ROW = 27;
160166
static constexpr size_t SR_RD_SIZE_OFFSET_NEXT_ROW = 30;
161-
static constexpr size_t SR_L2_GAS_LIMIT_NEXT_ROW = 33;
162-
static constexpr size_t SR_L2_GAS_LIMIT_RESTORE_ON_EXIT = 34;
163-
static constexpr size_t SR_DA_GAS_LIMIT_NEXT_ROW = 35;
164-
static constexpr size_t SR_DA_GAS_LIMIT_RESTORE_ON_EXIT = 36;
165-
static constexpr size_t SR_PARENT_L2_GAS_LIMIT_NEXT_ROW = 37;
166-
static constexpr size_t SR_PARENT_L2_GAS_LIMIT_STORE_ON_ENTER = 38;
167-
static constexpr size_t SR_PARENT_DA_GAS_LIMIT_NEXT_ROW = 39;
168-
static constexpr size_t SR_PARENT_DA_GAS_LIMIT_STORE_ON_ENTER = 40;
169-
static constexpr size_t SR_PARENT_L2_GAS_USED_NEXT_ROW = 41;
170-
static constexpr size_t SR_PARENT_L2_GAS_USED_STORE_ON_ENTER = 42;
171-
static constexpr size_t SR_PARENT_DA_GAS_USED_NEXT_ROW = 43;
172-
static constexpr size_t SR_PARENT_DA_GAS_USED_STORE_ON_ENTER = 44;
173-
static constexpr size_t SR_L2_GAS_USED_CONTINUITY = 50;
174-
static constexpr size_t SR_L2_GAS_USED_ZERO_AFTER_CALL = 51;
175-
static constexpr size_t SR_L2_GAS_USED_INGEST_AFTER_EXIT = 52;
176-
static constexpr size_t SR_DA_GAS_USED_CONTINUITY = 53;
177-
static constexpr size_t SR_DA_GAS_USED_ZERO_AFTER_CALL = 54;
178-
static constexpr size_t SR_DA_GAS_USED_INGEST_AFTER_EXIT = 55;
179-
static constexpr size_t SR_NOTE_HASH_TREE_ROOT_CONTINUITY = 56;
180-
static constexpr size_t SR_NOTE_HASH_TREE_SIZE_CONTINUITY = 57;
181-
static constexpr size_t SR_NUM_NOTE_HASHES_EMITTED_CONTINUITY = 58;
182-
static constexpr size_t SR_NULLIFIER_TREE_ROOT_CONTINUITY = 59;
183-
static constexpr size_t SR_NULLIFIER_TREE_SIZE_CONTINUITY = 60;
184-
static constexpr size_t SR_NUM_NULLIFIERS_EMITTED_CONTINUITY = 61;
185-
static constexpr size_t SR_PUBLIC_DATA_TREE_ROOT_CONTINUITY = 62;
186-
static constexpr size_t SR_PUBLIC_DATA_TREE_SIZE_CONTINUITY = 63;
187-
static constexpr size_t SR_WRITTEN_PUBLIC_DATA_SLOTS_TREE_ROOT_CONTINUITY = 64;
188-
static constexpr size_t SR_WRITTEN_PUBLIC_DATA_SLOTS_TREE_SIZE_CONTINUITY = 65;
189-
static constexpr size_t SR_L1_L2_TREE_ROOT_CONTINUITY = 66;
190-
static constexpr size_t SR_NUM_UNENCRYPTED_LOGS_CONTINUITY = 67;
191-
static constexpr size_t SR_NUM_L2_TO_L1_MESSAGES_CONTINUITY = 68;
167+
static constexpr size_t SR_EXIT_CALL_LAST_CHILD_ID = 33;
168+
static constexpr size_t SR_ENTER_CALL_LAST_CHILD_ID = 34;
169+
static constexpr size_t SR_PROPAGATE_LAST_CHILD_ID = 35;
170+
static constexpr size_t SR_L2_GAS_LIMIT_NEXT_ROW = 36;
171+
static constexpr size_t SR_L2_GAS_LIMIT_RESTORE_ON_EXIT = 37;
172+
static constexpr size_t SR_DA_GAS_LIMIT_NEXT_ROW = 38;
173+
static constexpr size_t SR_DA_GAS_LIMIT_RESTORE_ON_EXIT = 39;
174+
static constexpr size_t SR_PARENT_L2_GAS_LIMIT_NEXT_ROW = 40;
175+
static constexpr size_t SR_PARENT_L2_GAS_LIMIT_STORE_ON_ENTER = 41;
176+
static constexpr size_t SR_PARENT_DA_GAS_LIMIT_NEXT_ROW = 42;
177+
static constexpr size_t SR_PARENT_DA_GAS_LIMIT_STORE_ON_ENTER = 43;
178+
static constexpr size_t SR_PARENT_L2_GAS_USED_NEXT_ROW = 44;
179+
static constexpr size_t SR_PARENT_L2_GAS_USED_STORE_ON_ENTER = 45;
180+
static constexpr size_t SR_PARENT_DA_GAS_USED_NEXT_ROW = 46;
181+
static constexpr size_t SR_PARENT_DA_GAS_USED_STORE_ON_ENTER = 47;
182+
static constexpr size_t SR_L2_GAS_USED_CONTINUITY = 53;
183+
static constexpr size_t SR_L2_GAS_USED_ZERO_AFTER_CALL = 54;
184+
static constexpr size_t SR_L2_GAS_USED_INGEST_AFTER_EXIT = 55;
185+
static constexpr size_t SR_DA_GAS_USED_CONTINUITY = 56;
186+
static constexpr size_t SR_DA_GAS_USED_ZERO_AFTER_CALL = 57;
187+
static constexpr size_t SR_DA_GAS_USED_INGEST_AFTER_EXIT = 58;
188+
static constexpr size_t SR_NOTE_HASH_TREE_ROOT_CONTINUITY = 59;
189+
static constexpr size_t SR_NOTE_HASH_TREE_SIZE_CONTINUITY = 60;
190+
static constexpr size_t SR_NUM_NOTE_HASHES_EMITTED_CONTINUITY = 61;
191+
static constexpr size_t SR_NULLIFIER_TREE_ROOT_CONTINUITY = 62;
192+
static constexpr size_t SR_NULLIFIER_TREE_SIZE_CONTINUITY = 63;
193+
static constexpr size_t SR_NUM_NULLIFIERS_EMITTED_CONTINUITY = 64;
194+
static constexpr size_t SR_PUBLIC_DATA_TREE_ROOT_CONTINUITY = 65;
195+
static constexpr size_t SR_PUBLIC_DATA_TREE_SIZE_CONTINUITY = 66;
196+
static constexpr size_t SR_WRITTEN_PUBLIC_DATA_SLOTS_TREE_ROOT_CONTINUITY = 67;
197+
static constexpr size_t SR_WRITTEN_PUBLIC_DATA_SLOTS_TREE_SIZE_CONTINUITY = 68;
198+
static constexpr size_t SR_L1_L2_TREE_ROOT_CONTINUITY = 69;
199+
static constexpr size_t SR_NUM_UNENCRYPTED_LOGS_CONTINUITY = 70;
200+
static constexpr size_t SR_NUM_L2_TO_L1_MESSAGES_CONTINUITY = 71;
192201
};
193202

194203
} // namespace bb::avm2

0 commit comments

Comments
 (0)