Skip to content
Merged
Show file tree
Hide file tree
Changes from 81 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
4 changes: 2 additions & 2 deletions barretenberg/acir_tests/bbjs-test/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ async function generateProof({
const backend = new UltraHonkBackend(bytecode, { threads: multiThreaded ? 8 : 1 });

const witness = await fs.readFile(witnessPath);
const proof = await backend.generateProof(new Uint8Array(witness), { keccak: (oracleHash === "keccak") });
const proof = await backend.generateProof(new Uint8Array(witness), { keccak: (oracleHash === "keccak"), starknet: (oracleHash === "starknet") });

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This seems like it's better as an enum now, adding two mutually exclusive options isn't ideal

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I though about it, but it would break the current typing of the API. Would that be ok?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

It's a good point, that's not a big breaking change but we can save it for a follow-up regardless. Not a blocker.

assert(proof.proof.length === UH_PROOF_LENGTH_IN_BYTES, `Unexpected proof length ${proof.proof.length} for ${bytecodePath}`);

await fs.writeFile(proofPath(outputDirectory), Buffer.from(proof.proof));
Expand All @@ -45,7 +45,7 @@ async function generateProof({
await fs.writeFile(publicInputsPath(outputDirectory), JSON.stringify(proof.publicInputs));
debug("Public inputs written to " + publicInputsPath(outputDirectory));

const verificationKey = await backend.getVerificationKey({ keccak: (oracleHash === "keccak") });
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 @@ -184,6 +184,7 @@ function test_cmds_internal {
echo SYS=ultra_honk FLOW=prove_then_verify RECURSIVE=true $run_test assert_statement
echo SYS=ultra_honk FLOW=prove_then_verify RECURSIVE=true $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
1 change: 1 addition & 0 deletions barretenberg/cpp/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ set(BARRETENBERG_TARGET_OBJECTS
$<TARGET_OBJECTS:crypto_keccak_objects>
$<TARGET_OBJECTS:crypto_pedersen_commitment_objects>
$<TARGET_OBJECTS:crypto_pedersen_hash_objects>
$<TARGET_OBJECTS:crypto_poseidon_objects>
$<TARGET_OBJECTS:crypto_poseidon2_objects>
$<TARGET_OBJECTS:crypto_schnorr_objects>
$<TARGET_OBJECTS:crypto_sha256_objects>
Expand Down
21 changes: 19 additions & 2 deletions barretenberg/cpp/src/barretenberg/api/api_ultra_honk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Circuit _compute_circuit(const std::string& bytecode_path,
const bool init_kzg_accumulator)
{
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 @@ -144,8 +144,12 @@ void UltraHonkAPI::prove(const Flags& flags,
_write(_prove<UltraFlavor>(flags.write_vk, init, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "keccak" && !flags.zk) {
_write(_prove<UltraKeccakFlavor>(flags.write_vk, init, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "starknet" && !flags.zk) {
_write(_prove<UltraStarknetFlavor>(flags.write_vk, init, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "keccak" && flags.zk) {
_write(_prove<UltraKeccakZKFlavor>(flags.write_vk, init, bytecode_path, witness_path));
} else if (flags.oracle_hash_type == "starknet" && flags.zk) {
_write(_prove<UltraStarknetZKFlavor>(flags.write_vk, init, bytecode_path, witness_path));
} else {
throw_or_abort("Invalid proving options specified in _prove");
}
Expand All @@ -160,14 +164,23 @@ bool UltraHonkAPI::verify(const Flags& flags,
return _verify<UltraRollupFlavor>(ipa_accumulation, proof_path, vk_path);
}
if (flags.zk) {
return _verify<UltraKeccakZKFlavor>(ipa_accumulation, proof_path, vk_path);
if (flags.oracle_hash_type == "keccak") {
return _verify<UltraKeccakZKFlavor>(ipa_accumulation, proof_path, vk_path);
}
if (flags.oracle_hash_type == "starknet") {
return _verify<UltraStarknetZKFlavor>(ipa_accumulation, proof_path, vk_path);
}
return false;
}
if (flags.oracle_hash_type == "poseidon2") {
return _verify<UltraFlavor>(ipa_accumulation, proof_path, vk_path);
}
if (flags.oracle_hash_type == "keccak") {
return _verify<UltraKeccakFlavor>(ipa_accumulation, proof_path, vk_path);
}
if (flags.oracle_hash_type == "starknet") {
return _verify<UltraStarknetFlavor>(ipa_accumulation, proof_path, vk_path);
}
return false;
}

Expand All @@ -193,8 +206,12 @@ void UltraHonkAPI::write_vk(const Flags& flags,
_write(_compute_vk<UltraFlavor>(init, bytecode_path, ""));
} else if (flags.oracle_hash_type == "keccak" && !flags.zk) {
_write(_compute_vk<UltraKeccakFlavor>(init, bytecode_path, ""));
} else if (flags.oracle_hash_type == "starknet" && !flags.zk) {
_write(_compute_vk<UltraStarknetFlavor>(init, bytecode_path, ""));
} else if (flags.oracle_hash_type == "keccak" && flags.zk) {
_write(_compute_vk<UltraKeccakZKFlavor>(init, bytecode_path, ""));
} else if (flags.oracle_hash_type == "starknet" && flags.zk) {
_write(_compute_vk<UltraStarknetZKFlavor>(init, bytecode_path, ""));
} else {
throw_or_abort("Invalid proving options specified in _prove");
}
Expand Down
5 changes: 3 additions & 2 deletions barretenberg/cpp/src/barretenberg/bb/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,9 @@ int main(int argc, char* argv[])
"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"));
"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
Expand Up @@ -9,6 +9,7 @@
#include "barretenberg/stdlib/primitives/curves/grumpkin.hpp"
#include "barretenberg/stdlib_circuit_builders/mega_zk_flavor.hpp"
#include "barretenberg/stdlib_circuit_builders/ultra_keccak_zk_flavor.hpp"
#include "barretenberg/stdlib_circuit_builders/ultra_starknet_zk_flavor.hpp"
#include "barretenberg/stdlib_circuit_builders/ultra_zk_flavor.hpp"
#include "barretenberg/sumcheck/zk_sumcheck_data.hpp"
#include "barretenberg/translator_vm/translator_flavor.hpp"
Expand Down Expand Up @@ -440,6 +441,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
1 change: 1 addition & 0 deletions barretenberg/cpp/src/barretenberg/crypto/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ add_subdirectory(sha256)
add_subdirectory(ecdsa)
add_subdirectory(aes128)
add_subdirectory(poseidon2)
add_subdirectory(poseidon)

if (NOT WASM)
add_subdirectory(merkle_tree)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
barretenberg_module(crypto_poseidon)
61 changes: 61 additions & 0 deletions barretenberg/cpp/src/barretenberg/crypto/poseidon/poseidon.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#include "poseidon.hpp"

namespace bb::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>;

PoseidonHash poseidon_stark252(const std::vector<uint8_t>& input)
{
assert(input.size() % 32 == 0);

using Poseidon = Poseidon<PoseidonStark252BaseFieldParams>;
using FF = Poseidon::FF;

FF iv = FF(1);

size_t elem_count = input.size() / 32;
std::vector<FF> elems(2 * (1 + elem_count));

elems[0] = FF(std::string("0x0000000000000000000000000000000000000000537461726b6e6574486f6e6b")); // "StarknetHonk"
elems[1] = FF(0);

for (size_t k = 0; k < input.size() / 32; ++k) {
std::array<uint8_t, 32> limb_lo = {};
std::array<uint8_t, 32> limb_hi = {};

for (size_t i = 16; i < 32; ++i) {
limb_hi[i] = input[k * 32 + i - 16];
limb_lo[i] = input[k * 32 + i];
}

FF limb0 = from_buffer<FF>(limb_lo);
FF limb1 = from_buffer<FF>(limb_hi);

elems[2 * (1 + k) + 0] = limb0;
elems[2 * (1 + k) + 1] = limb1;
}

FF output = Poseidon::hash(elems, iv);

std::vector<uint8_t> digest = to_buffer(output);

PoseidonHash result;
for (size_t i = 0; i < 32; ++i) {
result[i] = digest[i];
}
return result;
}

} // namespace bb::crypto
29 changes: 29 additions & 0 deletions barretenberg/cpp/src/barretenberg/crypto/poseidon/poseidon.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#pragma once

#include <array>
#include <cstdint>
#include <vector>
#include "poseidon_params.hpp"
#include "poseidon_permutation.hpp"
#include "barretenberg/crypto/poseidon2/sponge/sponge.hpp"

namespace bb::crypto {

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

using Sponge = 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>;

using PoseidonHash = std::array<uint8_t, 32>;

PoseidonHash poseidon_stark252(const std::vector<uint8_t>& input);

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

using namespace bb;

namespace {
auto& engine = 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