mina_tree/proofs/public_input/
protocol_state.rs1use mina_curves::pasta::Fp;
2use mina_p2p_messages::v2::MinaBaseProtocolConstantsCheckedValueStableV1;
3
4use crate::{
5 proofs::block::{
6 consensus::{CheckedConsensusState, ConsensusState},
7 ProtocolStateBody,
8 },
9 scan_state::transaction_logic::protocol_state::{EpochData, EpochLedger},
10 AppendToInputs as _, ToInputs,
11};
12use poseidon::hash::Inputs;
13
14impl ToInputs for crate::proofs::block::BlockchainState {
15 fn to_inputs(&self, inputs: &mut Inputs) {
16 let Self {
17 staged_ledger_hash,
18 genesis_ledger_hash,
19 ledger_proof_statement,
20 timestamp,
21 body_reference,
22 } = self;
23
24 {
26 let crate::staged_ledger::hash::StagedLedgerHash {
27 non_snark,
28 pending_coinbase_hash,
29 } = staged_ledger_hash;
30
31 inputs.append_bytes(non_snark.digest().as_ref());
32 inputs.append_field(*pending_coinbase_hash);
33 }
34 inputs.append_field(*genesis_ledger_hash);
36
37 {
39 let crate::scan_state::scan_state::transaction_snark::Statement {
40 source,
41 target,
42 connecting_ledger_left,
43 connecting_ledger_right,
44 supply_increase,
45 fee_excess,
46 sok_digest,
47 } = ledger_proof_statement;
48
49 let _sok_digest: &() = sok_digest;
50
51 inputs.append(source);
52 inputs.append(target);
53
54 inputs.append_field(*connecting_ledger_left);
55 inputs.append_field(*connecting_ledger_right);
56
57 inputs.append_u64(supply_increase.magnitude.as_u64());
58 inputs.append_bool(supply_increase.sgn.is_pos());
59
60 let crate::scan_state::fee_excess::FeeExcess {
61 fee_token_l,
62 fee_excess_l,
63 fee_token_r,
64 fee_excess_r,
65 } = fee_excess;
66
67 inputs.append(fee_token_l);
68 inputs.append_u64(fee_excess_l.magnitude.as_u64());
69 inputs.append_bool(fee_excess_l.sgn.is_pos());
70
71 inputs.append(fee_token_r);
72 inputs.append_u64(fee_excess_r.magnitude.as_u64());
73 inputs.append_bool(fee_excess_r.sgn.is_pos());
74 }
75
76 inputs.append_u64(timestamp.as_u64());
77 inputs.append_bytes(body_reference.as_ref());
78 }
79}
80
81impl ToInputs for MinaBaseProtocolConstantsCheckedValueStableV1 {
82 fn to_inputs(&self, inputs: &mut Inputs) {
83 let Self {
84 k,
85 slots_per_epoch,
86 slots_per_sub_window,
87 delta,
88 grace_period_slots,
89 genesis_state_timestamp,
90 } = self;
91
92 inputs.append_u32(k.as_u32());
93 inputs.append_u32(delta.as_u32());
94 inputs.append_u32(slots_per_epoch.as_u32());
95 inputs.append_u32(slots_per_sub_window.as_u32());
96 inputs.append_u32(grace_period_slots.as_u32());
97 inputs.append_u64(genesis_state_timestamp.as_u64());
98 }
99}
100
101impl ToInputs for ConsensusState {
102 fn to_inputs(&self, inputs: &mut Inputs) {
103 let crate::proofs::block::consensus::ConsensusState {
104 blockchain_length,
105 epoch_count,
106 min_window_density,
107 sub_window_densities,
108 last_vrf_output,
109 total_currency,
110 curr_global_slot_since_hard_fork,
111 global_slot_since_genesis,
112 staking_epoch_data,
113 next_epoch_data,
114 has_ancestor_in_same_checkpoint_window,
115 block_stake_winner,
116 block_creator,
117 coinbase_receiver,
118 supercharge_coinbase,
119 } = self;
120
121 inputs.append(blockchain_length);
122 inputs.append(epoch_count);
123 inputs.append(min_window_density);
124
125 for window in sub_window_densities {
126 inputs.append(window);
127 }
128 for b in last_vrf_output.iter() {
129 inputs.append_bool(*b);
130 }
131
132 inputs.append(total_currency);
133 inputs.append(&curr_global_slot_since_hard_fork.slot_number);
134 inputs.append(&curr_global_slot_since_hard_fork.slots_per_epoch);
135 inputs.append(global_slot_since_genesis);
136 inputs.append_bool(*has_ancestor_in_same_checkpoint_window);
137 inputs.append_bool(*supercharge_coinbase);
138
139 inputs.append(staking_epoch_data);
140 inputs.append(next_epoch_data);
141
142 inputs.append(block_stake_winner);
143 inputs.append(block_creator);
144 inputs.append(coinbase_receiver);
145 }
146}
147
148impl ToInputs for CheckedConsensusState {
149 fn to_inputs(&self, inputs: &mut Inputs) {
150 let crate::proofs::block::consensus::CheckedConsensusState {
151 blockchain_length,
152 epoch_count,
153 min_window_density,
154 sub_window_densities,
155 last_vrf_output,
156 total_currency,
157 curr_global_slot_since_hard_fork,
158 global_slot_since_genesis,
159 staking_epoch_data,
160 next_epoch_data,
161 has_ancestor_in_same_checkpoint_window,
162 block_stake_winner,
163 block_creator,
164 coinbase_receiver,
165 supercharge_coinbase,
166 } = self;
167
168 inputs.append(blockchain_length);
169 inputs.append(epoch_count);
170 inputs.append(min_window_density);
171
172 for window in sub_window_densities {
173 inputs.append(window);
174 }
175 for b in last_vrf_output.iter() {
176 inputs.append_bool(*b);
177 }
178
179 inputs.append(total_currency);
180 inputs.append(&curr_global_slot_since_hard_fork.slot_number);
181 inputs.append(&curr_global_slot_since_hard_fork.slots_per_epoch);
182 inputs.append(global_slot_since_genesis);
183 inputs.append_bool(has_ancestor_in_same_checkpoint_window.as_bool());
184 inputs.append_bool(supercharge_coinbase.as_bool());
185
186 inputs.append(staking_epoch_data);
187 inputs.append(next_epoch_data);
188
189 inputs.append(block_stake_winner);
190 inputs.append(block_creator);
191 inputs.append(coinbase_receiver);
192 }
193}
194
195impl ToInputs for EpochData<Fp> {
196 fn to_inputs(&self, inputs: &mut Inputs) {
197 let EpochData {
198 ledger,
199 seed,
200 start_checkpoint,
201 lock_checkpoint,
202 epoch_length,
203 } = self;
204
205 inputs.append(seed);
206 inputs.append(start_checkpoint);
207 inputs.append(epoch_length);
208
209 let EpochLedger {
210 hash,
211 total_currency,
212 } = ledger;
213
214 inputs.append(hash);
215 inputs.append(total_currency);
216 inputs.append(lock_checkpoint);
217 }
218}
219
220impl<CS: ToInputs> ToInputs for ProtocolStateBody<CS> {
221 fn to_inputs(&self, inputs: &mut Inputs) {
222 let Self {
223 genesis_state_hash,
224 blockchain_state,
225 consensus_state,
226 constants,
227 } = &self;
228
229 constants.to_inputs(inputs);
231 inputs.append_field(*genesis_state_hash);
233 blockchain_state.to_inputs(inputs);
235 consensus_state.to_inputs(inputs);
237 }
238}