keri_core/event/event_data/
rotation.rs1use 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#[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 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}