binius_iop/fri/
size_estimation.rs1use binius_field::BinaryField;
4
5use super::common::FRIParams;
6use crate::merkle_tree::MerkleTreeScheme;
7
8pub fn proof_size<F, VCS>(params: &FRIParams<F>, vcs: &VCS) -> usize
21where
22 F: BinaryField,
23 VCS: MerkleTreeScheme<F>,
24{
25 let digest_size = std::mem::size_of::<VCS::Digest>();
26
27 let value_size = {
29 let mut buf = Vec::new();
30 F::default()
31 .serialize(&mut buf)
32 .expect("default element can be serialized to a resizable buffer");
33 buf.len()
34 };
35
36 let n_test_queries = params.n_test_queries();
37
38 let commitment_msg_size = (params.input_oracles().len() + params.n_oracles()) * digest_size;
40
41 let log_terminal_dim = params.n_final_challenges();
43 let log_inv_rate = params.rs_code().log_inv_rate();
44 let terminate_codeword_size = (1 << (log_terminal_dim + log_inv_rate)) * value_size;
45
46 let mut merkle_sizes = 0;
47 let mut coset_values_size = 0;
48
49 let mut open = |log_n_cosets: usize, arity: usize| {
52 let layer_depth = vcs.optimal_verify_layer(n_test_queries, log_n_cosets);
53 merkle_sizes += vcs.proof_size(1 << log_n_cosets, n_test_queries, layer_depth);
54 coset_values_size += n_test_queries * (1 << arity) * value_size;
55 };
56
57 let log_dim = params.rs_code().log_dim();
62 for spec in params.input_oracles() {
63 open(log_dim - spec.log_lift + log_inv_rate, spec.log_batch_size());
64 }
65
66 let mut log_n_cosets = params.index_bits();
69 for &arity in params.fold_arities() {
70 log_n_cosets -= arity;
71 open(log_n_cosets, arity);
72 }
73
74 commitment_msg_size + terminate_codeword_size + merkle_sizes + coset_values_size
75}