From 69ce7add75ba3268c9f6f041732fb64f02e6093b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 6 Jun 2024 19:39:13 +0000 Subject: [PATCH 01/13] added affine_element read/write; read causes build errors --- .../ecc/groups/affine_element.hpp | 18 ++++++++++++ .../ecc/groups/affine_element.test.cpp | 29 ++++++++++++++++++- .../barretenberg/polynomials/univariate.hpp | 26 ++++++++--------- 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp index e50677834e0b..78ccd6c89c0f 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp @@ -165,6 +165,24 @@ template class alignas(64) affine_ // TODO(https://github.com/AztecProtocol/barretenberg/issues/908) point at inifinty isn't handled MSGPACK_FIELDS(x, y); }; + +template +inline void read(B& it, group_elements::affine_element& element) +{ + using serialize::read; + std::vector buffer; + read(it, buffer); + element = group_elements::affine_element::serialize_from_buffer(buffer.data()); +} + +template +inline void write(B& it, group_elements::affine_element const& element) +{ + using serialize::write; + std::vector buffer(64); + group_elements::affine_element::serialize_to_buffer(element, buffer.data()); + write(it, buffer); +} } // namespace bb::group_elements #include "./affine_element_impl.hpp" diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp index 94b24d958724..d727ae880a1c 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp @@ -66,6 +66,27 @@ template class TestAffineElement : public testing::Test { } } + static void test_read_and_write() + { + // a generic point + { + affine_element P = affine_element(element::random_element()); + [[maybe_unused]] affine_element R; + + std::vector v(64); + uint8_t* ptr = v.data(); + write(ptr, P); + + // // Reset to start? + // ptr = v.data(); + + // good read + read(ptr, R); + ASSERT_TRUE(R.on_curve()); + ASSERT_TRUE(P == R); + } + } + static void test_point_compression() { for (size_t i = 0; i < 10; i++) { @@ -139,11 +160,17 @@ template class TestAffineElement : public testing::Test { } }; -using TestTypes = testing::Types; +using TestTypes = testing::Types; +// using TestTypes = testing::Types; } // namespace TYPED_TEST_SUITE(TestAffineElement, TestTypes); +TYPED_TEST(TestAffineElement, ReadWrite) +{ + TestFixture::test_read_and_write(); +} + TYPED_TEST(TestAffineElement, ReadWriteBuffer) { TestFixture::test_read_write_buffer(); diff --git a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp index 05107c33b5b4..0335db8fc12d 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp @@ -510,19 +510,19 @@ template -inline void read(B& it, Univariate& univariate) -{ - using serialize::read; - read(it, univariate.evaluations); -} - -template -inline void write(B& it, Univariate const& univariate) -{ - using serialize::write; - write(it, univariate.evaluations); -} +// template +// inline void read(B& it, Univariate& univariate) +// { +// using serialize::read; +// read(it, univariate.evaluations); +// } + +// template +// inline void write(B& it, Univariate const& univariate) +// { +// using serialize::write; +// write(it, univariate.evaluations); +// } template class UnivariateView { public: From 978f7722f97a8bb8c9554bd4dc855b93ba142a67 Mon Sep 17 00:00:00 2001 From: codygunton Date: Fri, 7 Jun 2024 09:06:31 +0000 Subject: [PATCH 02/13] Add and use DISABLE_AZTEC_VM --- barretenberg/cpp/CMakeLists.txt | 7 +++++++ barretenberg/cpp/src/CMakeLists.txt | 2 +- barretenberg/cpp/src/barretenberg/bb/main.cpp | 4 ++++ barretenberg/cpp/src/barretenberg/vm/CMakeLists.txt | 4 ++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/CMakeLists.txt b/barretenberg/cpp/CMakeLists.txt index 25a86e9b52fc..911c2b1cc799 100644 --- a/barretenberg/cpp/CMakeLists.txt +++ b/barretenberg/cpp/CMakeLists.txt @@ -27,6 +27,7 @@ endif(DOXYGEN_FOUND) option(DISABLE_ASM "Disable custom assembly" OFF) option(DISABLE_ADX "Disable ADX assembly variant" OFF) +option(DISABLE_AZTEC_VM "Don't build Aztec VM (acceptable if iterating on core proving)" ON) option(MULTITHREADING "Enable multi-threading" ON) option(OMP_MULTITHREADING "Enable OMP multi-threading" OFF) option(FUZZING "Build ONLY fuzzing harnesses" OFF) @@ -144,6 +145,12 @@ include(cmake/module.cmake) include(cmake/msgpack.cmake) include(cmake/backward-cpp.cmake) +if (NOT WASM) + set(DISABLE_AZTEC_VM ON) +endif() +if(DISABLE_AZTEC_VM) + add_definitions(-DDISABLE_AZTEC_VM=1) +endif() add_subdirectory(src) if (ENABLE_ASAN AND NOT(FUZZING)) find_program(LLVM_SYMBOLIZER_PATH NAMES llvm-symbolizer-16) diff --git a/barretenberg/cpp/src/CMakeLists.txt b/barretenberg/cpp/src/CMakeLists.txt index 96832e6a8421..be6d254b7239 100644 --- a/barretenberg/cpp/src/CMakeLists.txt +++ b/barretenberg/cpp/src/CMakeLists.txt @@ -154,7 +154,7 @@ set(BARRETENBERG_TARGET_OBJECTS $ $) -if(NOT WASM) +if(NOT DISABLE_AZTEC_VM) # enable AVM list(APPEND BARRETENBERG_TARGET_OBJECTS $) endif() diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index 03cb6b24c446..9075ac443ffc 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -514,6 +514,7 @@ void vk_as_fields(const std::string& vk_path, const std::string& output_path) } } +#ifndef DISABLE_AZTEC_VM /** * @brief Writes an avm proof and corresponding (incomplete) verification key to files. * @@ -586,6 +587,7 @@ bool avm_verify(const std::filesystem::path& proof_path, const std::filesystem:: vinfo("verified: ", verified); return verified; } +#endif /** * @brief Creates a proof for an ACIR circuit @@ -892,6 +894,7 @@ int main(int argc, char* argv[]) } else if (command == "vk_as_fields") { std::string output_path = get_option(args, "-o", vk_path + "_fields.json"); vk_as_fields(vk_path, output_path); +#ifndef DISABLE_AZTEC_VM } else if (command == "avm_prove") { std::filesystem::path avm_bytecode_path = get_option(args, "--avm-bytecode", "./target/avm_bytecode.bin"); std::filesystem::path avm_calldata_path = get_option(args, "--avm-calldata", "./target/avm_calldata.bin"); @@ -903,6 +906,7 @@ int main(int argc, char* argv[]) avm_prove(avm_bytecode_path, avm_calldata_path, avm_public_inputs_path, avm_hints_path, output_path); } else if (command == "avm_verify") { return avm_verify(proof_path, vk_path) ? 0 : 1; +#endif } else if (command == "prove_ultra_honk") { std::string output_path = get_option(args, "-o", "./proofs/proof"); prove_honk(bytecode_path, witness_path, output_path); diff --git a/barretenberg/cpp/src/barretenberg/vm/CMakeLists.txt b/barretenberg/cpp/src/barretenberg/vm/CMakeLists.txt index f0deb9a1eb71..28052bf96565 100644 --- a/barretenberg/cpp/src/barretenberg/vm/CMakeLists.txt +++ b/barretenberg/cpp/src/barretenberg/vm/CMakeLists.txt @@ -1,3 +1,3 @@ -if(NOT WASM) -barretenberg_module(vm honk sumcheck) +if(NOT DISABLE_AZTEC_VM) + barretenberg_module(vm honk sumcheck) endif() \ No newline at end of file From 97fc4505972afbc3706768389fba5e3dc316cd31 Mon Sep 17 00:00:00 2001 From: codygunton Date: Fri, 7 Jun 2024 09:12:43 +0000 Subject: [PATCH 03/13] Fix typo --- .../barretenberg/stdlib/primitives/biggroup/biggroup_nafs.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_nafs.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_nafs.hpp index f27bc803b4c5..40bd689f9fca 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_nafs.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/biggroup/biggroup_nafs.hpp @@ -485,7 +485,7 @@ std::vector> element::compute_naf(const Fr& scalar, cons C* ctx = scalar.context; uint512_t scalar_multiplier_512 = uint512_t(uint256_t(scalar.get_value()) % Fr::modulus); uint256_t scalar_multiplier = scalar_multiplier_512.lo; - // NAF can't handl 0 + // NAF can't handle 0 if (scalar_multiplier == 0) { scalar_multiplier = Fr::modulus; } From e5e52d6fbd7e385cd23c1e70eb509e08d9ae1c06 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 05:18:38 -0400 Subject: [PATCH 04/13] Update CMakeLists.txt --- barretenberg/cpp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/CMakeLists.txt b/barretenberg/cpp/CMakeLists.txt index 911c2b1cc799..9d0f60d4a9c1 100644 --- a/barretenberg/cpp/CMakeLists.txt +++ b/barretenberg/cpp/CMakeLists.txt @@ -27,7 +27,7 @@ endif(DOXYGEN_FOUND) option(DISABLE_ASM "Disable custom assembly" OFF) option(DISABLE_ADX "Disable ADX assembly variant" OFF) -option(DISABLE_AZTEC_VM "Don't build Aztec VM (acceptable if iterating on core proving)" ON) +option(DISABLE_AZTEC_VM "Don't build Aztec VM (acceptable if iterating on core proving)" OFF) option(MULTITHREADING "Enable multi-threading" ON) option(OMP_MULTITHREADING "Enable OMP multi-threading" OFF) option(FUZZING "Build ONLY fuzzing harnesses" OFF) From 9dc86d9c885060931de8e36650f55b18b9582e1a Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 05:20:29 -0400 Subject: [PATCH 05/13] Update main.cpp --- barretenberg/cpp/src/barretenberg/bb/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index 9075ac443ffc..01cabd2ca365 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -5,8 +5,10 @@ #include "barretenberg/dsl/acir_format/acir_format.hpp" #include "barretenberg/honk/proof_system/types/proof.hpp" #include "barretenberg/plonk/proof_system/proving_key/serialize.hpp" +#ifndef DISABLE_AZTEC_VM #include "barretenberg/vm/avm_trace/avm_common.hpp" #include "barretenberg/vm/avm_trace/avm_execution.hpp" +#endif #include "config.hpp" #include "get_bn254_crs.hpp" #include "get_bytecode.hpp" From 1f0a25efc5fe40ab72f4ba94a3f3b9797bf091c6 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 09:59:04 +0000 Subject: [PATCH 06/13] fix test, mass unwind MSGPACK_FIELDS --- .../ultra_circuit_builder.test.cpp | 2 +- .../src/barretenberg/crypto/ecdsa/c_bind.cpp | 4 ++-- .../crypto/pedersen_commitment/c_bind.cpp | 2 +- .../barretenberg/crypto/schnorr/c_bind.cpp | 8 +++---- .../barretenberg/crypto/schnorr/multisig.hpp | 8 +++---- .../crypto/schnorr/proof_of_possession.hpp | 8 +++---- .../ecc/groups/affine_element.hpp | 9 +++----- .../ecc/groups/affine_element.test.cpp | 22 ++++--------------- .../examples/join_split/join_split_tx.cpp | 2 +- .../notes/native/value/value_note.hpp | 2 +- .../plonk/composer/ultra_composer.test.cpp | 2 +- .../plookup_tables/fixed_base/fixed_base.cpp | 4 ++-- .../ultra_honk/ultra_composer.test.cpp | 2 +- 13 files changed, 29 insertions(+), 46 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp index 6f814a95844d..005a50ea156a 100644 --- a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp @@ -65,7 +65,7 @@ TEST(ultra_circuit_constructor, create_gates_from_plookup_accumulators) grumpkin::g1::affine_element base_point = plookup::fixed_base::table::LHS_GENERATOR_POINT; std::vector input_buf; - serialize::write(input_buf, base_point); + write(input_buf, base_point); const auto offset_generators = grumpkin::g1::derive_generators(input_buf, plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE); diff --git a/barretenberg/cpp/src/barretenberg/crypto/ecdsa/c_bind.cpp b/barretenberg/cpp/src/barretenberg/crypto/ecdsa/c_bind.cpp index 8c0c8295c23b..b7ffe3102b50 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/ecdsa/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/ecdsa/c_bind.cpp @@ -8,7 +8,7 @@ WASM_EXPORT void ecdsa__compute_public_key(uint8_t const* private_key, uint8_t* { auto priv_key = from_buffer(private_key); secp256k1::g1::affine_element pub_key = secp256k1::g1::one * priv_key; - serialize::write(public_key_buf, pub_key); + write(public_key_buf, pub_key); } WASM_EXPORT void ecdsa__construct_signature(uint8_t const* message, @@ -45,7 +45,7 @@ WASM_EXPORT void ecdsa__recover_public_key_from_signature(uint8_t const* message ecdsa_signature sig = { r, s, v }; auto recovered_pub_key = ecdsa_recover_public_key( std::string((char*)message, msg_len), sig); - serialize::write(output_pub_key, recovered_pub_key); + write(output_pub_key, recovered_pub_key); } WASM_EXPORT bool ecdsa__verify_signature(uint8_t const* message, diff --git a/barretenberg/cpp/src/barretenberg/crypto/pedersen_commitment/c_bind.cpp b/barretenberg/cpp/src/barretenberg/crypto/pedersen_commitment/c_bind.cpp index cf0f544090c7..c6b16e96b514 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/pedersen_commitment/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/pedersen_commitment/c_bind.cpp @@ -11,5 +11,5 @@ WASM_EXPORT void pedersen_commit(fr::vec_in_buf inputs_buffer, grumpkin::g1::aff read(inputs_buffer, to_commit); grumpkin::g1::affine_element pedersen_commitment = crypto::pedersen_commitment::commit_native(to_commit); - serialize::write(output, pedersen_commitment); + write(output, pedersen_commitment); } \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/crypto/schnorr/c_bind.cpp b/barretenberg/cpp/src/barretenberg/crypto/schnorr/c_bind.cpp index b5fc5570e86a..8507b5e0f9a1 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/schnorr/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/schnorr/c_bind.cpp @@ -13,7 +13,7 @@ WASM_EXPORT void schnorr_compute_public_key(uint8_t const* private_key, uint8_t* { auto priv_key = from_buffer(private_key); grumpkin::g1::affine_element pub_key = grumpkin::g1::one * priv_key; - serialize::write(public_key_buf, pub_key); + write(public_key_buf, pub_key); } WASM_EXPORT void schnorr_negate_public_key(uint8_t const* public_key_buffer, uint8_t* output) @@ -21,7 +21,7 @@ WASM_EXPORT void schnorr_negate_public_key(uint8_t const* public_key_buffer, uin // Negate the public key (effectively negating the y-coordinate of the public key) and return the resulting public // key. auto account_public_key = from_buffer(public_key_buffer); - serialize::write(output, -account_public_key); + write(output, -account_public_key); } WASM_EXPORT void schnorr_construct_signature(uint8_t const* message_buf, @@ -75,10 +75,10 @@ WASM_EXPORT void schnorr_multisig_validate_and_combine_signer_pubkeys(uint8_t co auto combined_key = multisig::validate_and_combine_signer_pubkeys(pubkeys); if (combined_key) { - serialize::write(combined_key_buf, *combined_key); + write(combined_key_buf, *combined_key); *success = true; } else { - serialize::write(combined_key_buf, affine_element::one()); + write(combined_key_buf, affine_element::one()); *success = false; } } diff --git a/barretenberg/cpp/src/barretenberg/crypto/schnorr/multisig.hpp b/barretenberg/cpp/src/barretenberg/crypto/schnorr/multisig.hpp index 4d48bfaec94f..c46a2886dc04 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/schnorr/multisig.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/schnorr/multisig.hpp @@ -166,10 +166,10 @@ template cl domain_separator_nonce.begin(), domain_separator_nonce.end(), std::back_inserter(nonce_challenge_buffer)); // write the group generator - serialize::write(nonce_challenge_buffer, G1::affine_one); + write(nonce_challenge_buffer, G1::affine_one); // write X - serialize::write(nonce_challenge_buffer, aggregate_pubkey); + write(nonce_challenge_buffer, aggregate_pubkey); // we slightly deviate from the protocol when including 'm', since the length of 'm' is variable // by writing a prefix and a suffix, we prevent the message from being interpreted as coming from a different @@ -188,8 +188,8 @@ template cl // write {(R1, S1), ..., (Rn, Sn)} for (const auto& nonce : round_1_nonces) { - serialize::write(nonce_challenge_buffer, nonce.R); - serialize::write(nonce_challenge_buffer, nonce.S); + write(nonce_challenge_buffer, nonce.R); + write(nonce_challenge_buffer, nonce.S); } // uses the different hash function for proper domain separation diff --git a/barretenberg/cpp/src/barretenberg/crypto/schnorr/proof_of_possession.hpp b/barretenberg/cpp/src/barretenberg/crypto/schnorr/proof_of_possession.hpp index f99878900c58..3faf3889dedd 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/schnorr/proof_of_possession.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/schnorr/proof_of_possession.hpp @@ -106,14 +106,14 @@ template struct SchnorrProofOfPossession { std::copy(domain_separator_pop.begin(), domain_separator_pop.end(), std::back_inserter(challenge_buf)); // write the group generator - serialize::write(challenge_buf, G1::affine_one); + write(challenge_buf, G1::affine_one); // write X twice as per the spec - serialize::write(challenge_buf, public_key); - serialize::write(challenge_buf, public_key); + write(challenge_buf, public_key); + write(challenge_buf, public_key); // write R - serialize::write(challenge_buf, R); + write(challenge_buf, R); // generate the raw bits of H_reg(X,X,R) return Hash::hash(challenge_buf); diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp index 78ccd6c89c0f..cec7eb19df98 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp @@ -1,4 +1,5 @@ #pragma once +#include "barretenberg/common/serialize.hpp" #include "barretenberg/ecc/curves/bn254/fq2.hpp" #include "barretenberg/numeric/uint256/uint256.hpp" #include "barretenberg/serialize/msgpack.hpp" @@ -160,17 +161,13 @@ template class alignas(64) affine_ } Fq x; Fq y; - - // for serialization: update with new fields - // TODO(https://github.com/AztecProtocol/barretenberg/issues/908) point at inifinty isn't handled - MSGPACK_FIELDS(x, y); }; template inline void read(B& it, group_elements::affine_element& element) { using serialize::read; - std::vector buffer; + std::array buffer; read(it, buffer); element = group_elements::affine_element::serialize_from_buffer(buffer.data()); } @@ -179,7 +176,7 @@ template inline void write(B& it, group_elements::affine_element const& element) { using serialize::write; - std::vector buffer(64); + std::array buffer; group_elements::affine_element::serialize_to_buffer(element, buffer.data()); write(it, buffer); } diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp index d727ae880a1c..f1c29250aaf0 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.test.cpp @@ -73,15 +73,17 @@ template class TestAffineElement : public testing::Test { affine_element P = affine_element(element::random_element()); [[maybe_unused]] affine_element R; - std::vector v(64); + std::vector v(sizeof(R)); uint8_t* ptr = v.data(); write(ptr, P); + ASSERT_TRUE(P.on_curve()); // // Reset to start? // ptr = v.data(); + const uint8_t* read_ptr = v.data(); // good read - read(ptr, R); + read(read_ptr, R); ASSERT_TRUE(R.on_curve()); ASSERT_TRUE(P == R); } @@ -131,17 +133,6 @@ template class TestAffineElement : public testing::Test { EXPECT_NE(P < Q, Q < P); } - /** - * @brief Check that msgpack encoding is consistent with decoding - * - */ - static void test_msgpack_roundtrip() - { - // TODO(https://github.com/AztecProtocol/barretenberg/issues/908) point at inifinty isn't handled - auto [actual, expected] = msgpack_roundtrip(affine_element{ 1, 1 }); - EXPECT_EQ(actual, expected); - } - /** * @brief A regression test to make sure the -1 case is covered * @@ -199,11 +190,6 @@ TYPED_TEST(TestAffineElement, InfinityOrderingRegression) TestFixture::test_infinity_ordering_regression(); } -TYPED_TEST(TestAffineElement, Msgpack) -{ - TestFixture::test_msgpack_roundtrip(); -} - namespace bb::group_elements { // mul_with_endomorphism and mul_without_endomorphism are private in affine_element. // We could make those public to test or create other public utilities, but to keep the API intact we diff --git a/barretenberg/cpp/src/barretenberg/examples/join_split/join_split_tx.cpp b/barretenberg/cpp/src/barretenberg/examples/join_split/join_split_tx.cpp index 9f7adae976d7..b9339d6235fb 100644 --- a/barretenberg/cpp/src/barretenberg/examples/join_split/join_split_tx.cpp +++ b/barretenberg/cpp/src/barretenberg/examples/join_split/join_split_tx.cpp @@ -25,7 +25,7 @@ void write(std::vector& buf, join_split_tx const& tx) write(buf, tx.account_required); write(buf, tx.account_note_index); write(buf, tx.account_note_path); - serialize::write(buf, tx.signing_pub_key); + write(buf, tx.signing_pub_key); write(buf, tx.backward_link); write(buf, tx.allow_chain); diff --git a/barretenberg/cpp/src/barretenberg/examples/join_split/notes/native/value/value_note.hpp b/barretenberg/cpp/src/barretenberg/examples/join_split/notes/native/value/value_note.hpp index 4912fa22cabb..627c498f014f 100644 --- a/barretenberg/cpp/src/barretenberg/examples/join_split/notes/native/value/value_note.hpp +++ b/barretenberg/cpp/src/barretenberg/examples/join_split/notes/native/value/value_note.hpp @@ -53,7 +53,7 @@ inline void write(std::vector& buf, value_note const& note) write(buf, note.value); write(buf, note.asset_id); write(buf, note.account_required); - serialize::write(buf, note.owner); + write(buf, note.owner); write(buf, note.secret); write(buf, note.creator_pubkey); write(buf, note.input_nullifier); diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.test.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.test.cpp index ef5f67cd1e72..e46237a43061 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.test.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.test.cpp @@ -85,7 +85,7 @@ TYPED_TEST(ultra_plonk_composer, create_gates_from_plookup_accumulators) grumpkin::g1::affine_element base_point = plookup::fixed_base::table::LHS_GENERATOR_POINT; std::vector input_buf; - serialize::write(input_buf, base_point); + write(input_buf, base_point); const auto offset_generators = grumpkin::g1::derive_generators(input_buf, plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/fixed_base/fixed_base.cpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/fixed_base/fixed_base.cpp index 6a470eb835c6..0feae681d454 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/fixed_base/fixed_base.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/fixed_base/fixed_base.cpp @@ -56,7 +56,7 @@ template table::fixed_base_scalar_mul_tables table::generate_t result.reserve(NUM_TABLES); std::vector input_buf; - serialize::write(input_buf, input); + write(input_buf, input); const auto offset_generators = grumpkin::g1::derive_generators(input_buf, NUM_TABLES); grumpkin::g1::element accumulator = input; @@ -87,7 +87,7 @@ grumpkin::g1::affine_element table::generate_generator_offset(const grumpkin::g1 constexpr size_t NUM_TABLES = get_num_tables_per_multi_table(); std::vector input_buf; - serialize::write(input_buf, input); + write(input_buf, input); const auto offset_generators = grumpkin::g1::derive_generators(input_buf, NUM_TABLES); grumpkin::g1::element acc = grumpkin::g1::point_at_infinity; for (const auto& gen : offset_generators) { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp index 330a2ab8c144..b04bd0b7fd1e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp @@ -169,7 +169,7 @@ TEST_F(UltraHonkComposerTests, create_gates_from_plookup_accumulators) grumpkin::g1::affine_element base_point = plookup::fixed_base::table::LHS_GENERATOR_POINT; std::vector input_buf; - serialize::write(input_buf, base_point); + write(input_buf, base_point); const auto offset_generators = grumpkin::g1::derive_generators(input_buf, plookup::fixed_base::table::NUM_TABLES_PER_LO_MULTITABLE); From 6ca31b828bd340f09a6d671cbfe96fe069672c60 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 06:11:13 -0400 Subject: [PATCH 07/13] Update univariate.hpp --- .../barretenberg/polynomials/univariate.hpp | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp index 0335db8fc12d..2a64416f21e3 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp @@ -510,19 +510,19 @@ template -// inline void read(B& it, Univariate& univariate) -// { -// using serialize::read; -// read(it, univariate.evaluations); -// } - -// template -// inline void write(B& it, Univariate const& univariate) -// { -// using serialize::write; -// write(it, univariate.evaluations); -// } +template +inline void read(B& it, Univariate& univariate) +{ + using serialize::read; + read(it, univariate.evaluations); +} + +template +inline void write(B& it, Univariate const& univariate) +{ + using serialize::write; + write(it, univariate.evaluations); +} template class UnivariateView { public: @@ -686,4 +686,4 @@ template std::array array_to_array namespace std { template struct tuple_size> : std::integral_constant {}; -} // namespace std \ No newline at end of file +} // namespace std From e35bc5ca3790458f9b8ad9bf52c2753e3572c157 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 06:13:35 -0400 Subject: [PATCH 08/13] Update CMakeLists.txt --- barretenberg/cpp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/CMakeLists.txt b/barretenberg/cpp/CMakeLists.txt index 9d0f60d4a9c1..f16b898bf6fd 100644 --- a/barretenberg/cpp/CMakeLists.txt +++ b/barretenberg/cpp/CMakeLists.txt @@ -145,7 +145,7 @@ include(cmake/module.cmake) include(cmake/msgpack.cmake) include(cmake/backward-cpp.cmake) -if (NOT WASM) +if (WASM) set(DISABLE_AZTEC_VM ON) endif() if(DISABLE_AZTEC_VM) From 714232ef0242067d061ad7acd08ede5c96a183a3 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 12:01:03 +0000 Subject: [PATCH 09/13] fix: line up serialization with how it used to be --- .../barretenberg/ecc/groups/affine_element.hpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp index cec7eb19df98..85a4d86db5db 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp @@ -104,13 +104,14 @@ template class alignas(64) affine_ */ static void serialize_to_buffer(const affine_element& value, uint8_t* buffer) { + using namespace serialize; if (value.is_point_at_infinity()) { // if we are infinity, just set all buffer bits to 1 // we only need this case because the below gets mangled converting from montgomery for infinity points memset(buffer, 255, sizeof(Fq) * 2); } else { - Fq::serialize_to_buffer(value.y, buffer); - Fq::serialize_to_buffer(value.x, buffer + sizeof(Fq)); + write(buffer, value.x); + write(buffer, value.y); } } @@ -126,8 +127,9 @@ template class alignas(64) affine_ * * @warning This will need to be updated if we serialize points over composite-order fields other than fq2! */ - static affine_element serialize_from_buffer(uint8_t* buffer) + static affine_element serialize_from_buffer(const uint8_t* buffer) { + using namespace serialize; // Does the buffer consist entirely of set bits? If so, we have a point at infinity // Note that if it isn't, this loop should end early. // We only need this case because the below gets mangled converting to montgomery for infinity points @@ -137,8 +139,8 @@ template class alignas(64) affine_ return affine_element::infinity(); } affine_element result; - result.y = Fq::serialize_from_buffer(buffer); - result.x = Fq::serialize_from_buffer(buffer + sizeof(Fq)); + read(buffer, result.x); + read(buffer, result.y); return result; } @@ -166,7 +168,7 @@ template class alignas(64) affine_ template inline void read(B& it, group_elements::affine_element& element) { - using serialize::read; + using namespace serialize; std::array buffer; read(it, buffer); element = group_elements::affine_element::serialize_from_buffer(buffer.data()); @@ -175,7 +177,7 @@ inline void read(B& it, group_elements::affine_element& elemen template inline void write(B& it, group_elements::affine_element const& element) { - using serialize::write; + using namespace serialize; std::array buffer; group_elements::affine_element::serialize_to_buffer(element, buffer.data()); write(it, buffer); From 561ec694d212de6aa10fd487d6b576f16de81547 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 13:18:07 +0000 Subject: [PATCH 10/13] try to fix --- .../ecc/groups/affine_element.hpp | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp index 85a4d86db5db..ac3dfc760904 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp @@ -110,8 +110,9 @@ template class alignas(64) affine_ // we only need this case because the below gets mangled converting from montgomery for infinity points memset(buffer, 255, sizeof(Fq) * 2); } else { - write(buffer, value.x); + // NOTE: for historic reasons we write 'y' first here but 'x' first below write(buffer, value.y); + write(buffer, value.x); } } @@ -138,9 +139,10 @@ template class alignas(64) affine_ if (is_point_at_infinity) { return affine_element::infinity(); } + // NOTE: for historic reasons we read 'y' first here but 'x' first below affine_element result; - read(buffer, result.x); read(buffer, result.y); + read(buffer, result.x); return result; } @@ -165,22 +167,36 @@ template class alignas(64) affine_ Fq y; }; -template -inline void read(B& it, group_elements::affine_element& element) +template +inline void read(const uint8_t* buffer, group_elements::affine_element& element) { using namespace serialize; - std::array buffer; - read(it, buffer); - element = group_elements::affine_element::serialize_from_buffer(buffer.data()); + // Does the buffer consist entirely of set bits? If so, we have a point at infinity + // Note that if it isn't, this loop should end early. + // We only need this case because the below gets mangled converting to montgomery for infinity points + bool is_point_at_infinity = std::all_of(buffer, buffer + sizeof(Fq_) * 2, [](uint8_t val) { return val == 255; }); + if (is_point_at_infinity) { + element = group_elements::affine_element::infinity(); + return; + } + // NOTE: for historic reasons we read 'x' first here but 'y' first above + read(buffer, element.x); + read(buffer, element.y); } -template -inline void write(B& it, group_elements::affine_element const& element) +template +inline void write(uint8_t* buffer, group_elements::affine_element const& element) { using namespace serialize; - std::array buffer; - group_elements::affine_element::serialize_to_buffer(element, buffer.data()); - write(it, buffer); + if (element.is_point_at_infinity()) { + // if we are infinity, just set all buffer bits to 1 + // we only need this case because the below gets mangled converting from montgomery for infinity points + memset(buffer, 255, sizeof(Fq_) * 2); + } else { + // NOTE: for historic reasons we write 'x' first here but 'y' first above + write(buffer, element.x); + write(buffer, element.y); + } } } // namespace bb::group_elements From 02e860c86ff34f863937242cdbadd2e7db88aa73 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 13:18:58 +0000 Subject: [PATCH 11/13] Revert "try to fix" This reverts commit 561ec694d212de6aa10fd487d6b576f16de81547. --- .../ecc/groups/affine_element.hpp | 40 ++++++------------- 1 file changed, 12 insertions(+), 28 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp index ac3dfc760904..85a4d86db5db 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp @@ -110,9 +110,8 @@ template class alignas(64) affine_ // we only need this case because the below gets mangled converting from montgomery for infinity points memset(buffer, 255, sizeof(Fq) * 2); } else { - // NOTE: for historic reasons we write 'y' first here but 'x' first below - write(buffer, value.y); write(buffer, value.x); + write(buffer, value.y); } } @@ -139,10 +138,9 @@ template class alignas(64) affine_ if (is_point_at_infinity) { return affine_element::infinity(); } - // NOTE: for historic reasons we read 'y' first here but 'x' first below affine_element result; - read(buffer, result.y); read(buffer, result.x); + read(buffer, result.y); return result; } @@ -167,36 +165,22 @@ template class alignas(64) affine_ Fq y; }; -template -inline void read(const uint8_t* buffer, group_elements::affine_element& element) +template +inline void read(B& it, group_elements::affine_element& element) { using namespace serialize; - // Does the buffer consist entirely of set bits? If so, we have a point at infinity - // Note that if it isn't, this loop should end early. - // We only need this case because the below gets mangled converting to montgomery for infinity points - bool is_point_at_infinity = std::all_of(buffer, buffer + sizeof(Fq_) * 2, [](uint8_t val) { return val == 255; }); - if (is_point_at_infinity) { - element = group_elements::affine_element::infinity(); - return; - } - // NOTE: for historic reasons we read 'x' first here but 'y' first above - read(buffer, element.x); - read(buffer, element.y); + std::array buffer; + read(it, buffer); + element = group_elements::affine_element::serialize_from_buffer(buffer.data()); } -template -inline void write(uint8_t* buffer, group_elements::affine_element const& element) +template +inline void write(B& it, group_elements::affine_element const& element) { using namespace serialize; - if (element.is_point_at_infinity()) { - // if we are infinity, just set all buffer bits to 1 - // we only need this case because the below gets mangled converting from montgomery for infinity points - memset(buffer, 255, sizeof(Fq_) * 2); - } else { - // NOTE: for historic reasons we write 'x' first here but 'y' first above - write(buffer, element.x); - write(buffer, element.y); - } + std::array buffer; + group_elements::affine_element::serialize_to_buffer(element, buffer.data()); + write(it, buffer); } } // namespace bb::group_elements From b2941384dab20b2f1cdf125f7cee56bc91b8b439 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 13:22:07 +0000 Subject: [PATCH 12/13] try a new approach to point serialization --- .../ecc/groups/affine_element.hpp | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp index 85a4d86db5db..7f3754c7e17e 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp @@ -102,7 +102,7 @@ template class alignas(64) affine_ * @warning This will need to be updated if we serialize points over composite-order fields other than fq2! * */ - static void serialize_to_buffer(const affine_element& value, uint8_t* buffer) + static void serialize_to_buffer(const affine_element& value, uint8_t* buffer, bool write_x_first = false) { using namespace serialize; if (value.is_point_at_infinity()) { @@ -110,8 +110,10 @@ template class alignas(64) affine_ // we only need this case because the below gets mangled converting from montgomery for infinity points memset(buffer, 255, sizeof(Fq) * 2); } else { - write(buffer, value.x); - write(buffer, value.y); + // Note: for historic reasons we will need to redo downstream hashes if we want this to always be written in + // the same order in our various serialization flows + write(buffer, write_x_first ? value.x : value.y); + write(buffer, write_x_first ? value.y : value.x); } } @@ -127,7 +129,7 @@ template class alignas(64) affine_ * * @warning This will need to be updated if we serialize points over composite-order fields other than fq2! */ - static affine_element serialize_from_buffer(const uint8_t* buffer) + static affine_element serialize_from_buffer(const uint8_t* buffer, bool write_x_first = false) { using namespace serialize; // Does the buffer consist entirely of set bits? If so, we have a point at infinity @@ -139,8 +141,10 @@ template class alignas(64) affine_ return affine_element::infinity(); } affine_element result; - read(buffer, result.x); - read(buffer, result.y); + // Note: for historic reasons we will need to redo downstream hashes if we want this to always be read in the + // same order in our various serialization flows + read(buffer, write_x_first ? result.x : result.y); + read(buffer, write_x_first ? result.y : result.x); return result; } @@ -171,7 +175,8 @@ inline void read(B& it, group_elements::affine_element& elemen using namespace serialize; std::array buffer; read(it, buffer); - element = group_elements::affine_element::serialize_from_buffer(buffer.data()); + element = group_elements::affine_element::serialize_from_buffer( + buffer.data(), /* use legacy field order */ true); } template @@ -179,7 +184,8 @@ inline void write(B& it, group_elements::affine_element const& { using namespace serialize; std::array buffer; - group_elements::affine_element::serialize_to_buffer(element, buffer.data()); + group_elements::affine_element::serialize_to_buffer( + element, buffer.data(), /* use legacy field order */ true); write(it, buffer); } } // namespace bb::group_elements From 579b20a149192852ae59db92b083e2bae8479d39 Mon Sep 17 00:00:00 2001 From: ludamad Date: Fri, 7 Jun 2024 13:08:35 -0400 Subject: [PATCH 13/13] Update ci.yml --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e4c22fa56a00..671ce7a2acbc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: changes: runs-on: ubuntu-20.04 - # Required permissions + # Required permissions. permissions: pull-requests: read # Set job outputs to values from filter step