Skip to content

Commit a0c0045

Browse files
committed
test: add praos test case
1 parent 59aa122 commit a0c0045

File tree

4 files changed

+84
-16
lines changed

4 files changed

+84
-16
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
828a1a0077dae71a046344c15820991e0770751806103894d8fffaf86fcc90f238c6ac00bdc7cb0a953e4a59fd93582041ec779d32f5ca1fc81a8cb4152e6bc1f0ab569abe1c0de8b66d76242d23a70f5820b5b6a6b790e6926f6ba856255aaf3eb5192cc80c03eeec7469cd3f64344bafb78258403f42ef44b8525ee45ca45a094191f00b359e9205a400b0607c87fe488f3b44442afc9e7c3e28ded9080c71d84eb7840ecb2e7240721ee243b45a761048ad6c53585054ac3b2bc94b54705b951146a83cba92041fdf537644628c64e9549365e74c10502fb7c23f34d7daa8327843f728513b225044a9390f86fb2a83951c4a39a13c17472c71cf50d74f1ce12d04dc85e9021a00015b1158202c1657b98fabe337cff8811a0b198dd36dfa61a415fdc5e5759f43cfa1103c48845820249caec7a56b2ede7dfdb956178fc6d7d5c96b5f35e63ddc7987e9261ac277c70b1902065840c4bbbda856bebac009d32c276080a54bb6322ab3252d09ad4c7c4a3e3f9b8931dd81b1795dbd165d8d3ca493d77966eb682bfff0edc1d151ef0ad42efb91ba0d8207005901c03824c9afe0176e3abf9e9bcf6972fb8c408d218fe0eab8026780a9995c7cc8fbf2a6f7d54fcb138bcff109b578d020baf5dbae751dad81980d52146afc615905ea103db0ff10d488fc9d0dbfa410066768d93c566fc346ff4b81bd41137df20c446771dd0d24399d61a9caeddce7abb55e6647247158ac252cf87e56871f4535857f6dbbf90b99d9b4bd6ca20705f7deff4e7d3220c002c4e7e5d96927751d96e08c92886ac223a4f7141625da97819a3b574dbf80ca50418f33ce2858b41f2fe63290bda8fcfe8382defc7ce721ed6d96466efe69a0bcb31a3951447b3e73c07e167240a99b492a71b0f9a6af321620d16b944b7b7ce89353ce0b65fc19f3744357603fca23f2b0056c607f817b24ee15b51008ab43e470016e46c0a1589bf184b46b79e808750f7a96fa747387414b9e691b95e7003e825308e4cd4fcf67d87233cb90282e3a5e65ce5cd3448e2a5d5ee6b232a431a45c252ed9a04dbee9cf89c5d5f975481b3be2623bf4a517205b69516d59e0a1877643e25485846911252315499cc705061ee74bd8a6ca2a9ffe46f2905839372b008074d775b6f6f7bb3f245263d306f0194133f947909ff4af9f9815800f1173ef7ea602886f55e1fd

