From 408e619e82038854cb57de4f9ecdfdbc1b61b84b Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 12 Jun 2024 17:25:19 +0200 Subject: [PATCH 1/7] test: conversions for LeaderProof --- ledger/cryptarchia-ledger/src/lib.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/ledger/cryptarchia-ledger/src/lib.rs b/ledger/cryptarchia-ledger/src/lib.rs index 893a00e9..ad058ff6 100644 --- a/ledger/cryptarchia-ledger/src/lib.rs +++ b/ledger/cryptarchia-ledger/src/lib.rs @@ -386,7 +386,7 @@ impl core::fmt::Debug for LedgerState { #[cfg(test)] pub mod tests { - use super::{Coin, EpochState, Ledger, LedgerState}; + use super::{Coin, EpochState, LeaderProof, Ledger, LedgerState, Nullifier}; use crate::{crypto::Blake2b, Commitment, Config, LedgerError}; use blake2::Digest; use cryptarchia_engine::Slot; @@ -741,4 +741,29 @@ pub mod tests { Err(LedgerError::NullifierExists) )); } + + #[test] + fn test_conversions_for_leader_proof() { + + let commitment = Commitment::from([0u8; 32]); + let commitment_bytes: [u8; 32] = commitment.into(); + + let _zero_bytes = [0u8; 32]; + assert!(matches!(commitment_bytes, _zero_bytes)); + + let commitment_ref = commitment.as_ref(); + assert_eq!(commitment_ref, &_zero_bytes); + + let nullifier = Nullifier::from([0u8; 32]); + let _nullifier_bytes: [u8; 32] = nullifier.into(); + assert!(matches!(_nullifier_bytes, _zero_bytes)); + + let slot = Slot::genesis(); + let leader_proof = LeaderProof::dummy(slot); + + assert_eq!(leader_proof.commitment(), &commitment); + assert_eq!(leader_proof.evolved_commitment(), &commitment); + assert_eq!(leader_proof.nullifier(), &nullifier); + + } } From 0aadeafe1cca73de7d1c23547d24e17c07ebf8a2 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 12 Jun 2024 17:37:27 +0200 Subject: [PATCH 2/7] fix: formatting --- ledger/cryptarchia-ledger/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ledger/cryptarchia-ledger/src/lib.rs b/ledger/cryptarchia-ledger/src/lib.rs index ad058ff6..a2483a1a 100644 --- a/ledger/cryptarchia-ledger/src/lib.rs +++ b/ledger/cryptarchia-ledger/src/lib.rs @@ -744,7 +744,6 @@ pub mod tests { #[test] fn test_conversions_for_leader_proof() { - let commitment = Commitment::from([0u8; 32]); let commitment_bytes: [u8; 32] = commitment.into(); @@ -764,6 +763,5 @@ pub mod tests { assert_eq!(leader_proof.commitment(), &commitment); assert_eq!(leader_proof.evolved_commitment(), &commitment); assert_eq!(leader_proof.nullifier(), &nullifier); - } } From 20e34ea770a9f6c2220cee7688236f786cfa6106 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 14 Jun 2024 10:33:49 +0200 Subject: [PATCH 3/7] test: ser/de for Nullifier and Commitment --- ledger/cryptarchia-ledger/Cargo.toml | 1 + ledger/cryptarchia-ledger/src/lib.rs | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/ledger/cryptarchia-ledger/Cargo.toml b/ledger/cryptarchia-ledger/Cargo.toml index fd819d29..d0b27194 100644 --- a/ledger/cryptarchia-ledger/Cargo.toml +++ b/ledger/cryptarchia-ledger/Cargo.toml @@ -10,6 +10,7 @@ blake2 = "0.10" rpds = "1" thiserror = "1" serde = { version = "1.0", features = ["derive"], optional = true } +serde_test = "1.0.176" # TODO: we only need types definition from this crate cryptarchia-engine = { path = "../../consensus/cryptarchia-engine" } nomos-utils = { path = "../../nomos-utils", optional = true } diff --git a/ledger/cryptarchia-ledger/src/lib.rs b/ledger/cryptarchia-ledger/src/lib.rs index a2483a1a..8a1dd848 100644 --- a/ledger/cryptarchia-ledger/src/lib.rs +++ b/ledger/cryptarchia-ledger/src/lib.rs @@ -390,6 +390,7 @@ pub mod tests { use crate::{crypto::Blake2b, Commitment, Config, LedgerError}; use blake2::Digest; use cryptarchia_engine::Slot; + use serde_test::{assert_tokens, Configure, Token}; type HeaderId = [u8; 32]; @@ -763,5 +764,11 @@ pub mod tests { assert_eq!(leader_proof.commitment(), &commitment); assert_eq!(leader_proof.evolved_commitment(), &commitment); assert_eq!(leader_proof.nullifier(), &nullifier); + + // Test ser/de of compact representation for Nullifier + assert_tokens(&nullifier.compact(), &[Token::BorrowedBytes(&[0; 32])]); + + // Test ser/de of compact representation for Commitment + assert_tokens(&commitment.compact(), &[Token::BorrowedBytes(&[0; 32])]); } } From c2737a28c52aaeda952631c9634cb45ef9540ab7 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 14 Jun 2024 17:14:57 +0200 Subject: [PATCH 4/7] test: cryptarchia ledger error cases - LedgerError::InvalidSlot --- ledger/cryptarchia-ledger/src/lib.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/ledger/cryptarchia-ledger/src/lib.rs b/ledger/cryptarchia-ledger/src/lib.rs index 8a1dd848..9d59dbb3 100644 --- a/ledger/cryptarchia-ledger/src/lib.rs +++ b/ledger/cryptarchia-ledger/src/lib.rs @@ -771,4 +771,31 @@ pub mod tests { // Test ser/de of compact representation for Commitment assert_tokens(&commitment.compact(), &[Token::BorrowedBytes(&[0; 32])]); } + + #[test] + fn test_cryptarchia_ledger_error_cases() { + let coin = coin(0); + let commitment = coin.commitment(); + let (ledger, genesis) = ledger(&[commitment]); + + let ledger_state = ledger.state(&genesis).unwrap().clone(); + let ledger_config = ledger.config(); + + let slot = Slot::genesis() + 10; + let ledger_state2 = ledger_state + .update_epoch_state::(slot, ledger_config) + .expect("Ledger needs to move forward"); + + let slot2 = Slot::genesis() + 1; + let update_epoch_err = ledger_state2 + .update_epoch_state::(slot2, ledger_config) + .err(); + + // Time cannot flow backwards + match update_epoch_err { + Some(LedgerError::InvalidSlot { parent, block }) + if parent == slot && block == slot2 => {} + _ => panic!("Error does not match the LedgerError::InvalidSlot pattern"), + }; + } } From 30b528f42171517c12486eef097906114a4e73c6 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 14 Jun 2024 17:54:44 +0200 Subject: [PATCH 5/7] test: cryptarchia ledger error cases - LedgerError::CommitmentExists --- ledger/cryptarchia-ledger/src/leader_proof.rs | 6 ++--- ledger/cryptarchia-ledger/src/lib.rs | 22 +++++++++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/ledger/cryptarchia-ledger/src/leader_proof.rs b/ledger/cryptarchia-ledger/src/leader_proof.rs index c699929f..f20f2992 100644 --- a/ledger/cryptarchia-ledger/src/leader_proof.rs +++ b/ledger/cryptarchia-ledger/src/leader_proof.rs @@ -27,12 +27,12 @@ impl LeaderProof { } #[cfg(test)] - pub fn dummy(slot: Slot) -> Self { + pub fn dummy(slot: Slot, commitment: Commitment, evolved_commitment: Commitment) -> Self { Self { - commitment: Commitment([0; 32]), + commitment, nullifier: Nullifier([0; 32]), slot, - evolved_commitment: Commitment([0; 32]), + evolved_commitment, } } diff --git a/ledger/cryptarchia-ledger/src/lib.rs b/ledger/cryptarchia-ledger/src/lib.rs index 9d59dbb3..9aacae48 100644 --- a/ledger/cryptarchia-ledger/src/lib.rs +++ b/ledger/cryptarchia-ledger/src/lib.rs @@ -759,7 +759,7 @@ pub mod tests { assert!(matches!(_nullifier_bytes, _zero_bytes)); let slot = Slot::genesis(); - let leader_proof = LeaderProof::dummy(slot); + let leader_proof = LeaderProof::dummy(slot, commitment, Commitment::from([0; 32])); assert_eq!(leader_proof.commitment(), &commitment); assert_eq!(leader_proof.evolved_commitment(), &commitment); @@ -795,7 +795,25 @@ pub mod tests { match update_epoch_err { Some(LedgerError::InvalidSlot { parent, block }) if parent == slot && block == slot2 => {} - _ => panic!("Error does not match the LedgerError::InvalidSlot pattern"), + _ => panic!("error does not match the LedgerError::InvalidSlot pattern"), }; + + let ledger_state = ledger.state(&genesis).unwrap().clone(); + let actual_slot = ledger_state.slot(); + let proof = LeaderProof::dummy(actual_slot, commitment, commitment); + let epoch_state = ledger_state.epoch_state(); + + assert_eq!(ledger_state.can_lead(&commitment), true); + assert_eq!(epoch_state.is_eligible_leader(&commitment), true); + + let apply_proof_err = ledger_state + .try_apply_proof::(&proof, ledger_config) + .err(); + + // Commitment cannot be spent twice + assert!( + matches!(apply_proof_err, Some(LedgerError::CommitmentExists)), + "Error does not match LedgerError::CommitmentExists" + ); } } From 2e587084b425fd270b5ca3eff08b95ad7924f5ea Mon Sep 17 00:00:00 2001 From: Roman Date: Sat, 15 Jun 2024 09:02:37 +0200 Subject: [PATCH 6/7] test: add coin value check --- ledger/cryptarchia-ledger/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ledger/cryptarchia-ledger/src/lib.rs b/ledger/cryptarchia-ledger/src/lib.rs index 9aacae48..2a954cba 100644 --- a/ledger/cryptarchia-ledger/src/lib.rs +++ b/ledger/cryptarchia-ledger/src/lib.rs @@ -386,7 +386,7 @@ impl core::fmt::Debug for LedgerState { #[cfg(test)] pub mod tests { - use super::{Coin, EpochState, LeaderProof, Ledger, LedgerState, Nullifier}; + use super::{Coin, EpochState, LeaderProof, Ledger, LedgerState, Nullifier, Value}; use crate::{crypto::Blake2b, Commitment, Config, LedgerError}; use blake2::Digest; use cryptarchia_engine::Slot; @@ -810,6 +810,8 @@ pub mod tests { .try_apply_proof::(&proof, ledger_config) .err(); + assert_eq!(coin.value(), Value::from(1u32)); + // Commitment cannot be spent twice assert!( matches!(apply_proof_err, Some(LedgerError::CommitmentExists)), From 6aba4d6fd71d692bba6eb18e7a63929792172665 Mon Sep 17 00:00:00 2001 From: Roman Date: Sat, 15 Jun 2024 09:15:12 +0200 Subject: [PATCH 7/7] test: add can_spend and total_stake check --- ledger/cryptarchia-ledger/src/lib.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ledger/cryptarchia-ledger/src/lib.rs b/ledger/cryptarchia-ledger/src/lib.rs index 2a954cba..8e2da3e7 100644 --- a/ledger/cryptarchia-ledger/src/lib.rs +++ b/ledger/cryptarchia-ledger/src/lib.rs @@ -803,15 +803,17 @@ pub mod tests { let proof = LeaderProof::dummy(actual_slot, commitment, commitment); let epoch_state = ledger_state.epoch_state(); - assert_eq!(ledger_state.can_lead(&commitment), true); - assert_eq!(epoch_state.is_eligible_leader(&commitment), true); + assert!(ledger_state.can_spend(&commitment)); + assert_eq!(epoch_state.total_stake(), Value::from(1u32)); + assert_eq!(coin.value(), Value::from(1u32)); + + assert!(ledger_state.can_lead(&commitment)); + assert!(epoch_state.is_eligible_leader(&commitment)); let apply_proof_err = ledger_state .try_apply_proof::(&proof, ledger_config) .err(); - assert_eq!(coin.value(), Value::from(1u32)); - // Commitment cannot be spent twice assert!( matches!(apply_proof_err, Some(LedgerError::CommitmentExists)),