lssa/nssa/src/public_transaction/witness_set.rs

72 lines
2.3 KiB
Rust
Raw Normal View History

2025-08-12 16:55:56 -03:00
use crate::{PrivateKey, PublicKey, Signature, public_transaction::Message};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct WitnessSet {
2025-09-08 10:11:04 +03:00
pub(crate) signatures_and_public_keys: Vec<(Signature, PublicKey)>,
}
impl WitnessSet {
pub fn for_message(message: &Message, private_keys: &[&PrivateKey]) -> Self {
let message_bytes = message.to_bytes();
let signatures_and_public_keys = private_keys
.iter()
2025-08-13 01:56:18 -03:00
.map(|&key| {
(
Signature::new(key, &message_bytes),
PublicKey::new_from_private_key(key),
)
})
.collect();
Self {
signatures_and_public_keys,
}
}
2025-08-11 20:38:29 -03:00
pub fn is_valid_for(&self, message: &Message) -> bool {
let message_bytes = message.to_bytes();
2025-08-13 03:01:54 -03:00
for (signature, public_key) in self.signatures_and_public_keys() {
2025-08-12 16:55:56 -03:00
if !signature.is_valid_for(&message_bytes, public_key) {
2025-08-11 20:22:41 -03:00
return false;
}
}
true
}
2025-08-13 03:01:54 -03:00
pub fn signatures_and_public_keys(&self) -> &[(Signature, PublicKey)] {
&self.signatures_and_public_keys
}
}
#[cfg(test)]
mod tests {
use super::*;
2025-11-26 00:27:20 +03:00
use crate::AccountId;
2025-08-13 03:01:54 -03:00
#[test]
fn test_for_message_constructor() {
let key1 = PrivateKey::try_new([1; 32]).unwrap();
let key2 = PrivateKey::try_new([2; 32]).unwrap();
let pubkey1 = PublicKey::new_from_private_key(&key1);
let pubkey2 = PublicKey::new_from_private_key(&key2);
let addr1 = AccountId::from(&pubkey1);
let addr2 = AccountId::from(&pubkey2);
2025-08-13 03:01:54 -03:00
let nonces = vec![1, 2];
let instruction = vec![1, 2, 3, 4];
let message = Message::try_new([0; 8], vec![addr1, addr2], nonces, instruction).unwrap();
let witness_set = WitnessSet::for_message(&message, &[&key1, &key2]);
assert_eq!(witness_set.signatures_and_public_keys.len(), 2);
let message_bytes = message.to_bytes();
for ((signature, public_key), expected_public_key) in witness_set
.signatures_and_public_keys
.into_iter()
.zip([pubkey1, pubkey2])
{
assert_eq!(public_key, expected_public_key);
assert!(signature.is_valid_for(&message_bytes, &expected_public_key));
}
}
}