Compare commits

...

8 Commits

Author SHA1 Message Date
Roman Zajic ed51d45cc4
Merge 30b528f421 into 1dbc0c236e 2024-06-14 17:54:51 +02:00
Roman 30b528f421
test: cryptarchia ledger error cases
- LedgerError::CommitmentExists
2024-06-14 17:54:44 +02:00
Roman Zajic 1e7f2e61ee
Merge branch 'master' into chore-cryptarchia-ledger-unit-tests-update 2024-06-14 17:15:26 +02:00
Roman c2737a28c5
test: cryptarchia ledger error cases
- LedgerError::InvalidSlot
2024-06-14 17:14:57 +02:00
Roman Zajic abd43d73c2
Merge branch 'master' into chore-cryptarchia-ledger-unit-tests-update 2024-06-14 10:54:48 +02:00
Roman 20e34ea770
test: ser/de for Nullifier and Commitment 2024-06-14 10:33:49 +02:00
Roman 0aadeafe1c
fix: formatting 2024-06-12 17:37:27 +02:00
Roman 408e619e82
test: conversions for LeaderProof 2024-06-12 17:25:19 +02:00
3 changed files with 80 additions and 4 deletions

View File

@ -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 }

View File

@ -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,
}
}

View File

@ -386,10 +386,11 @@ 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;
use serde_test::{assert_tokens, Configure, Token};
type HeaderId = [u8; 32];
@ -741,4 +742,78 @@ 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, commitment, Commitment::from([0; 32]));
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])]);
}
#[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::<HeaderId>(slot, ledger_config)
.expect("Ledger needs to move forward");
let slot2 = Slot::genesis() + 1;
let update_epoch_err = ledger_state2
.update_epoch_state::<HeaderId>(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"),
};
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::<HeaderId>(&proof, ledger_config)
.err();
// Commitment cannot be spent twice
assert!(
matches!(apply_proof_err, Some(LedgerError::CommitmentExists)),
"Error does not match LedgerError::CommitmentExists"
);
}
}