-
Notifications
You must be signed in to change notification settings - Fork 416
Expand file tree
/
Copy pathprove_m31_poseidon2.rs
More file actions
90 lines (73 loc) · 2.77 KB
/
prove_m31_poseidon2.rs
File metadata and controls
90 lines (73 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use std::fmt::Debug;
use std::marker::PhantomData;
use p3_challenger::DuplexChallenger;
use p3_circle::CirclePcs;
use p3_commit::ExtensionMmcs;
use p3_field::extension::BinomialExtensionField;
use p3_field::Field;
use p3_fri::FriConfig;
use p3_keccak_air::{generate_trace_rows, KeccakAir};
use p3_merkle_tree::FieldMerkleTreeMmcs;
use p3_mersenne_31::{DiffusionMatrixMersenne31, Mersenne31};
use p3_poseidon2::{Poseidon2, Poseidon2ExternalMatrixGeneral};
use p3_symmetric::{PaddingFreeSponge, TruncatedPermutation};
use p3_uni_stark::{prove, verify, StarkConfig};
use rand::{random, thread_rng};
use tracing_forest::util::LevelFilter;
use tracing_forest::ForestLayer;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{EnvFilter, Registry};
const NUM_HASHES: usize = 1365;
fn main() -> Result<(), impl Debug> {
let env_filter = EnvFilter::builder()
.with_default_directive(LevelFilter::INFO.into())
.from_env_lossy();
Registry::default()
.with(env_filter)
.with(ForestLayer::default())
.init();
type Val = Mersenne31;
type Challenge = BinomialExtensionField<Val, 3>;
type Perm = Poseidon2<Val, Poseidon2ExternalMatrixGeneral, DiffusionMatrixMersenne31, 16, 5>;
let perm = Perm::new_from_rng_128(
Poseidon2ExternalMatrixGeneral,
DiffusionMatrixMersenne31,
&mut thread_rng(),
);
type MyHash = PaddingFreeSponge<Perm, 16, 8, 8>;
let hash = MyHash::new(perm.clone());
type MyCompress = TruncatedPermutation<Perm, 2, 8, 16>;
let compress = MyCompress::new(perm.clone());
type ValMmcs = FieldMerkleTreeMmcs<
<Val as Field>::Packing,
<Val as Field>::Packing,
MyHash,
MyCompress,
8,
>;
let val_mmcs = ValMmcs::new(hash, compress);
type ChallengeMmcs = ExtensionMmcs<Val, Challenge, ValMmcs>;
let challenge_mmcs = ChallengeMmcs::new(val_mmcs.clone());
type Challenger = DuplexChallenger<Val, Perm, 16, 8>;
let fri_config = FriConfig {
log_blowup: 1,
num_queries: 100,
proof_of_work_bits: 16,
mmcs: challenge_mmcs,
};
type Pcs = CirclePcs<Val, ValMmcs, ChallengeMmcs>;
let pcs = Pcs {
mmcs: val_mmcs,
fri_config,
_phantom: PhantomData,
};
type MyConfig = StarkConfig<Pcs, Challenge, Challenger>;
let config = MyConfig::new(pcs);
let inputs = (0..NUM_HASHES).map(|_| random()).collect::<Vec<_>>();
let trace = generate_trace_rows::<Val>(inputs);
let mut challenger = Challenger::new(perm.clone());
let proof = prove(&config, &KeccakAir {}, &mut challenger, trace, &vec![]);
let mut challenger = Challenger::new(perm);
verify(&config, &KeccakAir {}, &mut challenger, &proof, &vec![])
}