mina_tree/scan_state/
protocol_state.rs

1use mina_curves::pasta::Fp;
2
3use crate::{proofs::block::ProtocolState, ToInputs};
4use poseidon::hash::{
5    hash_with_kimchi,
6    params::{MINA_PROTO_STATE, MINA_PROTO_STATE_BODY},
7    Inputs,
8};
9
10pub trait MinaHash {
11    fn hash(&self) -> Fp;
12}
13
14impl MinaHash for crate::proofs::block::ProtocolStateBody {
15    fn hash(&self) -> Fp {
16        self.hash_with_param(&MINA_PROTO_STATE_BODY)
17    }
18}
19
20pub fn hashes_abstract(previous_state_hash: Fp, body_hash: Fp) -> Fp {
21    let mut inputs = Inputs::new();
22
23    inputs.append_field(previous_state_hash);
24    inputs.append_field(body_hash);
25
26    hash_with_kimchi(&MINA_PROTO_STATE, &inputs.to_fields())
27}
28
29impl ProtocolState {
30    /// Returns (state_hash, state_body_hash)
31    pub fn hashes(&self) -> (Fp, Fp) {
32        let Self {
33            previous_state_hash,
34            body,
35        } = self;
36
37        let state_body_hash = MinaHash::hash(body);
38        let state_hash = hashes_abstract(*previous_state_hash, state_body_hash);
39        (state_hash, state_body_hash)
40    }
41}
42
43impl MinaHash for ProtocolState {
44    fn hash(&self) -> Fp {
45        let Self {
46            previous_state_hash,
47            body,
48        } = self;
49
50        let body_hash = MinaHash::hash(body);
51        hashes_abstract(*previous_state_hash, body_hash)
52    }
53}