keri_core/event/event_data/
rotation.rs

1use super::super::sections::{seal::*, KeyConfig, RotationWitnessConfig};
2use crate::{
3    database::redb::rkyv_adapter::said_wrapper::SaidValue,
4    error::Error,
5    prefix::BasicPrefix,
6    state::{EventSemantics, IdentifierState, LastEstablishmentData, WitnessConfig},
7};
8use said::SelfAddressingIdentifier;
9use serde::{Deserialize, Serialize};
10
11/// Rotation Event
12///
13/// Describes the rotation (rot) event data
14#[derive(
15    Serialize,
16    Deserialize,
17    Debug,
18    Clone,
19    PartialEq,
20    rkyv::Archive,
21    rkyv::Serialize,
22    rkyv::Deserialize,
23)]
24#[rkyv(derive(Debug))]
25pub struct RotationEvent {
26    #[serde(rename = "p")]
27    previous_event_hash: SaidValue,
28
29    #[serde(flatten)]
30    pub key_config: KeyConfig,
31
32    #[serde(flatten)]
33    pub witness_config: RotationWitnessConfig,
34
35    #[serde(rename = "a")]
36    pub data: Vec<Seal>,
37}
38
39impl RotationEvent {
40    pub fn new(
41        previous_event_hash: SelfAddressingIdentifier,
42        kc: KeyConfig,
43        witness_config: RotationWitnessConfig,
44        data: Vec<Seal>,
45    ) -> Self {
46        Self {
47            previous_event_hash: previous_event_hash.into(),
48            key_config: kc,
49            witness_config,
50            data,
51        }
52    }
53
54    pub fn previous_event_hash(&self) -> &SelfAddressingIdentifier {
55        &self.previous_event_hash.said
56    }
57}
58
59impl EventSemantics for RotationEvent {
60    fn apply_to(&self, state: IdentifierState) -> Result<IdentifierState, Error> {
61        if state.current.verify_next(&self.key_config)? {
62            // witness rotation processing
63            let witnesses =
64                if !self.witness_config.prune.is_empty() || !self.witness_config.graft.is_empty() {
65                    let mut prunned = state
66                        .witness_config
67                        .witnesses
68                        .into_iter()
69                        .filter(|e| !self.witness_config.prune.contains(e))
70                        .collect::<Vec<BasicPrefix>>();
71                    prunned.append(&mut self.witness_config.graft.clone());
72                    prunned
73                } else {
74                    state.witness_config.witnesses.clone()
75                };
76            let witness_config = WitnessConfig {
77                tally: self.witness_config.tally.clone(),
78                witnesses,
79            };
80            let last_est = LastEstablishmentData {
81                sn: state.sn,
82                digest: state.last_event_digest.clone(),
83                br: self.witness_config.graft.clone(),
84                ba: self.witness_config.prune.clone(),
85            };
86
87            Ok(IdentifierState {
88                current: self.key_config.clone(),
89                witness_config,
90                last_est,
91                ..state
92            })
93        } else {
94            Err(Error::SemanticError("Incorrect Key Config binding".into()))
95        }
96    }
97}