mina_tree/scan_state/
protocol_state.rs1use 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 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}