From 7e56012524dbabd6f76773a524070097afad4783 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Fri, 10 Jan 2025 11:05:54 +0100 Subject: [PATCH 1/8] fix: TODO in 'internal/mithril-persistence/src/database/db_version.rs' Released with distribution '2327.0' which is no longer run by SPOs on mainnet. --- .../src/database/db_version.rs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/internal/mithril-persistence/src/database/db_version.rs b/internal/mithril-persistence/src/database/db_version.rs index 2918f8c81f2..a11738a28f5 100644 --- a/internal/mithril-persistence/src/database/db_version.rs +++ b/internal/mithril-persistence/src/database/db_version.rs @@ -1,5 +1,5 @@ use anyhow::anyhow; -use chrono::{DateTime, NaiveDateTime, Utc}; +use chrono::{DateTime, Utc}; use mithril_common::StdResult; use sqlite::{Row, Value}; use std::{ @@ -64,18 +64,13 @@ impl SqLiteEntity for DatabaseVersion { version, application_type: ApplicationNodeType::new(application_type) .map_err(|e| HydrationError::InvalidData(format!("{e}")))?, - updated_at: match DateTime::parse_from_rfc3339(updated_at) { - Ok(date) => Ok(date.with_timezone(&Utc)), - // todo: remove this fallback when aggregators & signers have been migrated - // Fallback to previous date format for compatibility - Err(_) => NaiveDateTime::parse_from_str(updated_at, "%Y-%m-%d %H:%M:%S") - .map_err(|e| { - HydrationError::InvalidData(format!( - "Could not turn string '{updated_at}' to rfc3339 Datetime. Error: {e}" - )) - }) - .map(|d| d.and_utc()), - }?, + updated_at: DateTime::parse_from_rfc3339(updated_at) + .map_err(|e| { + HydrationError::InvalidData(format!( + "Could not turn string '{updated_at}' to rfc3339 Datetime. Error: {e}" + )) + })? + .with_timezone(&Utc), }) } From 4ac3b9be72eaac5b3b1345d021a8838852565314 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 13 Jan 2025 15:46:13 +0100 Subject: [PATCH 2/8] fix: TODO in 'mithril-test-lab/mithril-end-to-end/src/assertions/check.rs' --- .../mithril-end-to-end/src/assertions/check.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/mithril-test-lab/mithril-end-to-end/src/assertions/check.rs b/mithril-test-lab/mithril-end-to-end/src/assertions/check.rs index 064ae45e280..f2968a93642 100644 --- a/mithril-test-lab/mithril-end-to-end/src/assertions/check.rs +++ b/mithril-test-lab/mithril-end-to-end/src/assertions/check.rs @@ -52,8 +52,7 @@ pub async fn assert_node_producing_mithril_stake_distribution( } } - // todo: reduce the number of attempts if we can reduce the delay between two immutables - match attempt!(45, Duration::from_millis(2000), { + match attempt!(30, Duration::from_millis(2000), { fetch_last_mithril_stake_distribution_hash(url.clone()).await }) { AttemptResult::Ok(hash) => { @@ -100,7 +99,6 @@ pub async fn assert_signer_is_signing_mithril_stake_distribution( fetch_mithril_stake_distribution_message(url.clone(), expected_epoch_min).await }) { AttemptResult::Ok(stake_distribution) => { - // todo: assert that the mithril stake distribution is really signed info!("Signer signed a mithril stake distribution"; "certificate_hash" => &stake_distribution.certificate_hash); Ok(stake_distribution.certificate_hash) } @@ -126,8 +124,7 @@ pub async fn assert_node_producing_snapshot(aggregator_endpoint: &str) -> StdRes } } - // todo: reduce the number of attempts if we can reduce the delay between two immutables - match attempt!(45, Duration::from_millis(2000), { + match attempt!(30, Duration::from_millis(2000), { fetch_last_snapshot_digest(url.clone()).await }) { AttemptResult::Ok(digest) => { @@ -172,7 +169,6 @@ pub async fn assert_signer_is_signing_snapshot( fetch_snapshot_message(url.clone(), expected_epoch_min).await }) { AttemptResult::Ok(snapshot) => { - // todo: assert that the snapshot is really signed info!("Signer signed a snapshot"; "certificate_hash" => &snapshot.certificate_hash); Ok(snapshot.certificate_hash) } @@ -200,8 +196,7 @@ pub async fn assert_node_producing_cardano_database_snapshot( } } - // todo: reduce the number of attempts if we can reduce the delay between two immutables - match attempt!(45, Duration::from_millis(2000), { + match attempt!(30, Duration::from_millis(2000), { fetch_last_cardano_database_snapshot_hash(url.clone()).await }) { AttemptResult::Ok(hash) => { @@ -282,8 +277,7 @@ pub async fn assert_node_producing_cardano_database_digests_map( } } - // todo: reduce the number of attempts if we can reduce the delay between two immutables - match attempt!(45, Duration::from_millis(2000), { + match attempt!(30, Duration::from_millis(2000), { fetch_cardano_database_digests_map(url.clone()).await }) { AttemptResult::Ok(cardano_database_digests_map) => { @@ -318,7 +312,7 @@ pub async fn assert_node_producing_cardano_transactions( } } - match attempt!(45, Duration::from_millis(2000), { + match attempt!(30, Duration::from_millis(2000), { fetch_last_cardano_transaction_snapshot_hash(url.clone()).await }) { AttemptResult::Ok(hash) => { @@ -395,7 +389,7 @@ pub async fn assert_node_producing_cardano_stake_distribution( } } - match attempt!(45, Duration::from_millis(2000), { + match attempt!(30, Duration::from_millis(2000), { fetch_last_cardano_stake_distribution_message(url.clone()).await }) { AttemptResult::Ok((hash, epoch)) => { From 2c7183699773b40aaddee5a0ff66b2448057b1bb Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 13 Jan 2025 15:48:33 +0100 Subject: [PATCH 3/8] fix: TODO in 'mithril-aggregator/tests/create_certificate.rs' --- mithril-aggregator/tests/create_certificate.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mithril-aggregator/tests/create_certificate.rs b/mithril-aggregator/tests/create_certificate.rs index 1042e74e486..e46870aa09d 100644 --- a/mithril-aggregator/tests/create_certificate.rs +++ b/mithril-aggregator/tests/create_certificate.rs @@ -96,11 +96,7 @@ async fn create_certificate() { ) ); - comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull"); - // todo!: remove this immutable increase: - // right now because we only have one state machine for all signed entity type we need it else - // the state machine will stay in the idle state since its beacon didn't change. - // With one state machine per signed entity type this problem will disappear. + comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull when a new immutable file exists"); tester.increase_immutable_number().await.unwrap(); cycle!(tester, "signing"); let signers_for_immutables = &fixture.signers_fixture()[0..=6]; From 43388005c494261ef248fe264c87deb88e6deab2 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 13 Jan 2025 15:50:26 +0100 Subject: [PATCH 4/8] fix: TODO in 'mithril-aggregator/tests/open_message_newer_exists.rs' --- mithril-aggregator/tests/open_message_newer_exists.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/mithril-aggregator/tests/open_message_newer_exists.rs b/mithril-aggregator/tests/open_message_newer_exists.rs index 1fb9f391ab8..c7bdbd20da7 100644 --- a/mithril-aggregator/tests/open_message_newer_exists.rs +++ b/mithril-aggregator/tests/open_message_newer_exists.rs @@ -86,11 +86,7 @@ async fn open_message_newer_exists() { ) ); - comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull"); - // todo!: remove this immutable increase: - // right now because we only have one state machine for all signed entity type we need it else - // the state machine will stay in the idle state since its beacon didn't change. - // With one state machine per signed entity type this problem will disappear. + comment!("The state machine should get back to signing to sign CardanoImmutableFilesFull when a new immutable file exists"); tester.increase_immutable_number().await.unwrap(); cycle!(tester, "signing"); From 1f2fa5877ca6efe8b377dc02c5d5f063edddced5 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 13 Jan 2025 16:04:33 +0100 Subject: [PATCH 5/8] fix: TODO in 'mithril-common/src/crypto_helper/cardano/key_certification.rs' --- .../cardano/key_certification.rs | 138 ++++++++++++------ 1 file changed, 92 insertions(+), 46 deletions(-) diff --git a/mithril-common/src/crypto_helper/cardano/key_certification.rs b/mithril-common/src/crypto_helper/cardano/key_certification.rs index f8f18bc51ae..3745448e7b5 100644 --- a/mithril-common/src/crypto_helper/cardano/key_certification.rs +++ b/mithril-common/src/crypto_helper/cardano/key_certification.rs @@ -102,8 +102,13 @@ pub enum ProtocolInitializerErrorWrapper { /// their correct identity with respect to a Cardano PoolID. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct StmInitializerWrapper { + /// The StmInitializer stm_initializer: StmInitializer, - kes_signature: Option, // todo: The option is ONLY for a smooth transition. We have to remove this. + + /// The KES signature over the Mithril key + /// + /// None is used only for testing when SPO pool id is not certified + kes_signature: Option, } /// Wrapper structure for [MithrilStm:KeyReg](mithril_stm::key_reg::KeyReg). @@ -210,10 +215,13 @@ impl StmInitializerWrapper { /// # Layout /// * StmInitialiser /// * KesSignature - pub fn to_bytes(&self) -> [u8; 704] { - let mut out = [0u8; 704]; - out[..256].copy_from_slice(&self.stm_initializer.to_bytes()); - // out[256..].copy_from_slice(&self.kes_signature.to_bytes()); todo: repair + pub fn to_bytes(&self) -> Vec { + let mut out = Vec::new(); + out.extend_from_slice(&self.stm_initializer.to_bytes()); + if let Some(kes_signature) = &self.kes_signature { + out.extend_from_slice(&kes_signature.to_bytes()); + } + out } @@ -221,13 +229,19 @@ impl StmInitializerWrapper { /// # Error /// The function fails if the given string of bytes is not of required size. pub fn from_bytes(bytes: &[u8]) -> Result { - let stm_initializer = StmInitializer::from_bytes(bytes)?; - let kes_signature = - Sum6KesSig::from_bytes(&bytes[256..]).map_err(|_| RegisterError::SerializationError)?; + let stm_initializer = StmInitializer::from_bytes(&bytes[..256])?; + let kes_signature = if bytes[256..].is_empty() { + None + } else { + Some( + Sum6KesSig::from_bytes(&bytes[256..]) + .map_err(|_| RegisterError::SerializationError)?, + ) + }; Ok(Self { stm_initializer, - kes_signature: Some(kes_signature), + kes_signature, }) } } @@ -402,53 +416,85 @@ mod test { assert!(key_registration_2.is_ok()) } - #[test] - fn golden_initializer_deserialization() { - let string = r#" - { - "stm_initializer": { - "stake": 9497432569, - "params": { - "m": 20973, - "k": 2422, - "phi_f": 0.2 - }, - "sk": [49, 181, 118, 110, 190, 161, 107, 218, 165, 20, 147, 129, 193, 79, 160, 0, 37, 23, 102, 223, 88, 174, 208, 70, 97, 79, 174, 51, 28, 0, 192, 210], - "pk": { - "vk": [173, 149, 133, 21, 100, 254, 36, 74, 165, 174, 56, 9, 145, 190, 48, 14, 12, 193, 243, 3, 200, 148, 221, 124, 170, 143, 89, 5, 168, 0, 226, 125, 61, 181, 190, 80, 62, 199, 99, 161, 117, 49, 65, 34, 81, 96, 34, 81, 2, 235, 173, 57, 58, 128, 49, 22, 242, 42, 30, 137, 6, 51, 77, 57, 142, 192, 140, 161, 206, 206, 213, 114, 156, 191, 127, 167, 167, 9, 39, 29, 97, 166, 134, 76, 55, 179, 72, 29, 41, 251, 14, 71, 89, 181, 31, 115], - "pop": [171, 0, 214, 91, 37, 208, 228, 71, 228, 31, 138, 0, 237, 175, 24, 45, 160, 117, 14, 210, 23, 46, 235, 83, 45, 9, 58, 207, 18, 36, 31, 160, 252, 111, 69, 102, 248, 205, 46, 71, 24, 38, 41, 77, 29, 129, 95, 16, 136, 114, 250, 44, 230, 184, 222, 122, 120, 58, 249, 103, 48, 121, 141, 244, 243, 26, 252, 60, 230, 64, 75, 3, 86, 107, 198, 198, 117, 242, 107, 104, 219, 209, 211, 255, 174, 203, 43, 141, 34, 146, 25, 181, 212, 38, 194, 99] - } + const GOLDEN_STM_INITIALIZER_WRAPPER_JSON: &str = r#" + { + "stm_initializer": { + "stake": 9497432569, + "params": { + "m": 20973, + "k": 2422, + "phi_f": 0.2 }, - "kes_signature": { + "sk": [49, 181, 118, 110, 190, 161, 107, 218, 165, 20, 147, 129, 193, 79, 160, 0, 37, 23, 102, 223, 88, 174, 208, 70, 97, 79, 174, 51, 28, 0, 192, 210], + "pk": { + "vk": [173, 149, 133, 21, 100, 254, 36, 74, 165, 174, 56, 9, 145, 190, 48, 14, 12, 193, 243, 3, 200, 148, 221, 124, 170, 143, 89, 5, 168, 0, 226, 125, 61, 181, 190, 80, 62, 199, 99, 161, 117, 49, 65, 34, 81, 96, 34, 81, 2, 235, 173, 57, 58, 128, 49, 22, 242, 42, 30, 137, 6, 51, 77, 57, 142, 192, 140, 161, 206, 206, 213, 114, 156, 191, 127, 167, 167, 9, 39, 29, 97, 166, 134, 76, 55, 179, 72, 29, 41, 251, 14, 71, 89, 181, 31, 115], + "pop": [171, 0, 214, 91, 37, 208, 228, 71, 228, 31, 138, 0, 237, 175, 24, 45, 160, 117, 14, 210, 23, 46, 235, 83, 45, 9, 58, 207, 18, 36, 31, 160, 252, 111, 69, 102, 248, 205, 46, 71, 24, 38, 41, 77, 29, 129, 95, 16, 136, 114, 250, 44, 230, 184, 222, 122, 120, 58, 249, 103, 48, 121, 141, 244, 243, 26, 252, 60, 230, 64, 75, 3, 86, 107, 198, 198, 117, 242, 107, 104, 219, 209, 211, 255, 174, 203, 43, 141, 34, 146, 25, 181, 212, 38, 194, 99] + } + }, + "kes_signature": { + "sigma": { "sigma": { "sigma": { "sigma": { "sigma": { - "sigma": { - "sigma": [71, 225, 146, 98, 81, 62, 28, 21, 7, 157, 88, 4, 226, 126, 27, 133, 146, 171, 216, 170, 77, 17, 38, 146, 98, 202, 35, 87, 166, 162, 25, 207, 105, 174, 48, 225, 152, 68, 19, 109, 72, 241, 69, 111, 22, 214, 72, 20, 81, 56, 181, 104, 69, 121, 173, 194, 37, 60, 16, 155, 86, 99, 253, 7], - "lhs_pk": [ - 91, 82, 235, 39, 167, 29, 141, 253, 163, 163, 55, 185, 162, 191, 52, 8, 245, 7, 104, 22, 182, 239, 133, 138, 131, 15, 233, 116, 147, 251, 182, 140], - "rhs_pk": [189, 26, 9, 118, 59, 34, 225, 34, 104, 202, 192, 7, 66, 150, 137, 75, 106, 7, 22, 234, 42, 94, 139, 65, 241, 65, 1, 190, 153, 16, 221, 87] - }, - "lhs_pk": [206, 50, 185, 93, 20, 234, 100, 168, 163, 125, 95, 201, 162, 104, 35, 2, 205, 41, 180, 73, 107, 140, 79, 182, 173, 17, 172, 49, 51, 85, 180, 5], - "rhs_pk": [68, 40, 90, 110, 254, 68, 87, 12, 19, 21, 252, 197, 69, 255, 33, 172, 140, 70, 79, 39, 71, 217, 12, 254, 82, 125, 123, 148, 221, 217, 141, 194] - }, - "lhs_pk": [155, 2, 30, 71, 52, 89, 112, 247, 108, 177, 144, 212, 206, 254, 87, 126, 180, 207, 146, 223, 164, 246, 178, 62, 148, 96, 39, 136, 106, 36, 253, 56], - "rhs_pk": [155, 140, 124, 154, 235, 97, 51, 77, 208, 24, 45, 219, 199, 232, 222, 26, 160, 62, 38, 253, 121, 241, 219, 233, 36, 50, 60, 182, 127, 255, 132, 245] + "sigma": [71, 225, 146, 98, 81, 62, 28, 21, 7, 157, 88, 4, 226, 126, 27, 133, 146, 171, 216, 170, 77, 17, 38, 146, 98, 202, 35, 87, 166, 162, 25, 207, 105, 174, 48, 225, 152, 68, 19, 109, 72, 241, 69, 111, 22, 214, 72, 20, 81, 56, 181, 104, 69, 121, 173, 194, 37, 60, 16, 155, 86, 99, 253, 7], + "lhs_pk": [ + 91, 82, 235, 39, 167, 29, 141, 253, 163, 163, 55, 185, 162, 191, 52, 8, 245, 7, 104, 22, 182, 239, 133, 138, 131, 15, 233, 116, 147, 251, 182, 140], + "rhs_pk": [189, 26, 9, 118, 59, 34, 225, 34, 104, 202, 192, 7, 66, 150, 137, 75, 106, 7, 22, 234, 42, 94, 139, 65, 241, 65, 1, 190, 153, 16, 221, 87] + }, + "lhs_pk": [206, 50, 185, 93, 20, 234, 100, 168, 163, 125, 95, 201, 162, 104, 35, 2, 205, 41, 180, 73, 107, 140, 79, 182, 173, 17, 172, 49, 51, 85, 180, 5], + "rhs_pk": [68, 40, 90, 110, 254, 68, 87, 12, 19, 21, 252, 197, 69, 255, 33, 172, 140, 70, 79, 39, 71, 217, 12, 254, 82, 125, 123, 148, 221, 217, 141, 194] }, - "lhs_pk": [172, 176, 18, 228, 203, 85, 44, 151, 221, 13, 91, 250, 67, 232, 114, 16, 251, 13, 115, 233, 214, 194, 102, 199, 200, 124, 30, 190, 143, 18, 85, 75], - "rhs_pk": [100, 192, 98, 123, 150, 116, 55, 42, 207, 44, 181, 31, 203, 65, 237, 13, 55, 246, 185, 211, 149, 245, 245, 219, 183, 41, 237, 253, 128, 231, 161, 226] + "lhs_pk": [155, 2, 30, 71, 52, 89, 112, 247, 108, 177, 144, 212, 206, 254, 87, 126, 180, 207, 146, 223, 164, 246, 178, 62, 148, 96, 39, 136, 106, 36, 253, 56], + "rhs_pk": [155, 140, 124, 154, 235, 97, 51, 77, 208, 24, 45, 219, 199, 232, 222, 26, 160, 62, 38, 253, 121, 241, 219, 233, 36, 50, 60, 182, 127, 255, 132, 245] }, - "lhs_pk": [112, 16, 177, 142, 158, 1, 36, 210, 87, 165, 5, 195, 199, 61, 13, 195, 219, 26, 231, 103, 163, 223, 54, 16, 106, 0, 252, 69, 242, 31, 210, 167], - "rhs_pk": [15, 246, 81, 72, 172, 15, 170, 235, 10, 64, 229, 233, 169, 140, 179, 209, 244, 183, 3, 59, 2, 252, 233, 229, 13, 190, 196, 208, 109, 30, 73, 113] + "lhs_pk": [172, 176, 18, 228, 203, 85, 44, 151, 221, 13, 91, 250, 67, 232, 114, 16, 251, 13, 115, 233, 214, 194, 102, 199, 200, 124, 30, 190, 143, 18, 85, 75], + "rhs_pk": [100, 192, 98, 123, 150, 116, 55, 42, 207, 44, 181, 31, 203, 65, 237, 13, 55, 246, 185, 211, 149, 245, 245, 219, 183, 41, 237, 253, 128, 231, 161, 226] }, - "lhs_pk": [114, 238, 75, 184, 228, 147, 37, 72, 134, 65, 139, 64, 81, 114, 157, 148, 197, 108, 80, 89, 30, 235, 75, 108, 193, 53, 185, 15, 57, 61, 181, 119], - "rhs_pk": [82, 28, 113, 114, 168, 192, 222, 110, 96, 15, 28, 179, 164, 180, 76, 87, 254, 72, 48, 154, 167, 102, 220, 74, 76, 136, 45, 105, 243, 87, 165, 212] - } + "lhs_pk": [112, 16, 177, 142, 158, 1, 36, 210, 87, 165, 5, 195, 199, 61, 13, 195, 219, 26, 231, 103, 163, 223, 54, 16, 106, 0, 252, 69, 242, 31, 210, 167], + "rhs_pk": [15, 246, 81, 72, 172, 15, 170, 235, 10, 64, 229, 233, 169, 140, 179, 209, 244, 183, 3, 59, 2, 252, 233, 229, 13, 190, 196, 208, 109, 30, 73, 113] + }, + "lhs_pk": [114, 238, 75, 184, 228, 147, 37, 72, 134, 65, 139, 64, 81, 114, 157, 148, 197, 108, 80, 89, 30, 235, 75, 108, 193, 53, 185, 15, 57, 61, 181, 119], + "rhs_pk": [82, 28, 113, 114, 168, 192, 222, 110, 96, 15, 28, 179, 164, 180, 76, 87, 254, 72, 48, 154, 167, 102, 220, 74, 76, 136, 45, 105, 243, 87, 165, 212] } - "#; + } + "#; - let _: StmInitializerWrapper = serde_json::from_str(string) + #[test] + fn golden_initializer_deserialization() { + let _: StmInitializerWrapper = serde_json::from_str(GOLDEN_STM_INITIALIZER_WRAPPER_JSON) .expect("Deserializing a StmInitializerWrapper should not fail"); } + + #[test] + fn test_initializer_wrapper_conversions() { + let stm_initializer_wrapper_json = GOLDEN_STM_INITIALIZER_WRAPPER_JSON; + + let stm_initializer_wrapper_from_json: StmInitializerWrapper = + serde_json::from_str(stm_initializer_wrapper_json) + .expect("Deserializing a StmInitializerWrapper should not fail"); + let stm_initializer_wrapper_from_json_to_json = + serde_json::to_string(&stm_initializer_wrapper_from_json) + .expect("Serializing a StmInitializerWrapper to json should not fail"); + + let stm_initializer_wrapper_from_bytes = + StmInitializerWrapper::from_bytes(&stm_initializer_wrapper_from_json.to_bytes()) + .expect("Deserializing a StmInitializerWrapper from bytes should not fail"); + let stm_initializer_wrapper_from_bytes_to_json = + serde_json::to_string(&stm_initializer_wrapper_from_bytes) + .expect("Serializing a StmInitializerWrapper to json should not fail"); + + assert_eq!( + stm_initializer_wrapper_from_json_to_json, + stm_initializer_wrapper_from_bytes_to_json + ); + + let mut stm_initializer_wrapper_from_json = stm_initializer_wrapper_from_json; + stm_initializer_wrapper_from_json.kes_signature = None; + + let stm_initializer_wrapper_from_bytes = + StmInitializerWrapper::from_bytes(&stm_initializer_wrapper_from_json.to_bytes()) + .expect("Deserializing a StmInitializerWrapper from bytes should not fail"); + assert_eq!(None, stm_initializer_wrapper_from_bytes.kes_signature); + } } From 9732f76a1f8d2e48c6bc75d707782fcf65325dcc Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Mon, 13 Jan 2025 17:48:05 +0100 Subject: [PATCH 6/8] fix: TODO in 'docs/website/blog/2023-07-21-mainnet-beta-launch/index.md' --- ...dex.md => 2023-07-21-mainnet-beta-launch.md} | 6 ------ .../img/mainnet-launch-timeline.png | Bin 63889 -> 0 bytes 2 files changed, 6 deletions(-) rename docs/website/blog/{2023-07-21-mainnet-beta-launch/index.md => 2023-07-21-mainnet-beta-launch.md} (90%) delete mode 100644 docs/website/blog/2023-07-21-mainnet-beta-launch/img/mainnet-launch-timeline.png diff --git a/docs/website/blog/2023-07-21-mainnet-beta-launch/index.md b/docs/website/blog/2023-07-21-mainnet-beta-launch.md similarity index 90% rename from docs/website/blog/2023-07-21-mainnet-beta-launch/index.md rename to docs/website/blog/2023-07-21-mainnet-beta-launch.md index e33e145eb8f..3027da9acc6 100644 --- a/docs/website/blog/2023-07-21-mainnet-beta-launch/index.md +++ b/docs/website/blog/2023-07-21-mainnet-beta-launch.md @@ -19,9 +19,6 @@ Here are the next steps that we will follow in order to get the `release-mainnet 1. [x] Create the genesis certificate of the `release-mainnet` network (1 epoch). 1. [x] Wait for the first certificates to be produced by the `release-mainnet` network. - - -[![Mainnet Beta Launch Timeline](img/mainnet-launch-timeline.png)](img/mainnet-launch-timeline.png) This is an expected timeline, in case of modification, we will amend this post with a new one. diff --git a/docs/website/blog/2023-07-21-mainnet-beta-launch/img/mainnet-launch-timeline.png b/docs/website/blog/2023-07-21-mainnet-beta-launch/img/mainnet-launch-timeline.png deleted file mode 100644 index 53a1fdf4313ad94bb735706959712c8253775102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63889 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 From 6cabc96afc0b47526ed0135e4255feb666a273c8 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 14 Jan 2025 10:27:27 +0100 Subject: [PATCH 7/8] fix: TODO in 'mithril-stm/src/key_reg.rs' --- mithril-stm/src/key_reg.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/mithril-stm/src/key_reg.rs b/mithril-stm/src/key_reg.rs index 65d696fa62a..fd9e18540f2 100644 --- a/mithril-stm/src/key_reg.rs +++ b/mithril-stm/src/key_reg.rs @@ -32,12 +32,9 @@ pub struct ClosedKeyReg { } impl KeyReg { - /// Initialise an empty `KeyReg`. - /// todo: remove this init function + /// Initialize an empty `KeyReg`. pub fn init() -> Self { - Self { - keys: HashMap::new(), - } + Self::default() } /// Verify and register a public key and stake for a particular party. From 63b9cd2dff1334127935f7bc3512b4318ac193f8 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Raynaud Date: Tue, 14 Jan 2025 11:04:11 +0100 Subject: [PATCH 8/8] chore: upgrade crate versions * mithril-persistence from `0.2.42` to `0.2.43` * mithril-aggregator from `0.6.11` to `0.6.12` * mithril-common from `0.4.102` to `0.4.103` * mithril-stm from `0.3.35` to `0.3.36` * mithril-end-to-end from `0.4.62` to `0.4.63` --- Cargo.lock | 10 +++++----- internal/mithril-persistence/Cargo.toml | 2 +- mithril-aggregator/Cargo.toml | 2 +- mithril-common/Cargo.toml | 2 +- mithril-stm/Cargo.toml | 2 +- mithril-test-lab/mithril-end-to-end/Cargo.toml | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db86da4e804..e28e6d05fa7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3578,7 +3578,7 @@ dependencies = [ [[package]] name = "mithril-aggregator" -version = "0.6.11" +version = "0.6.12" dependencies = [ "anyhow", "async-trait", @@ -3738,7 +3738,7 @@ dependencies = [ [[package]] name = "mithril-common" -version = "0.4.102" +version = "0.4.103" dependencies = [ "anyhow", "async-trait", @@ -3809,7 +3809,7 @@ dependencies = [ [[package]] name = "mithril-end-to-end" -version = "0.4.62" +version = "0.4.63" dependencies = [ "anyhow", "async-recursion", @@ -3852,7 +3852,7 @@ dependencies = [ [[package]] name = "mithril-persistence" -version = "0.2.42" +version = "0.2.43" dependencies = [ "anyhow", "async-trait", @@ -3936,7 +3936,7 @@ dependencies = [ [[package]] name = "mithril-stm" -version = "0.3.35" +version = "0.3.36" dependencies = [ "bincode", "blake2 0.10.6", diff --git a/internal/mithril-persistence/Cargo.toml b/internal/mithril-persistence/Cargo.toml index 5fca9ecdc9a..817a893d2c3 100644 --- a/internal/mithril-persistence/Cargo.toml +++ b/internal/mithril-persistence/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-persistence" -version = "0.2.42" +version = "0.2.43" description = "Common types, interfaces, and utilities to persist data for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-aggregator/Cargo.toml b/mithril-aggregator/Cargo.toml index 310e62e9b0e..df2b0ddbfa6 100644 --- a/mithril-aggregator/Cargo.toml +++ b/mithril-aggregator/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-aggregator" -version = "0.6.11" +version = "0.6.12" description = "A Mithril Aggregator server" authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-common/Cargo.toml b/mithril-common/Cargo.toml index de651c25318..c0f91c93ced 100644 --- a/mithril-common/Cargo.toml +++ b/mithril-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-common" -version = "0.4.102" +version = "0.4.103" description = "Common types, interfaces, and utilities for Mithril nodes." authors = { workspace = true } edition = { workspace = true } diff --git a/mithril-stm/Cargo.toml b/mithril-stm/Cargo.toml index 7c08722feb9..a83814cf659 100644 --- a/mithril-stm/Cargo.toml +++ b/mithril-stm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-stm" -version = "0.3.35" +version = "0.3.36" edition = { workspace = true } authors = { workspace = true } homepage = { workspace = true } diff --git a/mithril-test-lab/mithril-end-to-end/Cargo.toml b/mithril-test-lab/mithril-end-to-end/Cargo.toml index f93468b3be5..760ff4dc346 100644 --- a/mithril-test-lab/mithril-end-to-end/Cargo.toml +++ b/mithril-test-lab/mithril-end-to-end/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mithril-end-to-end" -version = "0.4.62" +version = "0.4.63" authors = { workspace = true } edition = { workspace = true } documentation = { workspace = true }