common/src/ouroboros/praos.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,68 @@ fn vrf_result<'a>(header: &'a MultiEraHeader) -> Option<&'a VrfCert> {
8383
_ => None,
8484
}
8585
}
86+
87+
#[cfg(test)]
88+
mod tests {
89+
use crate::{
90+
crypto::keyhash_256, protocol_params::NonceHash, serialization::Bech32WithHrp, BlockHash,
91+
BlockStatus, Era,
92+
};
93+
94+
use super::*;
95+
96+
#[test]
97+
fn test_7854823_block() {
98+
let praos_params = PraosParams::mainnet();
99+
let epoch_nonce = Nonce::from(
100+
NonceHash::try_from(
101+
hex::decode("8dad163edf4607452fec9c5955d593fb598ca728bae162138f88da6667bba79b")
102+
.unwrap()
103+
.as_slice(),
104+
)
105+
.unwrap(),
106+
);
107+
108+
let block_header_7854823: Vec<u8> =
109+
hex::decode(include_str!("./data/7854823.cbor")).unwrap();
110+
let block_info = BlockInfo {
111+
status: BlockStatus::Immutable,
112+
slot: 73614529,
113+
hash: BlockHash::try_from(
114+
hex::decode("4884996cff870563ffddab5d1255a82a58482ba9351536f5b72c882f883c8947")
115+
.unwrap(),
116+
)
117+
.unwrap(),
118+
timestamp: 1665180820,
119+
number: 7854823,
120+
epoch: 368,
121+
epoch_slot: 1729,
122+
new_epoch: false,
123+
era: Era::Babbage,
124+
};
125+
let block_header =
126+
MultiEraHeader::decode(block_info.era as u8, None, &block_header_7854823).unwrap();
127+
let pool_id = Vec::<u8>::from_bech32_with_hrp(
128+
"pool195gdnmj6smzuakm4etxsxw3fgh8asqc4awtcskpyfnkpcvh2v8t",
129+
"pool",
130+
)
131+
.unwrap();
132+
let active_spos = HashMap::from([(
133+
pool_id.clone(),
134+
keyhash_256(block_header.vrf_vkey().unwrap()),
135+
)]);
136+
let active_spdd = HashMap::from([(pool_id.clone(), 64590523391239)]);
137+
let result = validate_vrf_praos(
138+
&block_info,
139+
&block_header,
140+
&epoch_nonce,
141+
&praos_params,
142+
&active_spos,
143+
&active_spdd,
144+
25069171797357766,
145+
)
146+
.and_then(|vrf_validations| vrf_validations.iter().try_for_each(|assert| assert()));
147+
println!("{:?}", result);
148+
assert!(result.is_ok());
149+
}
150+
}

