8c1489b273 | ||
---|---|---|
.. | ||
benches | ||
src | ||
.gitignore | ||
BENCHMARKS.md | ||
Cargo.toml | ||
README.md |
README.md
Poseidon2 Plonky2
WARNING: This is a work-in-progress prototype, and has not received careful code review. This implementation is NOT ready for production use.
This crate is an implementation of the Poseidon2 Hash that can be employed in the Plonky2 proving system. Poseidon2 hash function is a new zk-friendly hash function, and provides good performance. The hash and gate implementations are based on the plonky2 Poseidon hash and gate.
The Poseidon2 Hash implementation is consistent with that in here: https://github.com/HorizenLabs/poseidon2
Code Organization
This crate include:
This crate can be used to:
- Generate Plonky2 proofs employing the Poseidon2 hash function
- Write Plonky2 circuits computing Poseidon2 hashes
Building
This crate requires the Rust nightly compiler due to the use of certain unstable features. To install the nightly toolchain, use rustup
:
rustup install nightly
To ensure that the nightly toolchain is used when building this crate, you can set the override in the project directory:
rustup override set nightly
Alternatively, you can specify the nightly toolchain when building:
cargo +nightly build
Usage
The Poseidon2 hash can be used directly to compute hash values over an array of field elements. Below is a simplified example demonstrating how to use the Poseidon2 hash function:
use crate::poseidon2_hash::poseidon2::{Poseidon2, SPONGE_WIDTH};
use plonky2_field::goldilocks_field::GoldilocksField as F;
use plonky2_field::types::Field;
fn main() {
// Create an input array of field elements for hashing
let mut input = [F::ZERO; SPONGE_WIDTH];
// [0,1,2,3,4,5,6,7,8,9,10,11]
for i in 0..SPONGE_WIDTH {
input[i] = F::from_canonical_u64(i as u64);
}
// Compute the Poseidon2 hash
let output = F::poseidon2(input);
// Print the input values
for i in 0..SPONGE_WIDTH {
println!("input {} = {}", i, input[i]);
}
// Print the output values
for i in 0..SPONGE_WIDTH {
println!("out {} = {}", i, output[i]);
}
}
Benchmark Results
Benchmark results are shown in BENCHMARKS.md