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 = { DOM_SEP__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({ DOM_SEP__CONTRACT_CLASS_ID, artifact_hash, private_fn_root, public_bytecode_commitment });
51}
52
53FF hash_public_keys(const PublicKeys& public_keys)
54{
55 std::vector<FF> public_keys_hash_fields = public_keys.to_fields();
56
57 std::vector<FF> public_key_hash_vec{ DOM_SEP__PUBLIC_KEYS_HASH };
58 for (size_t i = 0; i < public_keys_hash_fields.size(); i += 2) {
59 public_key_hash_vec.push_back(public_keys_hash_fields[i]);
60 public_key_hash_vec.push_back(public_keys_hash_fields[i + 1]);
61 // is_infinity will be removed from address preimage, asumming false.
62 public_key_hash_vec.push_back(FF::zero());
63 }
64 return poseidon2::hash({ public_key_hash_vec });
65}
66
68{
69 FF salted_initialization_hash = poseidon2::hash({ DOM_SEP__PARTIAL_ADDRESS,
70 contract_instance.salt,
71 contract_instance.initialization_hash,
72 contract_instance.deployer });
73 FF partial_address = poseidon2::hash(
74 { DOM_SEP__PARTIAL_ADDRESS, contract_instance.original_contract_class_id, salted_initialization_hash });
75
76 FF public_keys_hash = hash_public_keys(contract_instance.public_keys);
77 FF h = poseidon2::hash({ DOM_SEP__CONTRACT_ADDRESS_V1, public_keys_hash, partial_address });
78 // This is safe since BN254_Fr < GRUMPKIN_Fr so we know there is no modulo reduction
79 grumpkin::fr h_fq = grumpkin::fr(h);
81 "Incoming viewing key is not on the curve when computing contract address");
82 return (grumpkin::g1::affine_one * h_fq + contract_instance.public_keys.incoming_viewing_key).x;
83}
84
86{
87 std::vector<FF> calldata_with_sep = { DOM_SEP__PUBLIC_CALLDATA };
88 for (const auto& value : calldata) {
89 // Note: Using `insert` breaks GCC.
90 calldata_with_sep.push_back(value);
91 }
92 return poseidon2::hash(calldata_with_sep);
93}
94
95} // namespace bb::avm2::simulation
#define BB_ASSERT(expression,...)
Definition assert.hpp:80
std::shared_ptr< Napi::ThreadSafeFunction > bytecode
#define DOM_SEP__PARTIAL_ADDRESS
#define DOM_SEP__PUBLIC_BYTECODE
#define DOM_SEP__PUBLIC_CALLDATA
#define DOM_SEP__PUBLIC_KEYS_HASH
#define DOM_SEP__CONTRACT_ADDRESS_V1
#define DOM_SEP__CONTRACT_CLASS_ID
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
constexpr bool on_curve() const noexcept
static constexpr affine_element affine_one
Definition group.hpp:48
AvmProvingInputs inputs
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_calldata_hash(std::span< const FF > calldata)
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_contract_class_id
AffinePoint incoming_viewing_key
std::vector< FF > to_fields() const