Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
abef7f9
Adds structures and adjustments to support UltraStarknetHonk using Po…
raugfer Dec 27, 2024
0fd97be
Incorporates poseidon to be used by the transcript module, still need…
raugfer Dec 30, 2024
0938b9c
Replaces KeccakTranscript by PoseidonTranscript for UltraStarknetFlavor
raugfer Dec 30, 2024
86b44dc
Adds cmake configuration to link poseidon C library lib_pos.so
raugfer Dec 30, 2024
9fa447b
Adds license and source notice
raugfer Dec 30, 2024
1b633d8
Adds preliminary implementation of poseidon hash wrapper for transcript
raugfer Dec 30, 2024
86a37b6
Proper implementation of the StarknetPoseidonTranscript hash function
raugfer Jan 3, 2025
2c85ee1
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Jan 11, 2025
351e9eb
Fixes after merging master branch
raugfer Jan 11, 2025
8b92a47
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Jan 11, 2025
f290ce7
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Jan 13, 2025
350a143
Declares WitnessComputation<UltraStarknetFlavor>
raugfer Jan 13, 2025
3ac9b7b
Repositions the case for prove_ultra_starknet_honk_output_all
raugfer Jan 13, 2025
9bdd328
Removes eol after last line
raugfer Jan 13, 2025
b0fd1da
Removes eol after last line
raugfer Jan 13, 2025
74a63f8
Merge branch 'AztecProtocol:master' into ultra-starknet-honk-merger
feltroidprime Jan 24, 2025
1715972
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Jan 30, 2025
a7460fc
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Jan 31, 2025
934841a
Preliminary implementation of Poseidon over Stark252 using BB framework
raugfer Feb 6, 2025
39d8a73
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 6, 2025
a672344
Replaces C code by PoseidonPermutation class
raugfer Feb 7, 2025
647d643
Refactor of barretenberg/crypto/poseidon/poseidon.cpp
raugfer Feb 7, 2025
19985ea
Renames some entities to better match their usage
raugfer Feb 7, 2025
512bb4f
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 7, 2025
6c4bd50
Splits implementation into separate files
raugfer Feb 7, 2025
4e95111
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 12, 2025
7210ffd
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 13, 2025
7f39ed1
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 14, 2025
bcca8a8
Adds support for the UltraStarknetZK flavor
raugfer Feb 14, 2025
7276516
Merge branch 'AztecProtocol:master' into ultra-starknet-honk-merger
raugfer Feb 14, 2025
b0043cc
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 26, 2025
c932acc
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 26, 2025
3cba62e
Adjustments to Starknet/StarknetZK after master merge
raugfer Feb 26, 2025
818f32c
Adds "starknet" option to api
raugfer Feb 26, 2025
a7a4dc0
Adds a missing whitespace to "starknet" option description
raugfer Feb 26, 2025
f6fa3da
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Feb 28, 2025
3c4a14e
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 3, 2025
0db9fcd
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 4, 2025
c61b6bf
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 6, 2025
f2265c3
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 7, 2025
673bfc6
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 10, 2025
da82c0b
Adds SmallSubgroupIPAProver<UltraStarknetZKFlavor> definition
raugfer Mar 10, 2025
ae314cc
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 14, 2025
870879a
Apply changes from latest ultra_keccak_zk_flavor.hpp
raugfer Mar 14, 2025
3640283
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 17, 2025
cfe6e7e
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 17, 2025
f3e6f0d
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 17, 2025
d0f51c3
Adjustments after merging master
raugfer Mar 17, 2025
5df64a8
Implements UltraStarknetFlavor by inheriting from UltraStarknetFlavor
raugfer Mar 18, 2025
a46ca6f
Implements UltraStarknetZKFlavor by inheriting from UltraKeccakZKFlavor
raugfer Mar 18, 2025
1bac7aa
Implements StarknetTranscriptParams by inheriting from KeccakTranscri…
raugfer Mar 18, 2025
0d15501
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 20, 2025
1f42848
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 20, 2025
268ff30
Adds TypeScript/WASM API support for the UltraStarknetFlavor
raugfer Mar 20, 2025
0418fa6
Adds clarification comment
raugfer Mar 20, 2025
4f83a46
Adds prove_then_verify flow for starknet to acir_tests
raugfer Mar 20, 2025
de80dc4
Adds preliminary ultra_starknet_honk support to yarn-project
raugfer Mar 20, 2025
89c22c5
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 20, 2025
d972081
Moves stark252.hpp under ecc/curves/stark252
raugfer Mar 21, 2025
dc9bc5b
Adds WASM constants to stark252 base field parameters
raugfer Mar 21, 2025
21fe016
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 21, 2025
1ddb003
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 21, 2025
366560b
Inverts Poseidon state[0]/state[2] to reuse BB sponge implementation
raugfer Mar 21, 2025
58f4d9a
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 21, 2025
871c95f
Adds Poseidon template class to poseidon.hpp
raugfer Mar 21, 2025
0bb6f57
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 24, 2025
6676b77
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 24, 2025
be04a29
Rewrites poseidon.cpp/poseidon.hpp to use Sponge class
raugfer Mar 24, 2025
45ed872
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 24, 2025
b4efcb6
Removal of trailing empty space
raugfer Mar 24, 2025
d6cc578
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 25, 2025
caa48c6
Changes poseidon permutation implementation to match Garaga's behavior
raugfer Mar 25, 2025
efeec53
Removes state element order swap and updates Permutation parameters
raugfer Mar 25, 2025
a117990
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 25, 2025
85774de
Merge branch 'master' into ultra-starknet-honk-merger
feltroidprime Mar 26, 2025
7ad4887
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 26, 2025
35d8033
Adds preliminary unit tests for poseidon
raugfer Mar 26, 2025
12e8a4c
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 26, 2025
5efe495
Cleans up and adds unit tests
raugfer Mar 26, 2025
201e2ec
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 27, 2025
e6b8c1b
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 27, 2025
53c8cce
Inlines poseidon stark252 hash directly into transcript implementation
raugfer Mar 27, 2025
5100c22
Moves the bulk of UltraStarknet[ZK]Flavor implementation to folder ex…
raugfer Mar 27, 2025
a7a6a62
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 27, 2025
49d58df
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
8804b0e
Applies clang formating
raugfer Mar 28, 2025
f401319
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
89138ce
Fixes numeric namespace reference in tests
raugfer Mar 28, 2025
689c517
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
9a3470c
Comments some unit tests for starknet/poseidon for now to satisfy CI
raugfer Mar 28, 2025
5d342b6
Adds r_inv_X and r_inv_wasm_X to stark252.hpp
raugfer Mar 28, 2025
cf781a2
Adds back tests that were commented
raugfer Mar 28, 2025
d6de6b3
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
111d23f
Adds ecc as dependency for ext_starknet_crypto_poseidon
raugfer Mar 28, 2025
32e072c
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
6288cfe
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
53cfc99
Adds ext_starknet_transcript as barretenberg_module
raugfer Mar 28, 2025
0655be5
Adds missing directory to barretenberg/cpp/src/CMakeLists.txt
raugfer Mar 28, 2025
40ab07b
Removes empty ext_starknet_transcript_objects from barretenberg/cpp/s…
raugfer Mar 28, 2025
620d638
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
fe33f93
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
8061d97
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 28, 2025
a4cd75c
Attempts to fix CI linker issue with starknet hash function call
raugfer Mar 28, 2025
afce9d6
Attempts to fix CI linker issue with starknet hash function call
raugfer Mar 28, 2025
e58b21d
Attempts to fix CI linker issue with starknet hash function call
raugfer Mar 28, 2025
d29eba7
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 29, 2025
1aa68d6
Temporarily comments part of test failing CI
raugfer Mar 29, 2025
0d2a3d3
Fixes formatting
raugfer Mar 29, 2025
4ea7558
Comments unused declarations
raugfer Mar 29, 2025
f06baf4
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 31, 2025
578a770
Uncomments a line in the failing test
raugfer Mar 31, 2025
5e8df0b
Uncomments test section that is failing
raugfer Mar 31, 2025
c468160
comments failing assertion
raugfer Mar 31, 2025
4c6509e
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 31, 2025
a3a145f
Comments the other associated assertion
raugfer Mar 31, 2025
e5f6758
Removes comments from assertions
raugfer Mar 31, 2025
a6d4f30
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Mar 31, 2025
78a2541
Fixes api_ultra_honk.cpp for UltraStarknetFlavor
raugfer Mar 31, 2025
cd7dda1
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 11, 2025
58a09cb
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 11, 2025
50da876
Fixes barretenberg ts
raugfer Apr 11, 2025
0381701
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 11, 2025
4646c03
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 11, 2025
ad23d71
Comments faulty test
raugfer Apr 11, 2025
2fca077
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 11, 2025
4b6f7cb
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 11, 2025
6bd9d52
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 11, 2025
53ed216
Adds back faulty test
raugfer Apr 11, 2025
f3a1e07
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 14, 2025
81b0126
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 15, 2025
1f044bd
Post merge adjusments
raugfer Apr 15, 2025
4eca625
Fixes formatting after merge
raugfer Apr 15, 2025
7d0172a
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 16, 2025
597ce50
Merge branch 'master' into ultra-starknet-honk-merger
raugfer Apr 17, 2025
ccf574a
Merge branch 'master' into ultra-starknet-honk-merger
ludamad Apr 17, 2025
634f305
fixes
ludamad Apr 17, 2025
cd194a2
hack to let me change base
ludamad Apr 17, 2025
a636c31
Merge branch 'ad/starknet-honk-merger-base' into ultra-starknet-honk-…
ludamad Apr 17, 2025
0f7b3df
Merge commit 'cd194a21229ea5f463470db3de0db56ab312b9e1' into ad/stark…
ludamad Apr 18, 2025
ad480e5
Revert "hack to let me change base"
ludamad Apr 18, 2025
a8a3116
Merge branch 'ad/starknet-honk-merger-base' into ultra-starknet-honk-…
ludamad Apr 18, 2025
b01b99e
fix starknet zk + comment on duplication
ludamad Apr 18, 2025
8e34f0d
Merge branch 'ad/starknet-honk-merger-base' into ultra-starknet-honk-…
ludamad Apr 18, 2025
25d1616
Merge branch 'master' into ultra-starknet-honk-merger
ludamad Apr 18, 2025
e711488
fix: cbind.cpp
ludamad Apr 18, 2025
dc4cf04
Update c_bind.cpp
ludamad Apr 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions barretenberg/acir_tests/bbjs-test/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ async function generateProof({
const witness = await fs.readFile(witnessPath);
const proof = await backend.generateProof(new Uint8Array(witness), {
keccak: oracleHash === "keccak",
starknet: oracleHash === "starknet",
});
assert(
proof.proof.length === UH_PROOF_LENGTH_IN_BYTES,
Expand All @@ -66,6 +67,7 @@ async function generateProof({

const verificationKey = await backend.getVerificationKey({
keccak: oracleHash === "keccak",
starknet: oracleHash === "starknet",
});
await fs.writeFile(vkeyPath(outputDirectory), Buffer.from(verificationKey));
debug("Verification key written to " + vkeyPath(outputDirectory));
Expand Down
1 change: 1 addition & 0 deletions barretenberg/acir_tests/bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ function test_cmds_internal {
echo SYS=ultra_honk FLOW=prove_then_verify $run_test assert_statement
echo SYS=ultra_honk FLOW=prove_then_verify $run_test double_verify_honk_proof
echo SYS=ultra_honk FLOW=prove_then_verify HASH=keccak $run_test assert_statement
echo SYS=ultra_honk FLOW=prove_then_verify HASH=starknet $run_test assert_statement
echo SYS=ultra_honk FLOW=prove_then_verify ROLLUP=true $run_test verify_rollup_honk_proof

# prove and verify using bb.js classes
Expand Down
3 changes: 3 additions & 0 deletions barretenberg/cpp/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ add_subdirectory(barretenberg/eccvm)
add_subdirectory(barretenberg/env)
add_subdirectory(barretenberg/trace_to_polynomials)
add_subdirectory(barretenberg/examples)
add_subdirectory(barretenberg/ext/starknet/crypto)
add_subdirectory(barretenberg/ext/starknet/transcript)
add_subdirectory(barretenberg/flavor)
add_subdirectory(barretenberg/goblin)
add_subdirectory(barretenberg/grumpkin_srs_gen)
Expand Down Expand Up @@ -141,6 +143,7 @@ set(BARRETENBERG_TARGET_OBJECTS
$<TARGET_OBJECTS:dsl_objects>
$<TARGET_OBJECTS:ecc_objects>
$<TARGET_OBJECTS:eccvm_objects>
$<TARGET_OBJECTS:ext_starknet_crypto_poseidon_objects>
$<TARGET_OBJECTS:trace_to_polynomials_objects>
$<TARGET_OBJECTS:simple_example_objects>
$<TARGET_OBJECTS:flavor_objects>
Expand Down
26 changes: 24 additions & 2 deletions barretenberg/cpp/src/barretenberg/api/api_ultra_honk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@ template <typename Flavor, typename Circuit = typename Flavor::CircuitBuilder>
Circuit _compute_circuit(const std::string& bytecode_path, const std::string& witness_path)
{
uint32_t honk_recursion = 0;
if constexpr (IsAnyOf<Flavor, UltraFlavor, UltraKeccakFlavor, UltraKeccakZKFlavor>) {
if constexpr (IsAnyOf<Flavor,
UltraFlavor,
UltraKeccakFlavor,
UltraStarknetFlavor,
UltraKeccakZKFlavor,
UltraStarknetZKFlavor>) {
honk_recursion = 1;
} else if constexpr (IsAnyOf<Flavor, UltraRollupFlavor>) {
honk_recursion = 2;
Expand Down Expand Up @@ -171,8 +176,12 @@ void UltraHonkAPI::prove(const Flags& flags,
_write(_prove<UltraFlavor>(flags.write_vk, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "keccak" && !flags.zk) {
_write(_prove<UltraKeccakFlavor>(flags.write_vk, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "starknet" && !flags.zk) {
_write(_prove<UltraStarknetFlavor>(flags.write_vk, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "keccak" && flags.zk) {
_write(_prove<UltraKeccakZKFlavor>(flags.write_vk, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "starknet" && flags.zk) {
_write(_prove<UltraStarknetZKFlavor>(flags.write_vk, bytecode_path, witness_path));
} else {
throw_or_abort("Invalid proving options specified in _prove");
}
Expand All @@ -188,14 +197,23 @@ bool UltraHonkAPI::verify(const Flags& flags,
return _verify<UltraRollupFlavor>(ipa_accumulation, public_inputs_path, proof_path, vk_path);
}
if (flags.zk) {
return _verify<UltraKeccakZKFlavor>(ipa_accumulation, public_inputs_path, proof_path, vk_path);
if (flags.oracle_hash_type == "keccak") {
return _verify<UltraKeccakZKFlavor>(ipa_accumulation, public_inputs_path, proof_path, vk_path);
}
if (flags.oracle_hash_type == "starknet") {
return _verify<UltraStarknetZKFlavor>(ipa_accumulation, public_inputs_path, proof_path, vk_path);
}
return false;
}
if (flags.oracle_hash_type == "poseidon2") {
return _verify<UltraFlavor>(ipa_accumulation, public_inputs_path, proof_path, vk_path);
}
if (flags.oracle_hash_type == "keccak") {
return _verify<UltraKeccakFlavor>(ipa_accumulation, public_inputs_path, proof_path, vk_path);
}
if (flags.oracle_hash_type == "starknet") {
return _verify<UltraStarknetFlavor>(ipa_accumulation, public_inputs_path, proof_path, vk_path);
}
return false;
}

Expand All @@ -219,8 +237,12 @@ void UltraHonkAPI::write_vk(const Flags& flags,
_write(_compute_vk<UltraFlavor>(bytecode_path, ""));
} else if (flags.oracle_hash_type == "keccak" && !flags.zk) {
_write(_compute_vk<UltraKeccakFlavor>(bytecode_path, ""));
} else if (flags.oracle_hash_type == "starknet" && !flags.zk) {
_write(_compute_vk<UltraStarknetFlavor>(bytecode_path, ""));
} else if (flags.oracle_hash_type == "keccak" && flags.zk) {
_write(_compute_vk<UltraKeccakZKFlavor>(bytecode_path, ""));
} else if (flags.oracle_hash_type == "starknet" && flags.zk) {
_write(_compute_vk<UltraStarknetZKFlavor>(bytecode_path, ""));
} else {
throw_or_abort("Invalid proving options specified in _prove");
}
Expand Down
16 changes: 9 additions & 7 deletions barretenberg/cpp/src/barretenberg/bb/cli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,13 +178,15 @@ int parse_and_run_cli_command(int argc, char* argv[])

const auto add_oracle_hash_option = [&](CLI::App* subcommand) {
return subcommand
->add_option("--oracle_hash",
flags.oracle_hash_type,
"The hash function used by the prover as random oracle standing in for a verifier's challenge "
"generation. Poseidon2 is to be used for proofs that are intended to be verified inside of a "
"circuit. Keccak is optimized for verification in an Ethereum smart contract, where Keccak "
"has a privileged position due to the existence of an EVM precompile.")
->check(CLI::IsMember({ "poseidon2", "keccak" }).name("is_member"));
->add_option(
"--oracle_hash",
flags.oracle_hash_type,
"The hash function used by the prover as random oracle standing in for a verifier's challenge "
"generation. Poseidon2 is to be used for proofs that are intended to be verified inside of a "
"circuit. Keccak is optimized for verification in an Ethereum smart contract, where Keccak "
"has a privileged position due to the existence of an EVM precompile. Starknet is optimized "
"for verification in a Starknet smart contract, which can be generated using the Garaga library.")
->check(CLI::IsMember({ "poseidon2", "keccak", "starknet" }).name("is_member"));
};

const auto add_output_format_option = [&](CLI::App* subcommand) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
barretenberg_module(append_only_tree_bench crypto_poseidon2 crypto_pedersen_hash crypto_merkle_tree)
barretenberg_module(append_only_tree_bench crypto_poseidon2 ext_starknet_crypto_poseidon crypto_pedersen_hash crypto_merkle_tree)
Original file line number Diff line number Diff line change
@@ -1 +1 @@
barretenberg_module(indexed_tree_bench crypto_poseidon2 crypto_pedersen_hash crypto_merkle_tree)
barretenberg_module(indexed_tree_bench crypto_poseidon2 ext_starknet_crypto_poseidon crypto_pedersen_hash crypto_merkle_tree)
Original file line number Diff line number Diff line change
@@ -1 +1 @@
barretenberg_module(merkle_tree_bench crypto_poseidon2 crypto_pedersen_hash crypto_merkle_tree)
barretenberg_module(merkle_tree_bench crypto_poseidon2 ext_starknet_crypto_poseidon crypto_pedersen_hash crypto_merkle_tree)
Original file line number Diff line number Diff line change
@@ -1 +1 @@
barretenberg_module(poseidon2_bench crypto_poseidon2)
barretenberg_module(poseidon2_bench crypto_poseidon2 ext_starknet_crypto_poseidon)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "barretenberg/ecc/curves/bn254/bn254.hpp"
#include "barretenberg/eccvm/eccvm_flavor.hpp"
#include "barretenberg/eccvm/eccvm_translation_data.hpp"
#include "barretenberg/ext/starknet/stdlib_circuit_builders/ultra_starknet_zk_flavor.hpp"
#include "barretenberg/polynomials/polynomial.hpp"
#include "barretenberg/polynomials/univariate.hpp"
#include "barretenberg/stdlib/primitives/curves/grumpkin.hpp"
Expand Down Expand Up @@ -441,6 +442,7 @@ template class SmallSubgroupIPAProver<TranslatorFlavor>;
template class SmallSubgroupIPAProver<MegaZKFlavor>;
template class SmallSubgroupIPAProver<UltraZKFlavor>;
template class SmallSubgroupIPAProver<UltraKeccakZKFlavor>;
template class SmallSubgroupIPAProver<UltraStarknetZKFlavor>;

// Instantiations used in tests
template class SmallSubgroupIPAProver<BN254Settings>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,14 @@ template <typename FF, size_t rate, size_t capacity, size_t t, typename Permutat
{
size_t in_len = input.size();
const uint256_t iv = (static_cast<uint256_t>(in_len) << 64) + out_len - 1;
return hash_internal<out_len>(input, iv);
}

template <size_t out_len> static std::array<FF, out_len> hash_internal(std::span<const FF> input, FF iv)
{
FieldSponge sponge(iv);

size_t in_len = input.size();
for (size_t i = 0; i < in_len; ++i) {
sponge.absorb(input[i]);
}
Expand All @@ -146,5 +152,6 @@ template <typename FF, size_t rate, size_t capacity, size_t t, typename Permutat
}

static FF hash_internal(std::span<const FF> input) { return hash_internal<1>(input)[0]; }
static FF hash_internal(std::span<const FF> input, FF iv) { return hash_internal<1>(input, iv)[0]; }
};
} // namespace bb::crypto
} // namespace bb::crypto
48 changes: 48 additions & 0 deletions barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,23 @@ WASM_EXPORT void acir_prove_ultra_keccak_honk(uint8_t const* acir_vec, uint8_t c
*out = to_heap_buffer(to_buffer(proof));
}

WASM_EXPORT void acir_prove_ultra_starknet_honk(uint8_t const* acir_vec, uint8_t const* witness_vec, uint8_t** out)
{
// Lambda function to ensure things get freed before proving.
UltraStarknetProver prover = [&] {
const acir_format::ProgramMetadata metadata{ .honk_recursion = 1 };
acir_format::AcirProgram program{
acir_format::circuit_buf_to_acir_format(from_buffer<std::vector<uint8_t>>(acir_vec)),
acir_format::witness_buf_to_witness_data(from_buffer<std::vector<uint8_t>>(witness_vec))
};
auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);

return UltraStarknetProver(builder);
}();
auto proof = prover.construct_proof();
*out = to_heap_buffer(to_buffer(proof));
}

WASM_EXPORT void acir_verify_ultra_honk(uint8_t const* proof_buf, uint8_t const* vk_buf, bool* result)
{
using VerificationKey = UltraFlavor::VerificationKey;
Expand All @@ -280,6 +297,19 @@ WASM_EXPORT void acir_verify_ultra_keccak_honk(uint8_t const* proof_buf, uint8_t
*result = verifier.verify_proof(proof);
}

WASM_EXPORT void acir_verify_ultra_starknet_honk(uint8_t const* proof_buf, uint8_t const* vk_buf, bool* result)
{
using VerificationKey = UltraStarknetFlavor::VerificationKey;
using Verifier = UltraVerifier_<UltraStarknetFlavor>;

auto proof = from_buffer<std::vector<bb::fr>>(from_buffer<std::vector<uint8_t>>(proof_buf));
auto verification_key = std::make_shared<VerificationKey>(from_buffer<VerificationKey>(vk_buf));

Verifier verifier{ verification_key };

*result = verifier.verify_proof(proof);
}

WASM_EXPORT void acir_write_vk_ultra_honk(uint8_t const* acir_vec, uint8_t** out)
{
using DeciderProvingKey = DeciderProvingKey_<UltraFlavor>;
Expand Down Expand Up @@ -315,6 +345,24 @@ WASM_EXPORT void acir_write_vk_ultra_keccak_honk(uint8_t const* acir_vec, uint8_
*out = to_heap_buffer(to_buffer(vk));
}

WASM_EXPORT void acir_write_vk_ultra_starknet_honk(uint8_t const* acir_vec, uint8_t** out)
{
using DeciderProvingKey = DeciderProvingKey_<UltraStarknetFlavor>;
using VerificationKey = UltraStarknetFlavor::VerificationKey;

// lambda to free the builder
DeciderProvingKey proving_key = [&] {
const acir_format::ProgramMetadata metadata{ .honk_recursion = 1 };
acir_format::AcirProgram program{ acir_format::circuit_buf_to_acir_format(
from_buffer<std::vector<uint8_t>>(acir_vec)) };
auto builder = acir_format::create_circuit<UltraCircuitBuilder>(program, metadata);
return DeciderProvingKey(builder);
}();
VerificationKey vk(proving_key.proving_key);
vinfo("Constructed UltraStarknetHonk verification key");
*out = to_heap_buffer(to_buffer(vk));
}

WASM_EXPORT void acir_honk_solidity_verifier(uint8_t const* proof_buf, uint8_t const* vk_buf, uint8_t** out)
{
using VerificationKey = UltraKeccakFlavor::VerificationKey;
Expand Down
3 changes: 3 additions & 0 deletions barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,15 @@ WASM_EXPORT void acir_serialize_verification_key_into_fields(in_ptr acir_compose

WASM_EXPORT void acir_prove_ultra_honk(uint8_t const* acir_vec, uint8_t const* witness_vec, uint8_t** out);
WASM_EXPORT void acir_prove_ultra_keccak_honk(uint8_t const* acir_vec, uint8_t const* witness_vec, uint8_t** out);
WASM_EXPORT void acir_prove_ultra_starknet_honk(uint8_t const* acir_vec, uint8_t const* witness_vec, uint8_t** out);

WASM_EXPORT void acir_verify_ultra_honk(uint8_t const* proof_buf, uint8_t const* vk_buf, bool* result);
WASM_EXPORT void acir_verify_ultra_keccak_honk(uint8_t const* proof_buf, uint8_t const* vk_buf, bool* result);
WASM_EXPORT void acir_verify_ultra_starknet_honk(uint8_t const* proof_buf, uint8_t const* vk_buf, bool* result);

WASM_EXPORT void acir_write_vk_ultra_honk(uint8_t const* acir_vec, uint8_t** out);
WASM_EXPORT void acir_write_vk_ultra_keccak_honk(uint8_t const* acir_vec, uint8_t** out);
WASM_EXPORT void acir_write_vk_ultra_starknet_honk(uint8_t const* acir_vec, uint8_t** out);

WASM_EXPORT void acir_proof_as_fields_ultra_honk(uint8_t const* proof_buf, fr::vec_out_buf out);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,8 @@ template <class Params_> struct alignas(32) field {

BB_INLINE constexpr field pow(const uint256_t& exponent) const noexcept;
BB_INLINE constexpr field pow(uint64_t exponent) const noexcept;
static_assert(Params::modulus_0 != 1);
// STARKNET: next line was commented as stark252 violates the assertion
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ledwards2225 I suppose this isn't high risk as we only pass known params here?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can probably delete this

// static_assert(Params::modulus_0 != 1);
static constexpr uint256_t modulus_minus_two =
uint256_t(Params::modulus_0 - 2ULL, Params::modulus_1, Params::modulus_2, Params::modulus_3);
constexpr field invert() const noexcept;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
add_subdirectory(poseidon)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
barretenberg_module(ext_starknet_crypto_poseidon ecc)
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include "poseidon.hpp"

namespace bb::starknet::crypto {

template <typename Params>
typename Poseidon<Params>::FF Poseidon<Params>::hash(const std::vector<typename Poseidon<Params>::FF>& input)
{
return Sponge::hash_internal(input);
}

template <typename Params>
typename Poseidon<Params>::FF Poseidon<Params>::hash(const std::vector<typename Poseidon<Params>::FF>& input, FF iv)
{
return Sponge::hash_internal(input, iv);
}

template class Poseidon<PoseidonStark252BaseFieldParams>;

} // namespace bb::starknet::crypto
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include "barretenberg/crypto/poseidon2/sponge/sponge.hpp"
#include "poseidon_params.hpp"
#include "poseidon_permutation.hpp"

namespace bb::starknet::crypto {

template <typename Params> class Poseidon {
public:
using FF = typename Params::FF;

using Sponge = bb::crypto::FieldSponge<FF, Params::t - 1, 1, Params::t, PoseidonPermutation<Params>>;

static FF hash(const std::vector<FF>& input);

static FF hash(const std::vector<FF>& input, FF iv);
};

extern template class Poseidon<PoseidonStark252BaseFieldParams>;

} // namespace bb::starknet::crypto
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include "poseidon.hpp"
#include "barretenberg/ext/starknet/ecc/curves/stark252/stark252.hpp"
#include "poseidon_params.hpp"
#include <gtest/gtest.h>

using namespace bb::starknet;

namespace {
auto& engine = bb::numeric::get_debug_randomness();
}

TEST(Poseidon, HashBasicTests)
{
using fq = stark252::fq;

fq a = fq::random_element(&engine);
fq b = fq::random_element(&engine);
fq c = fq::random_element(&engine);
fq d = fq::random_element(&engine);

std::vector<fq> input1{ a, b, c, d };
std::vector<fq> input2{ d, c, b, a };

auto r0 = crypto::Poseidon<crypto::PoseidonStark252BaseFieldParams>::hash(input1);
auto r1 = crypto::Poseidon<crypto::PoseidonStark252BaseFieldParams>::hash(input1);
auto r2 = crypto::Poseidon<crypto::PoseidonStark252BaseFieldParams>::hash(input2);

EXPECT_EQ(r0, r1);
EXPECT_NE(r0, r2);
}

TEST(Poseidon, HashConsistencyCheck)
{
using fq = stark252::fq;

fq a(std::string("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"));
fq b(std::string("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"));
fq c(std::string("0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"));
fq d(std::string("0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"));

std::vector<fq> input{ a, b, c, d };
auto result = crypto::Poseidon<crypto::PoseidonStark252BaseFieldParams>::hash(input);

fq expected(std::string("0x0494e3a5a8047943395f79e41f11ba73285be9aa930953fbad060c0649a7c79d"));

EXPECT_EQ(result, expected);
}
Loading