common/src/ouroboros/tpraos.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,6 @@ mod tests {
185185

186186
let block_header_4490511: Vec<u8> =
187187
hex::decode(include_str!("./data/4490511.cbor")).unwrap();
188-
let block_header = MultiEraHeader::decode(1, None, &block_header_4490511).unwrap();
189188
let block_info = BlockInfo {
190189
status: BlockStatus::Immutable,
191190
slot: 4492800,
@@ -201,6 +200,8 @@ mod tests {
201200
new_epoch: true,
202201
era: Era::Shelley,
203202
};
203+
let block_header =
204+
MultiEraHeader::decode(block_info.era as u8, None, &block_header_4490511).unwrap();
204205
let active_spos = HashMap::new();
205206
let active_spdd = HashMap::new();
206207
let result = validate_vrf_tpraos(
@@ -234,7 +235,6 @@ mod tests {
234235

235236
let block_header_4556956: Vec<u8> =
236237
hex::decode(include_str!("./data/4556956.cbor")).unwrap();
237-
let block_header = MultiEraHeader::decode(1, None, &block_header_4556956).unwrap();
238238
let block_info = BlockInfo {
239239
status: BlockStatus::Immutable,
240240
slot: 5824849,
@@ -250,6 +250,8 @@ mod tests {
250250
new_epoch: false,
251251
era: Era::Shelley,
252252
};
253+
let block_header =
254+
MultiEraHeader::decode(block_info.era as u8, None, &block_header_4556956).unwrap();
253255
let pool_id = Vec::<u8>::from_bech32_with_hrp(
254256
"pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy",
255257
"pool",
@@ -291,7 +293,6 @@ mod tests {
291293

292294
let block_header_4576496: Vec<u8> =
293295
hex::decode(include_str!("./data/4576496.cbor")).unwrap();
294-
let block_header = MultiEraHeader::decode(1, None, &block_header_4576496).unwrap();
295296
let block_info = BlockInfo {
296297
status: BlockStatus::Immutable,
297298
slot: 6220749,
@@ -307,6 +308,8 @@ mod tests {
307308
new_epoch: false,
308309
era: Era::Shelley,
309310
};
311+
let block_header =
312+
MultiEraHeader::decode(block_info.era as u8, None, &block_header_4576496).unwrap();
310313
let pool_id = Vec::<u8>::from_bech32_with_hrp(
311314
"pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy",
312315
"pool",
@@ -348,7 +351,6 @@ mod tests {
348351

349352
let block_header_4576496: Vec<u8> =
350353
hex::decode(include_str!("./data/4576496.cbor")).unwrap();
351-
let block_header = MultiEraHeader::decode(1, None, &block_header_4576496).unwrap();
352354
let block_info = BlockInfo {
353355
status: BlockStatus::Immutable,
354356
slot: 6220749,
@@ -364,6 +366,8 @@ mod tests {
364366
new_epoch: false,
365367
era: Era::Shelley,
366368
};
369+
let block_header =
370+
MultiEraHeader::decode(block_info.era as u8, None, &block_header_4576496).unwrap();
367371
let pool_id = Vec::<u8>::from_bech32_with_hrp(
368372
"pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy",
369373
"pool",
@@ -406,7 +410,6 @@ mod tests {
406410

407411
let block_header_4576496: Vec<u8> =
408412
hex::decode(include_str!("./data/4576496.cbor")).unwrap();
409-
let block_header = MultiEraHeader::decode(1, None, &block_header_4576496).unwrap();
410413
let block_info = BlockInfo {
411414
status: BlockStatus::Immutable,
412415
slot: 6220749,
@@ -422,6 +425,8 @@ mod tests {
422425
new_epoch: false,
423426
era: Era::Shelley,
424427
};
428+
let block_header =
429+
MultiEraHeader::decode(block_info.era as u8, None, &block_header_4576496).unwrap();
425430
let pool_id = Vec::<u8>::from_bech32_with_hrp(
426431
"pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy",
427432
"pool",
@@ -469,7 +474,6 @@ mod tests {
469474

470475
let block_header_4576496: Vec<u8> =
471476
hex::decode(include_str!("./data/4576496.cbor")).unwrap();
472-
let block_header = MultiEraHeader::decode(1, None, &block_header_4576496).unwrap();
473477
let block_info = BlockInfo {
474478
status: BlockStatus::Immutable,
475479
slot: 6220749,
@@ -485,6 +489,8 @@ mod tests {
485489
new_epoch: false,
486490
era: Era::Shelley,
487491
};
492+
let block_header =
493+
MultiEraHeader::decode(block_info.era as u8, None, &block_header_4576496).unwrap();
488494
let pool_id = Vec::<u8>::from_bech32_with_hrp(
489495
"pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy",
490496
"pool",

modules/block_vrf_validator/src/block_vrf_validator.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use acropolis_common::{
55
messages::{CardanoMessage, Message},
66
state_history::{StateHistory, StateHistoryStore},
7-
BlockInfo, BlockStatus, Era,
7+
BlockInfo, BlockStatus,
88
};
99
use anyhow::Result;
1010
use caryatid_sdk::{module, Context, Module, Subscription};
@@ -149,21 +149,17 @@ impl BlockVrfValidator {
149149
// decode header
150150
// Derive the variant from the era - just enough to make
151151
// MultiEraHeader::decode() work.
152-
let variant = match block_info.era {
153-
Era::Byron => 0,
154-
Era::Shelley => 1,
155-
Era::Allegra => 2,
156-
Era::Mary => 3,
157-
Era::Alonzo => 4,
158-
_ => 5,
159-
};
160152
let span = info_span!(
161153
"block_vrf_validator.decode_header",
162154
block = block_info.number
163155
);
164156
let mut header = None;
165157
span.in_scope(|| {
166-
header = match MultiEraHeader::decode(variant, None, &block_msg.header) {
158+
header = match MultiEraHeader::decode(
159+
block_info.era as u8,
160+
None,
161+
&block_msg.header,
162+
) {
167163
Ok(header) => Some(header),
168164
Err(e) => {
169165
error!("Can't decode header {}: {e}", block_info.slot);

0 commit comments

Comments
 (0)