use prism::pipeline::{
prism_model, AndCommitment, EmptyCommitment, LexicographicLessEqThreshold, SingletonCommitment,
};
use prism::vocabulary::DefaultHostTypes;
use crate::bounds::AddrBounds;
use crate::json::value::JsonCarrier;
use crate::label::AddressLabel;
use crate::resolvers::AddressResolverTuple;
use prism::crypto::Sha256Hasher;
#[allow(unused_imports)]
use crate::json::verbs::{address_inference, VERB_TERMS_ADDRESS_INFERENCE};
pub const STORAGE_THRESHOLD: &[u8] = &[
0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
];
pub type StorageCommitment =
AndCommitment<EmptyCommitment, SingletonCommitment<LexicographicLessEqThreshold>>;
pub const STORAGE_COMMITMENT_INSTANCE: StorageCommitment = AndCommitment {
left: EmptyCommitment,
right: SingletonCommitment {
predicate: LexicographicLessEqThreshold {
target: STORAGE_THRESHOLD,
},
},
};
prism_model! {
pub struct AddressStorageModel;
pub struct AddressStorageRoute;
impl PrismModel<
DefaultHostTypes,
AddrBounds,
Sha256Hasher,
AddressResolverTuple<Sha256Hasher>,
StorageCommitment
> for AddressStorageModel {
type Input = JsonCarrier<'a>;
type Output = AddressLabel;
type Route = AddressStorageRoute;
fn route(input: Self::Input) -> Self::Output {
address_inference(input)
}
fn commitment() -> StorageCommitment {
STORAGE_COMMITMENT_INSTANCE
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use prism::pipeline::{ObservablePredicate, TypedCommitment};
#[test]
fn storage_commitment_evaluates_predicate_against_digest() {
let admitted: [u8; 32] = [0; 32];
let rejected: [u8; 32] = [0xFF; 32];
let predicate = LexicographicLessEqThreshold {
target: STORAGE_THRESHOLD,
};
assert!(predicate.evaluate(&admitted));
assert!(!predicate.evaluate(&rejected));
}
#[test]
fn storage_commitment_carries_nontrivial_bandwidth() {
let bandwidth = STORAGE_COMMITMENT_INSTANCE.bandwidth_bits();
assert!(
(0.5..=1.5).contains(&bandwidth),
"1-bit bandwidth ± rounding ({bandwidth})"
);
}
#[test]
fn storage_commitment_is_typed_commitment() {
fn assert_is_typed_commitment<C: TypedCommitment>() {}
assert_is_typed_commitment::<StorageCommitment>();
}
}