#![deny(
non_upper_case_globals,
non_camel_case_types,
non_snake_case,
unused_mut,
unused_imports,
dead_code,
)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#[macro_use]
extern crate amplify;
#[macro_use]
extern crate strict_encoding;
#[macro_use]
extern crate commit_encoding_derive;
#[cfg(feature = "serde")]
#[macro_use]
extern crate serde_crate as serde;
extern crate core;
#[cfg(feature = "derive")]
pub use commit_encoding_derive::CommitEncode;
mod commit;
mod conceal;
mod convolve;
mod embed;
mod id;
#[cfg(feature = "stl")]
pub mod stl;
pub mod merkle;
pub mod mpc;
mod digest;
pub mod vesper;
pub use commit::{CommitVerify, TryCommitVerify, VerifyError};
pub use conceal::Conceal;
pub use convolve::{ConvolveCommit, ConvolveCommitProof, ConvolveVerifyError};
pub use digest::{Digest, DigestExt, Ripemd160, Sha256};
pub use embed::{EmbedCommitProof, EmbedCommitVerify, EmbedVerifyError, VerifyEq};
pub use id::{
CommitColType, CommitEncode, CommitEngine, CommitId, CommitLayout, CommitStep, CommitmentId,
CommitmentLayout, StrictHash,
};
pub use merkle::{MerkleBuoy, MerkleHash, MerkleLeaves, MerkleNode, NodeBranching};
pub const LIB_NAME_COMMIT_VERIFY: &str = "CommitVerify";
pub trait CommitmentProtocol {}
pub struct UntaggedProtocol;
impl CommitmentProtocol for UntaggedProtocol {}
#[derive(Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Display)]
#[display("reserved")]
#[derive(StrictType, StrictEncode)]
#[strict_type(lib = LIB_NAME_COMMIT_VERIFY)]
pub struct ReservedBytes<const LEN: usize, const VAL: u8 = 0>([u8; LEN]);
impl<const LEN: usize, const VAL: u8> Default for ReservedBytes<LEN, VAL> {
fn default() -> Self { Self([VAL; LEN]) }
}
impl<const LEN: usize, const VAL: u8> From<[u8; LEN]> for ReservedBytes<LEN, VAL> {
fn from(value: [u8; LEN]) -> Self {
assert_eq!(value, [VAL; LEN]);
Self(value)
}
}
mod _reserved {
use strict_encoding::{DecodeError, ReadTuple, StrictDecode, TypedRead};
use crate::{CommitEncode, CommitEngine, ReservedBytes, StrictHash};
impl<const LEN: usize, const VAL: u8> CommitEncode for ReservedBytes<LEN, VAL> {
type CommitmentId = StrictHash;
fn commit_encode(&self, e: &mut CommitEngine) { e.commit_to_serialized(self) }
}
impl<const LEN: usize, const VAL: u8> StrictDecode for ReservedBytes<LEN, VAL> {
fn strict_decode(reader: &mut impl TypedRead) -> Result<Self, DecodeError> {
let reserved = reader.read_tuple(|r| r.read_field().map(Self))?;
if reserved != ReservedBytes::<LEN, VAL>::default() {
Err(DecodeError::DataIntegrityError(format!(
"unsupported reserved byte value indicating a future RGB version. Please \
update your software, or, if the problem persists, contact your vendor \
providing the following version information: {reserved}"
)))
} else {
Ok(reserved)
}
}
}
#[cfg(feature = "serde")]
mod _serde {
use std::fmt;
use serde_crate::de::Visitor;
use serde_crate::{de, Deserialize, Deserializer, Serialize, Serializer};
use super::*;
impl<const LEN: usize, const VAL: u8> Serialize for ReservedBytes<LEN, VAL> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer {
serializer.serialize_unit()
}
}
impl<'de, const LEN: usize, const VAL: u8> Deserialize<'de> for ReservedBytes<LEN, VAL> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de> {
#[derive(Default)]
pub struct UntaggedUnitVisitor;
impl<'de> Visitor<'de> for UntaggedUnitVisitor {
type Value = ();
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "reserved unit")
}
fn visit_none<E>(self) -> Result<(), E>
where E: de::Error {
Ok(())
}
fn visit_unit<E>(self) -> Result<(), E>
where E: de::Error {
Ok(())
}
}
deserializer.deserialize_unit(UntaggedUnitVisitor)?;
Ok(default!())
}
}
}
}
#[cfg(test)]
pub mod test_helpers {
use amplify::confinement::SmallVec;
use amplify::hex::FromHex;
pub use super::commit::test_helpers::*;
pub use super::embed::test_helpers::*;
use super::*;
pub fn gen_messages() -> Vec<SmallVec<u8>> {
vec![
b"".to_vec(),
b"\x00".to_vec(),
b"test".to_vec(),
b"test*".to_vec(),
Vec::from_hex("deadbeef").unwrap(),
Vec::from_hex("deadbeef00").unwrap(),
Vec::from_hex("00deadbeef").unwrap(),
b"0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798".to_vec(),
Vec::from_hex("0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798")
.unwrap(),
Vec::from_hex("02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9")
.unwrap(),
]
.into_iter()
.map(|v| SmallVec::try_from(v).unwrap())
.collect()
}
}