mina_tree/proofs/public_input/
protocol_state.rs

1use 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        // Self::blockchain_state.staged_ledger_hash
25        {
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        // Self::blockchain_state.genesis_ledger_hash
35        inputs.append_field(*genesis_ledger_hash);
36
37        // Self::blockchain_state.ledger_proof_statement
38        {
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
230        constants.to_inputs(inputs);
231        // Genesis
232        inputs.append_field(*genesis_state_hash);
233        // This is blockchain_state
234        blockchain_state.to_inputs(inputs);
235        // CONSENSUS
236        consensus_state.to_inputs(inputs);
237    }
238}