Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
contract_crypto.cpp
Go to the documentation of this file.
2
6
7namespace bb::avm2::simulation {
8
10
12{
13 size_t bytecode_len = bytecode.size();
14
15 auto bytecode_field_at = [&](size_t i) -> FF {
16 // We need to read uint256_ts because reading FFs messes up the order of the bytes.
17 uint256_t as_int = 0;
18 if (bytecode_len - i >= 32) {
19 as_int = from_buffer<uint256_t>(bytecode, i);
20 } else {
21 std::vector<uint8_t> tail(bytecode.begin() + static_cast<ssize_t>(i), bytecode.end());
22 tail.resize(32, 0);
23 as_int = from_buffer<uint256_t>(tail, 0);
24 }
25 return as_int >> 8;
26 };
27
28 std::vector<FF> contract_bytecode_fields;
29 auto number_of_fields = (bytecode_len + 30) / 31;
30 contract_bytecode_fields.reserve(number_of_fields);
31
32 for (uint32_t i = 0; i < bytecode_len; i += 31) {
33 FF bytecode_field = bytecode_field_at(i);
34 contract_bytecode_fields.push_back(bytecode_field);
35 }
36
37 return contract_bytecode_fields;
38}
39
41{
42 std::vector<FF> inputs = { GENERATOR_INDEX__PUBLIC_BYTECODE };
43 auto bytecode_as_fields = encode_bytecode(bytecode);
44 inputs.insert(inputs.end(), bytecode_as_fields.begin(), bytecode_as_fields.end());
45 return poseidon2::hash(inputs);
46}
47
48FF compute_contract_class_id(const FF& artifact_hash, const FF& private_fn_root, const FF& public_bytecode_commitment)
49{
50 return poseidon2::hash(
51 { GENERATOR_INDEX__CONTRACT_LEAF, artifact_hash, private_fn_root, public_bytecode_commitment });
52}
53
54FF hash_public_keys(const PublicKeys& public_keys)
55{
56 std::vector<FF> public_keys_hash_fields = public_keys.to_fields();
57
58 std::vector<FF> public_key_hash_vec{ GENERATOR_INDEX__PUBLIC_KEYS_HASH };
59 for (size_t i = 0; i < public_keys_hash_fields.size(); i += 2) {
60 public_key_hash_vec.push_back(public_keys_hash_fields[i]);
61 public_key_hash_vec.push_back(public_keys_hash_fields[i + 1]);
62 // is_infinity will be removed from address preimage, asumming false.
63 public_key_hash_vec.push_back(FF::zero());
64 }
65 return poseidon2::hash({ public_key_hash_vec });
66}
67
69{
70 FF salted_initialization_hash = poseidon2::hash({ GENERATOR_INDEX__PARTIAL_ADDRESS,
71 contract_instance.salt,
72 contract_instance.initialisation_hash,
73 contract_instance.deployer_addr });
74 FF partial_address = poseidon2::hash(
75 { GENERATOR_INDEX__PARTIAL_ADDRESS, contract_instance.original_class_id, salted_initialization_hash });
76
77 FF public_keys_hash = hash_public_keys(contract_instance.public_keys);
78 FF h = poseidon2::hash({ GENERATOR_INDEX__CONTRACT_ADDRESS_V1, public_keys_hash, partial_address });
79 // This is safe since BN254_Fr < GRUMPKIN_Fr so we know there is no modulo reduction
80 grumpkin::fr h_fq = grumpkin::fr(h);
81 return (grumpkin::g1::affine_one * h_fq + contract_instance.public_keys.incoming_viewing_key).x;
82}
83
84} // namespace bb::avm2::simulation
#define GENERATOR_INDEX__CONTRACT_LEAF
#define GENERATOR_INDEX__PUBLIC_KEYS_HASH
#define GENERATOR_INDEX__PARTIAL_ADDRESS
#define GENERATOR_INDEX__PUBLIC_BYTECODE
#define GENERATOR_INDEX__CONTRACT_ADDRESS_V1
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
static constexpr affine_element affine_one
Definition group.hpp:48
FF compute_public_bytecode_commitment(std::span< const uint8_t > bytecode)
FF hash_public_keys(const PublicKeys &public_keys)
std::vector< FF > encode_bytecode(std::span< const uint8_t > bytecode)
FF compute_contract_class_id(const FF &artifact_hash, const FF &private_fn_root, const FF &public_bytecode_commitment)
FF compute_contract_address(const ContractInstance &contract_instance)
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
ContractClassId original_class_id
AffinePoint incoming_viewing_key
std::vector< FF > to_fields() const
static constexpr field zero()