-
Notifications
You must be signed in to change notification settings - Fork 18
/
utxo_set.rs
44 lines (39 loc) · 1.66 KB
/
utxo_set.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//! For now this is a higher level description of the default UTXO set features which Tuxedo
//! chooses to use. Future UTXO sets could take a different form especially
//! if being used for Zero-Knowledge. In the future it may likely be abstracted into a trait
//! to support various UTXO set types.
//!
use crate::{
types::{Output, OutputRef},
verifier::Verifier,
LOG_TARGET,
};
use parity_scale_codec::{Decode, Encode};
use sp_std::marker::PhantomData;
pub struct TransparentUtxoSet<Verifier>(PhantomData<Verifier>);
impl<V: Verifier> TransparentUtxoSet<V> {
/// Fetch a utxo from the set.
pub fn peek_utxo(output_ref: &OutputRef) -> Option<Output<V>> {
sp_io::storage::get(&output_ref.encode()).and_then(|d| Output::decode(&mut &*d).ok())
}
/// Consume a Utxo from the set.
pub fn consume_utxo(output_ref: &OutputRef) -> Option<Output<V>> {
// TODO do we even need to read the stored value here? The only place we call this
// is from `update_storage` and we don't use the value there.
let maybe_output = Self::peek_utxo(output_ref);
sp_io::storage::clear(&output_ref.encode());
maybe_output
}
/// Add a utxo into the set.
/// This will overwrite any utxo that already exists at this OutputRef. It should never be the
/// case that there are collisions though. Right??
pub fn store_utxo(output_ref: OutputRef, output: &Output<V>) {
let key = output_ref.encode();
log::debug!(
target: LOG_TARGET,
"Storing UTXO at key: {:?}",
sp_core::hexdisplay::HexDisplay::from(&key)
);
sp_io::storage::set(&key, &output.encode());
}
}