Skip to content

Commit 2ebe361

Browse files
authored
feat: derive address and class id in avm (#8897)
this PR adds tracing of the class id and contract instance when `getBytecode` (indicating a new context execution is happening in the simulator) is executed. We now derive the class id and the contract address in witgen, plus build the (unconstrained) circuit for: 1. the raw bytecode bytes, 2. the field encoded version 3. the bytecode hash derivation The circuit elements of the contract class id and address will be done in a follow up based on how we tackle nullifier request
1 parent ca3abaa commit 2ebe361

File tree

28 files changed

+1393
-881
lines changed

28 files changed

+1393
-881
lines changed

barretenberg/cpp/pil/avm/bytecode.pil

+52-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,61 @@
11
namespace bytecode(256);
22

3-
pol commit packed;
3+
// Raw bytes
4+
pol commit bytes;
5+
pol commit bytes_pc;
6+
7+
// =============== BYTECODE DECOMPOSITION =================================================
8+
// Decomposed into 35 byte chunks to parse into instructions
9+
pol commit decomposed;
10+
11+
// =============== BYTECODE ENCODING =================================================
12+
// Bytes packed into 31 byte chunks
13+
pol commit as_fields;
14+
15+
// =============== BYTECODE HASHING + ADDRESS DERIVATION =================================================
416
pol commit length_remaining;
17+
18+
// Bytecode public commitment hash
519
pol commit running_hash;
620

21+
// When this is 1, it represents when reached the end of a contract bytecode
722
pol commit end_latch;
23+
end_latch * (1 - end_latch) = 0;
24+
25+
/* Derive Class Id */
26+
pol CONTRACT_LEAF = 16;
27+
pol commit arifact_hash;
28+
pol commit private_fn_root;
29+
// class_id = H(CONTRACT_LEAF, artifact_hash, private_fn_root, running_hash)
30+
pol commit class_id;
831

9-
// TODO: Come back to this;
10-
// pol commit class_id;
11-
// pol commit contract_address;
32+
/* Derive Contract Addr*/
33+
pol CONTRACT_ADDRESS_V1 = 15;
34+
pol PARTIAL_ADDRESS = 27;
35+
// pol SALTED_INIT_HASH = H(PARTIAL_ADDR, salt, init_hash, deployer_addr);
36+
// pol PARTIAL_ADDR = H(PARTIAL_ADDR, class_id, SALTED_INIT_HASH);
37+
pol commit salt;
38+
pol commit initialization_hash;
39+
pol commit deployer_addr;
40+
// These are points in grumpkin
41+
// Nullifier Key
42+
pol commit nullifier_key_x;
43+
pol commit nullifier_key_y;
44+
// Incoming viewing public key
45+
pol commit incoming_viewing_key_x;
46+
pol commit incoming_viewing_key_y;
47+
// Outgoing viewing public key
48+
pol commit outgoing_viewing_key_x;
49+
pol commit outgoing_viewing_key_y;
50+
// Tagging viewing public key
51+
pol commit tagging_key_x;
52+
pol commit tagging_key_y;
1253

54+
// When we flat hash these points, we need to include 0 to indicate non-inf
55+
// public_key_hash = H(nullifier_key_x,nullifier_key_y,0, incoming_viewing_key_x, incoming_viewing_key_y, 0,
56+
// outgoing_viewing_key_x, outgoing_viewing_key_y, 0, tagging_key_x, tagging_key_y,0)
57+
pol commit public_key_hash;
58+
// h = H(CONTRACT_ADDRESS_V1, public_key_hash, partial_address)
59+
// contract_address = h * G + incoming_viewing_key
60+
pol commit contract_address;
1361

barretenberg/cpp/src/barretenberg/bb/main.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ void avm_prove(const std::filesystem::path& calldata_path,
972972
vinfo("hints.l1_to_l2_message_exists_hints size: ", avm_hints.l1_to_l2_message_exists_hints.size());
973973
vinfo("hints.externalcall_hints size: ", avm_hints.externalcall_hints.size());
974974
vinfo("hints.contract_instance_hints size: ", avm_hints.contract_instance_hints.size());
975+
vinfo("hints.contract_bytecode_hints size: ", avm_hints.all_contract_bytecode.size());
975976

976977
vinfo("initializing crs with size: ", avm_trace::Execution::SRS_SIZE);
977978
init_bn254_crs(avm_trace::Execution::SRS_SIZE);

barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp

+20-1
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,29 @@ AvmCircuitBuilder::ProverPolynomials AvmCircuitBuilder::compute_polynomials() co
188188
polys.binary_op_id.set_if_valid_index(i, rows[i].binary_op_id);
189189
polys.binary_sel_bin.set_if_valid_index(i, rows[i].binary_sel_bin);
190190
polys.binary_start.set_if_valid_index(i, rows[i].binary_start);
191+
polys.bytecode_arifact_hash.set_if_valid_index(i, rows[i].bytecode_arifact_hash);
192+
polys.bytecode_as_fields.set_if_valid_index(i, rows[i].bytecode_as_fields);
193+
polys.bytecode_bytes.set_if_valid_index(i, rows[i].bytecode_bytes);
194+
polys.bytecode_bytes_pc.set_if_valid_index(i, rows[i].bytecode_bytes_pc);
195+
polys.bytecode_class_id.set_if_valid_index(i, rows[i].bytecode_class_id);
196+
polys.bytecode_contract_address.set_if_valid_index(i, rows[i].bytecode_contract_address);
197+
polys.bytecode_decomposed.set_if_valid_index(i, rows[i].bytecode_decomposed);
198+
polys.bytecode_deployer_addr.set_if_valid_index(i, rows[i].bytecode_deployer_addr);
191199
polys.bytecode_end_latch.set_if_valid_index(i, rows[i].bytecode_end_latch);
200+
polys.bytecode_incoming_viewing_key_x.set_if_valid_index(i, rows[i].bytecode_incoming_viewing_key_x);
201+
polys.bytecode_incoming_viewing_key_y.set_if_valid_index(i, rows[i].bytecode_incoming_viewing_key_y);
202+
polys.bytecode_initialization_hash.set_if_valid_index(i, rows[i].bytecode_initialization_hash);
192203
polys.bytecode_length_remaining.set_if_valid_index(i, rows[i].bytecode_length_remaining);
193-
polys.bytecode_packed.set_if_valid_index(i, rows[i].bytecode_packed);
204+
polys.bytecode_nullifier_key_x.set_if_valid_index(i, rows[i].bytecode_nullifier_key_x);
205+
polys.bytecode_nullifier_key_y.set_if_valid_index(i, rows[i].bytecode_nullifier_key_y);
206+
polys.bytecode_outgoing_viewing_key_x.set_if_valid_index(i, rows[i].bytecode_outgoing_viewing_key_x);
207+
polys.bytecode_outgoing_viewing_key_y.set_if_valid_index(i, rows[i].bytecode_outgoing_viewing_key_y);
208+
polys.bytecode_private_fn_root.set_if_valid_index(i, rows[i].bytecode_private_fn_root);
209+
polys.bytecode_public_key_hash.set_if_valid_index(i, rows[i].bytecode_public_key_hash);
194210
polys.bytecode_running_hash.set_if_valid_index(i, rows[i].bytecode_running_hash);
211+
polys.bytecode_salt.set_if_valid_index(i, rows[i].bytecode_salt);
212+
polys.bytecode_tagging_key_x.set_if_valid_index(i, rows[i].bytecode_tagging_key_x);
213+
polys.bytecode_tagging_key_y.set_if_valid_index(i, rows[i].bytecode_tagging_key_y);
195214
polys.cmp_a_hi.set_if_valid_index(i, rows[i].cmp_a_hi);
196215
polys.cmp_a_lo.set_if_valid_index(i, rows[i].cmp_a_lo);
197216
polys.cmp_b_hi.set_if_valid_index(i, rows[i].cmp_b_hi);

0 commit comments

Comments
 (0)