blockify 0.0.9

A general purpose blockchain library
Documentation
#![cfg(test)]

use blockify::{record::Record, data::Metadata};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct Detail<T> {
    val: T,
}

impl<T: Serialize> Record for Detail<T> {
    fn sign(
        &self,
        key: &blockify::AuthKeyPair,
    ) -> Result<blockify::DigitalSignature, blockify::SigningError> {
        let msg = blockify::serialize(self)?;
        let signature = blockify::sign_msg(&msg, key)?;
        Ok(signature)
    }

    fn verify(
        &self,
        signature: &blockify::DigitalSignature,
        key: &blockify::PublicKey,
    ) -> Result<(), blockify::VerificationError> {
        let msg = blockify::serialize(self).map_err(|_| blockify::VerificationError::SerdeError)?;
        key.verify(&msg, signature)
    }

    fn record(
        self,
        keypair: blockify::AuthKeyPair,
        metadata: blockify::data::Metadata,
    ) -> Result<blockify::record::SignedRecord<Self>, blockify::SigningError> {
        let signature = self.sign(&keypair)?;
        let hash = self.hash();
        Ok(blockify::record::SignedRecord::new(
            self,
            signature,
            keypair.into_public_key(),
            hash,
            metadata,
        ))
    }

    fn hash(&self) -> blockify::Hash {
        blockify::hash(self)
    }
}

#[test]
fn test_derive() {
    let keypair = blockify::generate_ed25519_key_pair();
    let value = Detail {
        val: String::from("Hello, World!"),
    };
    let hash = value.hash();
    let signature = value.sign(&keypair).unwrap();
    let record = value.record(keypair, Metadata::empty()).unwrap();

    assert_eq!(&hash, record.hash());
    assert_eq!(&signature, record.signature());
    assert_eq!(&Metadata::empty(), record.metadata());
    assert!(record.verify().is_ok());
}

#[test]
fn test_record() {
    let keypair = blockify::generate_ed25519_key_pair();
    let value = Detail {
        val: String::from("Hello, World!"),
    };
    let hash = value.hash();
    let signature = value.sign(&keypair).unwrap();
    let record = value.record(keypair, Metadata::empty()).unwrap();

    assert_eq!(&hash, record.hash());
    assert_eq!(&signature, record.signature());
    assert_eq!(&Metadata::empty(), record.metadata());
    assert!(record.verify().is_ok());
}