penumbra_sdk_mock_consensus/
builder.rs1mod init_chain;
7
8use {
9 crate::{Keyring, OnBlockFn, TestNode, TsCallbackFn},
10 anyhow::Result,
11 bytes::Bytes,
12 ed25519_consensus::{SigningKey, VerificationKey},
13 std::time::Duration,
14 tendermint::{Genesis, Time},
15};
16
17fn default_ts_callback(t: Time) -> Time {
20 t.checked_add(Duration::from_secs(5)).unwrap()
21}
22
23#[derive(Default)]
25pub struct Builder {
26 pub app_state: Option<Bytes>,
27 pub keyring: Keyring,
28 pub on_block: Option<OnBlockFn>,
29 pub ts_callback: Option<TsCallbackFn>,
30 pub initial_timestamp: Option<Time>,
31 pub chain_id: Option<String>,
32 pub hardcoded_genesis: Option<Genesis>,
36 pub keys: Vec<(SigningKey, VerificationKey)>,
42}
43
44impl TestNode<()> {
45 pub fn builder() -> Builder {
47 Builder::default()
48 }
49}
50
51impl Builder {
52 pub fn app_state(self, app_state: impl Into<Bytes>) -> Self {
54 let Self {
55 app_state: prev, ..
56 } = self;
57
58 if let Some(prev) = prev {
60 tracing::warn!(
61 ?prev,
62 "builder overwriting a previously set `app_state`, this may be a bug!"
63 );
64 }
65
66 Self {
67 app_state: Some(app_state.into()),
68 ..self
69 }
70 }
71
72 pub fn single_validator(self) -> Self {
74 let Self { keyring: prev, .. } = self;
75
76 if !prev.is_empty() {
78 tracing::warn!(
79 count = %prev.len(),
80 "builder overwriting entries in keyring, this may be a bug!"
81 );
82 }
83
84 let mut keyring = Keyring::new();
86 if self.keys.len() >= 1 {
87 Self::add_key(&mut keyring, self.keys[0].clone());
88 } else {
89 let key = Self::generate_key();
90 Self::add_key(&mut keyring, key);
91 }
92
93 Self { keyring, ..self }
94 }
95
96 pub fn two_validators(self) -> Self {
98 let Self { keyring: prev, .. } = self;
99
100 if !prev.is_empty() {
102 tracing::warn!(
103 count = %prev.len(),
104 "builder overwriting entries in keyring, this may be a bug!"
105 );
106 }
107
108 let mut keyring = Keyring::new();
110 if self.keys.len() >= 2 {
111 Self::add_key(&mut keyring, self.keys[0].clone());
112 Self::add_key(&mut keyring, self.keys[1].clone());
113 } else {
114 let key = Self::generate_key();
115 Self::add_key(&mut keyring, key);
116 let key = Self::generate_key();
117 Self::add_key(&mut keyring, key);
118 }
119
120 Self { keyring, ..self }
121 }
122
123 fn generate_key() -> (SigningKey, VerificationKey) {
125 let sk = ed25519_consensus::SigningKey::new(rand_core::OsRng);
126 let vk = sk.verification_key();
127 tracing::trace!(verification_key = ?vk, "generated consensus key");
128
129 (sk, vk)
130 }
131
132 fn add_key(keyring: &mut Keyring, key: (SigningKey, VerificationKey)) {
134 let (sk, vk) = key;
135 keyring.insert(vk, sk);
136 }
137
138 pub fn on_block<F>(self, f: F) -> Self
140 where
141 F: FnMut(tendermint::Block) + Send + Sync + 'static,
142 {
143 Self {
144 on_block: Some(Box::new(f)),
145 ..self
146 }
147 }
148
149 pub fn ts_callback<F>(self, f: F) -> Self
152 where
153 F: Fn(Time) -> Time + Send + Sync + 'static,
154 {
155 Self {
156 ts_callback: Some(Box::new(f)),
157 ..self
158 }
159 }
160
161 pub fn with_initial_timestamp(self, initial_time: Time) -> Self {
164 Self {
165 initial_timestamp: Some(initial_time),
166 ..self
167 }
168 }
169
170 pub fn with_keys(self, keys: Vec<(SigningKey, VerificationKey)>) -> Self {
172 let Self {
173 keyring: ref prev, ..
174 } = self;
175
176 if !prev.is_empty() {
178 panic!("with_keys should be called prior to constructing the keyring");
179 }
180
181 Self { keys: keys, ..self }
182 }
183
184 pub fn with_tendermint_genesis(self, genesis: Genesis) -> Self {
188 let Self { .. } = &self;
189 Self {
190 app_state: Some(serde_json::to_vec(&genesis.app_state).unwrap().into()),
191 initial_timestamp: Some(genesis.genesis_time),
192 hardcoded_genesis: Some(genesis),
193 ..self
194 }
195 }
196}