ืืื ืืืจ!
ืืจืฉืช ืืืืืงืืื, ืื ืืฆืืชืื, ืืืืฆืขืืช ืงืื ืฆื ืืืก, ืืกืืืืื ืขื ืงืืืฆื ืฉื UTXOs: ืืื ืืืืขืืช ืืืื ืื ืืืืฆืื, ืืื ืืืืืง ืืืืืื ืชื ืืื. ืขืจืืช UTXO ืืื ืงืืืฆืช ืื ืชืื ืื ืืืื ืืืืืช ืื ืืจืฉืช ืืฆืืืช ืืืืืช, ืฉืืืขืืื ืืฆืืืช ืื ืืืื ืืืืช ืืช ืชืงืคืืชื ืฉื ืขืกืงืืืช ื ืื ืกืืช ืืืืืืงืื ืืืืืืื ืืืชื.
ืืืงืฉืจ ืื, ื ืขืฉืื ื ืืกืืื ืืช ืืื ืืจื ืืคืฉืจืืช ืืฆืืฆื ืืช ืืืืฆืื ืืืืืืกื ืฉื ืกื ืื, ืืืืืก ืืืชื ืืืื ืืืื ืขืจืืืืืช ืืืืื. ืืื ืฉื ืคื ืื ืชืื ืื ืืืืืืกื ืื ืงืื ืืืชืจ, ืื ืืจืืฉืืช ืฉืื ืืืืกืง ืฉื ืฆืืืช ืืืืืืช ื ืืืืืช ืืืชืจ, ืื ืฉืืืคื ืืช ืืฉืงืช ืฆืืืช ืืืืืืช ืืืืื, ืืืคืฉืจืช ืืืจืืื ืืช ืืจืฉืช ืืืื ืืืืืืจ ืืช ืืฆืืืืช ืืจืฉืช.
ืืคืืกื ืื ื ืคืจืกื ืื ืืืคืืก ืฉื Rust ืฉื ืืฆืขื ืืืจืื ื ืฉื ืืืืจ ืฉืืชืฃ
ืื ืืืขืื?
ืืืช ืืืขืืืช ืืืชืืฉืืืช ืฉื ืืืืงืืื ืืืืชื ืืืืืช ืืืจืืื ืฉืื. ืืจืขืืื ืฉื "ืื ืง ืืฉืื" ืืืืื ืืช ืืฉืชืชืคื ืืจืฉืช ืืฉืืืจ ืชืืขืื ืฉื ืื ืืืกืคืื ืืืืื ืื ืืฉืืืืฉ. ืืืืืงืืื, ืืืกืคืื ืืืืื ืื ืืชืืืืื ืืกื ืฉื ืชืคืืงืืช ืฉืื ืืืฆืื - ืกื UTXO. ืืื ื ืื ืื ืืืฆืื ืืื ืืืืืืืื ืืืืืื, ืืื ืืื ืืืขืื ืืืืื ืช ืืืฆืืขื ืืืืฉืื ืขื ืคื ื ืืืฆืื ืฉืื ืืื "ืืจื ืง" ืืฉ "ืืชืจื" ืืขืจื ื ืคืจื, ืืื ืืืกืืฃ ืคืจืืืืช (ืืืฉื.
ืืฉืื ืืืืืื ืืื ืืืกืืืจืืืช ืืขืกืงืืืช (ืื ืฉื ืงืจื ืืืืงืฆ'ืืื) ืืืื ืืืฆื ืื ืืืื ืฉื ืืืขืจืืช. ืืืกืืืจืืืช ืขืกืงืืืช ืืืืืงืืื ืชืืคืกืช ืืืื ื-200 ื'ืืื-ืืืื ืฉื ืฉืื ืืืกืง, ืืืืฉืืื ืืืืื. ืขื ืืืช, ืืฆื ืืืขืจืืช ืงืื ืืืจืื, ืืกืืจ ืืืื ืฉื 4 ื'ืืื-ืืืื, ืืืืงื ืืืฉืืื ืจืง ืืช ืืขืืืื ืฉืืืืฉืื ืืฉ ืืจืืข ืืืืขืืช. ืื ื ืคื ืื ืชืื ืื ืืืื ืืื ืขื ืืืื, ืื ืืงืฆื ืืจืื ืืืชืจ ืืืื ืืืขืืชืื ืืฃ ื ืืื ืืจืืช (ืจืื CDPV).
ืืงืืืืช ืงืืื (SPVs) ืืืืืคืื ืขืจืืืืืช ืืืืื ืขืืืจ ืืืืืืช ืืืืกื ืฉืื ืืฆื ืืื ืืืื (ืกื UTXO) ืืืื ืืคืชืืืช ืคืจืืืื.
UTXO ื-UTXO-ืกื
UTXO (Unspent Transaction Output) ืืื ืคืื ืืขืกืงื ืฉืื ืืืฆืื, ื ืงืืืช ืืกืืื ืฉื ืืืกืข ืฉื ืื ืกืืืืฉื ืืืืขืืจ ืืขืกืงืืืช. ืคืืืื ืฉืื ืืืฆืื ืืืคืืื ืืชืฉืืืืช ืฉื ืขืกืงืืืช ืืืฉืืช ืืืื ืืืฆืืืืช (ืืืืืืืช) ืืืืกืจืืช ื-UTXO-ืกื.
UTXOs ืืืฉืื ื ืืฆืจืื ืชืืื ืขื ืืื ืขืกืงืืืช:
- ืขืกืงืืืช ืืกืืก ืืืืขืืช ืืื ืชืฉืืืืช: ืฆืืจ UTXOs ืืืฉืื ืืืฉืจ ืืืจืื ืื ืคืืงืื ืืืืขืืช
- ืขืกืงืืืช ืจืืืืืช: ืฆืืจ UTXOs ืืืฉืื ืชืื ืืืฆืืช ืงืืืฆื ืืกืืืืช ืฉื UTXOs ืงืืืืื
ืชืืืื ืืขืืืื ืขื UTXO:
ืืจื ืงืื ืกืืคืจืื ืืช ืืกืคืจ ืืืืืขืืช ืืืืื ืื ืืืืฆืื (ืืชืจื) ืืืชืืกืก ืขื ืืืืช ื-UTXO ืืืืื ื ืืืจื ืง ืืื ืืืืฆืื.
ืื ืฆืืืช ืืืืช, ืืื ืืื ืืข ื ืืกืืื ืืช ืืืฆืื ืืคืืืื, ืืืื ืืคืงื ืขื ืืกื ืื UTXO ืืขืช ืืืืงื ืื ืขืกืงืืืช ืื ืึทืืกืึนื.
ืืฆืืืช ืืืื ืืืืืช ืืขื ืืืืืื:
- ืชืืกืคืืช ืืกื UTXO
- ืืืืงืืช ื-UTXO-set
- ืืืืงืช ื ืืืืืช ืฉื UTXO ืืืื ืืกื
ืืฉื ื ืืจืืื ืืฆืืฆื ืืช ืืืจืืฉืืช ืืืืืข ืืืืืกื ืขื ืกื, ืชืื ืฉืืืจื ืขื ืืืืืืช ืืืืกืืฃ ืืืืกืืจ ืืืื ืืื, ืืืืืง ืืืืืืื ืืช ืงืืืื ืฉื ืืืื ื ืืกื ืืืืฆืขืืช
ืกืืืืืช ืขืืืจ UTXO
ืืจืขืืื ืฉื ืฉืืืืฉ ืืกืืืืืช ืืืืกืื UTXO ืืจืืืื
ืขืจืืช ื-UTXO ื ืื ืืช ืชืื ืืื ืชื ืืขื, ืืืืื ืืืจืืช ืืืืืง ืืจืืฉืื ื (IBD), ืืืืืกื ืช ืืืืืื ืืืชืืื, ืืขืื ืฉืชืืืืชื ืืฉืชื ื ืืืืจ ืขืืืื ืขืกืงืืืช ืืื ืืืืง ืืืฉ ืื ืืื ืฉื ืืจืฉืช. ืชืืืื ืื ืืืจืฉ ืืืจืื ืฉื ื-200 GB ืฉื ื ืชืื ื ืืืืง ืืืืืืช ืฉื ืืืืช ืืืืืื ื ืืชืืืืช ืืืืืืืืืช. ืืืืจ ืืฉืืืช ืชืืืื ื-IBD, ืืฉืืจื ืืชืืชืื ื ืืื ืฉื-UTXO-ืกื ืืชืคืืก ื-4 GB.
ืขื ืืืช, ืขื ืืฆืืจืื, ืืืื ืืงืื ืฆื ืืืก ืืืกืคืื ืืฆืืืฆืืื ืืืืืืช ืืืคืงืช ืืืืืืช ืงืจืืคืืืืจืคืืืช, ืื ืื ืืืขืงื ืืืจ ืืกืคืื ืืืื ืื ืืืขืืจ ืืืขืืื ืฉื ืืืชื ืืกืคืื, ืืฉืจ ืืกืคืง ืืืืื ืืงืืืื ืืืขืืืชื.
ืืฆืืจ ืืืื ืืืืงืจื ืืืฆืื ืงืืืคืงืื ืฉื ืงืืืฆื. ืืืื ืืืืฆืื ืืืืืืกื ืืืื ืืืืืช ืงืืืข , ืื ืืืืืื ืืืืคื ืชืช-ืืื ืืืจื ืืืืก ืืงืจืืื ืืืืช ืฉื ืืกื ืืืืื ืืืืื ื ืขืฆืื, ืืืฉื , ืืืฉืจ n ืืื ืืงืจืืื ืืืืช ืฉื ืืงืืืฆื ืืืืืืกื ืช.
ืืืงืจื ืื, ืืืฆืืจ ืฆืจืื ืืืคืฉืจ ืืคืงืช ืืืืื ืืืืืืช ืจืืื ืืงืืืฆื (ืืืืืช ืืืืื) ืืืืคืฉืจ ืืืืช ืืืืื ืื ืืืขืืืืช.
ืืกืืืื ื ืงืจืืช ืืื ืื if ืืืคืฉืจ ืื ืืืืกืืฃ ืืืื ืืื ืืืืกืืจ ืืืื ืืื ืืงืืืฆื.
ืืืืื ืืกืืืื ืืื ืชืืื
ืืืืจืืงืกื
ืขืืฆืื Utreexo ืฉืืืฆืข ืขื ืืื Thaddeus Dryja ืืืคืฉืจ ืืืฆืืจ ืืื ืื ืฆืืืจ ะฑะตะท ืืืืจื ืืืืื ื.
Utreexo ืืื ืืขืจ ืฉื ืืื ืืจื ืืืฉืื
ืืื ื ืืืื ืฉื ืืกืืืื
ืชืื ืืกืืืื ืืกืืืจืื ืืืขืจ ืฉื ืขืฆืื ืืื ืืจืืื ืืืืืืืืื. ืขืฆืื ืืกืืืจืื ืืคื ืืืื. ืืืฆืื ืื ื ืืืจ ืืืืืชื ืืืืชืจ ืืืืคืฉืจ ืืืืืื ืืช ืืืืื ืืขืฆืื ืืืืื ืคืขืืืืช ืขื ืืกืืืื.
ืืืืืจ ืืฆืืื ืื ืืืืจ ืฉืื ืืขืฆืื ืืืขืจ ืื ืืืืืืืืื, ืืืืื ืืชืืื ืืืืงืช ืฉืชืืื, ืืคื ืฉื ืืชื ืืืืฆื ืื ืืกืคืจ ืืืขื ืืกืืื ืฉื ืืืงืืช ืฉืชืืื. ืืืชืื, ื ืืชื ืืงืืฅ ืื ืงืืืฆื ืฉื ืขืืื ืืขืฆืื ืืื ืืจืืื, ืืืื ืืืงืจืื, ืืืกืคืช ืืืื ื ืืืฉ ืืืจืฉืช ืืืข ืจืง ืขื ืฆืืชื ืืฉืืจืฉ ืฉื ืขืฆืื ืืืืืกื ืื.
ืืคืืื, ืืืืฆืื ืืืืืืกื ืฉื ืืฆืืจ Utreexo ืืื ืจืฉืืื ืฉื ืฆืืชื ืฉืืจืฉ (ืฉืืจืฉ ืืจืงื), ืืื ืื ืืขืจ ืืขืฆืื.
ืืืื ื ืฆืื ืืช ืจืฉืืืช ืจืืืื ืืฉืืจืฉ ื Vec<Option<Hash>>
. ืกืื ืืืคืฆืืื ืื Option<Hash>
ืืฆืืื ืฉืืืชืื ืฉืืืื ื ืืฉืืจืฉ ืืกืจ, ืืืืืจ ืืื ืขืฅ ืืืืื ืืืชืืื ืืืฆืืจ.
/// SHA-256 ั
ะตั
#[derive(Copy, Clone, Hash, Eq, PartialEq)]
pub struct Hash(pub [u8; 32]);
#[derive(Debug, Clone)]
pub struct Utreexo {
pub roots: Vec<Option<Hash>>,
}
impl Utreexo {
pub fn new(capacity: usize) -> Self {
Utreexo {
roots: vec![None; capacity],
}
}
}
ืืืกืคืช ืืืื ืืื
ืจืืฉืืช, ื ืชืืจ ืืช ืืคืื ืงืฆืื parent()
, ืืืืื ืืช ืฆืืืช ืืื ืขืืืจ ืฉื ื ืืืื ืืื ื ืชืื ืื.
ืคืื ืงืฆืืืช parent()
ืืืืืื ืฉืื ื ืืฉืชืืฉืื ืืขืฆื ืืจืงื, ืืื ืฉื ืื ืืื ืืฉื ื ืืฆืืชืื ืืื ืฆืืืช ืืื ืืืืืกื ืืช ื-hash ืฉื ืฉืจืฉืืจ ืืืืืืืื ืฉื ืืฆืืชืื ืืฆืืฆืืื:
fn hash(bytes: &[u8]) -> Hash {
let mut sha = Sha256::new();
sha.input(bytes);
let res = sha.result();
let mut res_bytes = [0u8; 32];
res_bytes.copy_from_slice(res.as_slice());
Hash(res_bytes)
}
fn parent(left: &Hash, right: &Hash) -> Hash {
let concat = left
.0
.into_iter()
.chain(right.0.into_iter())
.map(|b| *b)
.collect::<Vec<_>>();
hash(&concat[..])
}
ืืืืืจ ืืฆืืื ืฉืืื ืืื ืืข ืืช ืืืชืงืคืืช ืฉืชืืืจื ืขื ืืื ืฉืืจื ืืืืื, ืคืืืจ ืืื ืคืืงื, ืขืื ืฉืืืจ ืืกืืกืืืื ืฆืืืจ ื
ืืืฉืจ ืืชื ืืืกืืฃ ืืืื ืืื ืืฆืืืจ, ืขืืื ืืขืงืื ืืืจ ืจืืืื ืืฉืืจืฉ ืฉืืฉืชื ื. ืขื ืืื ืืืฆืืข ืื ืชืื ืฉื ืฉืื ืื ืจืืืื ืืฉืืจืฉ ืขืืืจ ืื ืืืื ื ืฉืชืืกืืฃ, ืชืืื ืืื ืืช ืืืืืจ ืืืชืจ ืืืืื ืื ืืืืืชื ืฉื ืืืื ืืื ืืื.
ืขืงืื ืืืจ ืฉืื ืืืื ืชืื ืืื ืืืกืคืชื
ืืื ืืขืงืื ืืืจ ืืฉืื ืืืื ืฉืืืฆืขื, ืืืื ื ืืจืื ืขื ืืืื ื Update
, ืืฉืจ ืืืืกื ื ืชืื ืื ืขื ืฉืื ืืืื ืืฆืืชืื.
#[derive(Debug)]
pub struct Update<'a> {
pub utreexo: &'a mut Utreexo,
// ProofStep ั
ัะฐะฝะธั "ัะพัะตะดะฐ" ัะปะตะผะตะฝัะฐ ะธ ะตะณะพ ะฟะพะปะพะถะตะฝะธะต
pub updated: HashMap<Hash, ProofStep>,
}
ืืื ืืืืกืืฃ ืืืื ื ืืกืืืื, ืืชื ืฆืจืื:
- ืฆืืจ ืืขืจื ืฉื ืกืืื ืฉื ืืืื ืืื ืฉืืจืฉืืื
new_roots
ืืืงื ืืช ืจืืืื ืืฉืืจืฉ ืืงืืืืื ืฉื, ืืื ืขืืืจ ืื ืืื:
ืงืื
let mut new_roots = Vec::new();
for root in self.roots.iter() {
let mut vec = Vec::<Hash>::new();
if let Some(hash) = root {
vec.push(*hash);
}
new_roots.push(vec);
}
- ืืืกืฃ ืืช ืืืืื ืืื ืฉืืฉ ืืืืกืืฃ (ืืขืจื
insertions
) ืืขืืื ืืจืืฉืื ืnew_roots[0]
:
ืงืื
new_roots[0].extend_from_slice(insertions);
- ืืื ืืช ืืคืจืืืื ืฉื ืืกืคื ืืกื ืืจืืฉืื ืขื ืืฉืืจ:
- ืืื ืืขืืืืช ืขื ืืืชืจ ืืคืจืื ืืื:
- ืงื ืฉื ื ืืืื ืืื ืืงืฆื ืืกื, ืืฉื ืืช ืืืืจื ืฉืืื, ืืกืจ ืืช ืฉื ื ืืืืื ืืื
- ืืืกืฃ ืืช ืืื ืืืืืฉื ืืขืืื ืืืื
- ืืื ืืขืืืืช ืขื ืืืชืจ ืืคืจืื ืืื:
ืงืื
for i in 0..new_roots.len() {
while new_roots[i].len() > 1 {
// ะะฑัะตะดะธะฝัะตะผ ะดะฒะฐ ัะปะตะผะตะฝัะฐ ะฒ ะพะดะธะฝ ะธ ัะดะฐะปัะตะผ ะธั
let a = new_roots[i][new_roots[i].len() - 2];
let b = new_roots[i][new_roots[i].len() - 1];
new_roots[i].pop();
new_roots[i].pop();
let hash = self.parent(&a, &b);
// ะะฐัะฐัะธะฒะฐะตะผ ะบะพะปะธัะตััะฒะพ ะบะพัะทะธะฝ ะตัะปะธ ััะตะฑัะตััั
if new_roots.len() <= i + 1 {
new_roots.push(vec![]);
}
// ะะพะผะตัะฐะตะผ ัะปะตะผะตะฝั ะฒ ัะปะตะดััััั ะบะพัะทะธะฝั
new_roots[i + 1].push(hash);
// ะะต ะทะฐะฑัะฒะฐะตะผ ะพััะปะตะถะธะฒะฐัั ะธะทะผะตะฝะตะฝะธั;
// ััะพ ะฟัะธะณะพะดะธััั ะดะปั ะณะตะฝะตัะฐัะธะธ ะดะพะบะฐะทะฐัะตะปัััะฒะฐ ะดะพะฑะฐะฒะปะตะฝะธั ัะปะตะผะตะฝัะพะฒ
updated.insert(a, ProofStep { hash: b, is_left: false });
updated.insert(b, ProofStep {hash: a, is_left: true });
}
}
- ืืขืืจ ืจืืืื ืฉืืจืฉ ืืคืืื ืืืขืจื ืืฆืืจ ืฉื ืืฆืจ
ืงืื
for (i, bucket) in new_roots.into_iter().enumerate() {
// ะะฐัะฐัะธะฒะฐะตะผ ะฐะบะบัะผัะปััะพั ะตัะปะธ ััะตะฑัะตััั
if self.roots.len() <= i {
self.roots.push(None);
}
if bucket.is_empty() {
self.roots[i] = None;
} else {
self.roots[i] = Some(bucket[0]);
}
}
ืืฆืืจืช ืืืืื ืืืืื ืืื ื ืืกืคืื
ืืืืืช ืืืืืช ืืชื ืืกืืืื (Proof
) ืืฉืืฉ ืืฉืืื ืืจืงื, ืืืืจืื ืืฉืจืฉืจืช ProofStep
. ืื ืืฉืืื ืื ืืืืื ืืฉืื ืืงืื, ืื ืืืืืื ืฉืืืื.
/// ะะดะธะฝะธัะฝัะน ัะฐะณ ะฝะฐ ะฟััะธ ะบ ัะปะตะผะตะฝัั ะฒ ะดะตัะตะฒะต ะะตัะบะปะฐ.
#[derive(Debug, Copy, Clone)]
pub struct ProofStep {
pub hash: Hash,
pub is_left: bool,
}
/// ะะพะบะฐะทะฐัะตะปัััะฒะพ ะฒะบะปััะตะฝะธั ัะปะตะผะตะฝัะฐ. ะกะพะดะตัะถะธั ัะฐะผ ัะปะตะผะตะฝั ะธ ะฟััั ะบ ะฝะตะผั.
#[derive(Debug, Clone)]
pub struct Proof {
pub steps: Vec<ProofStep>,
pub leaf: Hash,
}
ืฉืืืืฉ ืืืืืข ืฉืืืฉื ืงืืื ืืื ืืขืช โโืืืกืคืช ืืืื ื (ืืื ื Update
), ืชืืื ืืืฆืืจ ืืืืื ืืื ืฉืจืืื ื ืืกืฃ ืืกืืืื. ืืฉื ืื, ืื ื ืขืืืจืื ืขื ืืืืช ืืฉืื ืืืื ืฉืืืฆืขื ืืืืกืืคืื ืื ืฉืื ืืืจืื ืฉื ืืจืงื, ืืฉืจ ืชืฉืืฉ ืืืืจ ืืื ืืืืืื:
ืงืื
impl<'a> Update<'a> {
pub fn prove(&self, leaf: &Hash) -> Proof {
let mut proof = Proof {
steps: vec![],
leaf: *leaf,
};
let mut item = *leaf;
while let Some(s) = self.updated.get(&item) {
proof.steps.push(*s);
item = parent(&item, &s);
}
proof
}
}
ืชืืืื ืืฆืืจืช ืืืืื
ืืืืงืช ืืืืืื ืืืืื ื
ืืืืงืช ืืืืืช ืืืืื ืฉื ืืืื ื ืืกืชืืืช ืืืขืงื ืืืจ ื ืชืื Merkle ืขื ืฉืืื ืืืืื ืืืืื ื ืฉืืจืฉ ืงืืื:
pub fn verify(&self, proof: &Proof) -> bool {
let n = proof.steps.len();
if n >= self.roots.len() {
return false;
}
let expected = self.roots[n];
if let Some(expected) = expected {
let mut current_parent = proof.leaf;
for s in proof.steps.iter() {
current_parent = if s.is_left {
parent(&s.hash, ¤t_parent)
} else {
parent(¤t_parent, &s.hash)
};
}
current_parent == expected
} else {
false
}
}
ืึผึฐืึดืืจืึผืจ:
ืชืืืื ืืืืงืช ืืืืืื ืขืืืจ ื
ืืกืจืช ืคืจืืืื
ืืื ืืืกืืจ ืชื ืืกืืืื, ืขืืื ืืกืคืง ืืืืื ืชืงืคื ืืื ืฉืืชื ื ืืฆื ืฉื. ืืืืฆืขืืช ืื ืชืื ืื ืืืืืืื, ื ืืชื ืืืฉื ืจืืืื ืฉืืจืฉ ืืืฉืื ืฉื ืืืฆืืจ ืฉืืืืืื ืฉื ืืชื ื ืื ืชืืื ื ืืื ื ืืืชืจ ืขืืืจื.
ืืืืืืจืืชื ืืื ืืืืงืื:
- ืืื ืืชืืกืคืช, ืื ื ืืืจืื ืื ืกื ืฉื ืกืืื ืจืืงืื ืืืงืืืืื ืืขืฆื ืืจืงื ืืืืื ืืฉืืื ืืืืงืช ืฉื ืืื ืืืื ืืกื
- ืื ืื ื ืืื ืืกืื ืืกืืื ืืืื ืืื ืืืืจืืืช ืฉืืื ืืจืงื; ืืื ืืกื ืฉืืื ืืืกืคืจ ืืฆืขื ืื ืืืื
- ืื ื ืืกืืจืื ืืช ืืืื ื ืืฉืืจืฉ ืืืื ืืืืื ืื ืชืื ืืืืืืื
- ืืื ืืืืกืคื, ืื ื ืืืฉืืื ืจืืืื ืฉืืจืฉ ืืืฉืื ืขื ืืื ืฉืืืื ืืืื ืืื ืืกืืื ืืืืืืช ืืืขืืจืช ืชืืฆืืช ืืืืืื ืืกื ืืื
ืงืื
fn delete(&self, proof: &Proof, new_roots: &mut Vec<Vec<Hash>>) -> Result<(), ()> {
if self.roots.len() < proof.steps.len() || self.roots.get(proof.steps.len()).is_none() {
return Err(());
}
let mut height = 0;
let mut hash = proof.leaf;
let mut s;
loop {
if height < new_roots.len() {
let (index, ok) = self.find_root(&hash, &new_roots[height]);
if ok {
// Remove hash from new_roots
new_roots[height].remove(index);
loop {
if height >= proof.steps.len() {
if !self.roots[height]
.and_then(|h| Some(h == hash))
.unwrap_or(false)
{
return Err(());
}
return Ok(());
}
s = proof.steps[height];
hash = self.parent(&hash, &s);
height += 1;
}
}
}
if height >= proof.steps.len() {
return Err(());
}
while height > new_roots.len() {
new_roots.push(vec![]);
}
s = proof.steps[height];
new_roots[height].push(s.hash);
hash = self.parent(&hash, &s);
height += 1;
}
}
ืชืืืื ืืกืจืช ืจืืื "A":
ืฉืืืื ืืจืฉืช ืงืืืืช
ืืืืฆืขืืช ืืืฆืืจ ืืืืฆืข, ืฆืืชืื ืืืืืื ืืืืื ืข ืืฉืืืืฉ ื-DB ืืื ืืืืกื ืืช ืื ื-UTXOs ืืขืืืื ืืืืืช ืืกืืืืื ืืฉื ืืช ืืช ืขืจืืช ื-UTXO. ืขื ืืืช, ืืชืขืืจืจืช ืืขืืืช ืืขืืืื ืขื ืจืืืืช.
ืืืื ื ืงืจื ืืฆืืืช ืืืืืืช ืฉืืฉืชืืฉ ืืฆืืืจ UTXO ืงืึนืืคึผึธืงืึดื (ืฆืืืช ืืฆื ืงืืืคืงืื), ืืืืืืช ืืื ืืฆืืจ ืืื ืืืฉืืื (ืฆืืืช ืืื). ืงืืืื ืฉื ืฉื ื ืืืืงืืช ืฉื ืฆืืชืื ืืืฆืจ ืืขืื ืืฉืืืืื ืืจืฉืช ืืืช, ืฉืื ืฆืืชืื ืงืืืคืงืืืื ืืืจืฉืื ืืืืื ืืงืืืื ืฉื UTXOs, ืืืืฉืงืขืื ืืืจื ืืงืฆืืืช, ืืขืื ืฆืืชืื ืืืืื ืื. ืื ืื ืฆืืชื ืืจืฉืช ืื ืืขืืจื ืืืงืืื ืืืืืคื ืืชืืื ืืฉืืืืฉ ื-Utreexo, ืืื ืฆืืชืื ืงืืืคืงืืืื ืืืฉืืจื ืืืืืจ ืืื ืืืืื ืืคืขืื ืืจืฉืช ืืืืืงืืื.
ืืื ืืคืชืืจ ืืช ืืืขืื ืฉื ืฉืืืื ืฆืืชืื ืงืืืคืงืืืื ืืจืฉืช, ืืืฆืข ืืืฆืื ืืืืงื ื ืืกืคืช ืฉื ืฆืืชืื - ืืฉืจืื. ืฆืืืช ืืฉืจ ืืื ืฆืืืช ืฉืื ืืืืืกื ืื ืืช ืกืืืืช Utreexo ืืืืืืช ืืคืขืื ืขืืืจ ืื UTXO ืืืืช UTXO-set. ืืฉืจืื ืืืฉืืื ืืืืื ืืืฉืื ืืืขืืื ืื ืืช ืืืฆืืจ ืืืืืืืืช ืขื ืืืขืช ืืืืงืื ืืืฉืื ืฉื ืขืกืงืืืช. ืชืืืืงื ืืขืืืื ืฉื ืืืฆืืจ ืืืืืืืืช ืื ืืืืื ืขืืืก ืืืฉืืื ื ืืกืฃ ืขื ืฆืืชืื ืืืื. ืืฉืจืื ืืงืจืืืื ืฉืื ืืืกืง: ืฆืจืื ืืฉืืืจ ืขื ืกืืจ hashes, ืืขืืืช hashes ืขืืืจ ืฆืืชืื ืงืืืคืงืืืื, ืืืฉืจ n ืืื ืืขืืฆืื ืฉื ืขืจืืช UTXO.
ืืจืืืืงืืืจืช ืจืฉืช
ืืฉืจืื ืืืคืฉืจืื ืืืืกืืฃ ืืืืจืื ืฆืืชืื ืงืืืคืงืืืื ืืจืฉืช ืืืื ืืฉื ืืช ืืช ืืชืืื ื ืฉื ืฆืืชืื ืงืืืืื. ืฆืืชืื ืืืืื ืคืืขืืื ืืืขืืจ, ืืืคืืฆืื ืืื ื ืืืื ืขืฆืื ืขืกืงืืืช ืืืกืืืืช. ืฆืืชื ืืฉืจ ืื ืฆืืชืื ืืืืื ืืืืืกื ืื ืื ืืกืฃ ื ืชืื ื ืกืืืื ืฉื Utreexo ืืงืืืฆื ืฉื ืืืืืืช ืืืืื ืขืืืจ ืื UTXO ืืขืช ืขืชื. ืฆืืืช ืืืฉืจ ืืื ื ืืคืจืกื ืืช ืขืฆืื ืืืื, ืืืชืืืืจ ืืืืืช ืฆืืืช ืืื ืขืืืจ ืื ืืฆืืชืื ืืืืืื ืืฆืืืช ืงืืืคืงืื ืขืืืจ ืื ืืฆืืชืื ืืงืืืคืงืืืื. ืืืจืืช ืฉืืฉืจืื ืืืืจืื ืืช ืฉืชื ืืจืฉืชืืช ืืื, ืื ืืืขืฉื ืฆืจืืืื ืืืืจ ืืืชื ืจืง ืืืืืื ืืื: ืืฆืืชืื ืืืืื ืงืืืืื ืืขื ืฆืืชืื ืงืืืคืงืืืื. ืื ืืคืฉืจื ืืืืืื ืฉืืื ืฆืืจื ืืฉื ืืช ืืช ืคืืจืื ืืขืกืงืืืช, ืื ืืชื ืืืจืืง ืืืืืืช UTXO ืขืืืจ ืฆืืชืื ืงืืืคืงืืืื, ืื ืฉืื ืฆืืืช ืงืืืคืงืื ืืืื ืืืืคื ืืืื ืืฉืืจ ืืจื ืืงืฆืืืช ืืื ืืฉืชืชืคื ืืจืฉืช ืืื ืืฉืชืชืคืืช ืฉื ืฆืืชื ืืฉืจ.
ืืกืงื ื
ืืกืชืืื ื ืขื ืกืืืืช Utreexo ืืืืฉืื ื ืืช ืื ืืืืคืืก ืฉืื ื- Rust. ืืืงื ื ืืช ืืจืืืืงืืืจืช ืืจืฉืช ืฉืชืืคืฉืจ ืฉืืืื ืฉื ืฆืืชืื ืืืืกืกื ืกืืืื. ืืืชืจืื ืฉื ืชืคืืกืืช ืงืืืคืงืืืืช ืืื ืืืื ืื ืชืื ืื ืืืืืืกื ืื, ืฉืชืืื ืืืืจืืชืืืช ืืขืืฆืืช ืกื ื-UTXOs, ืื ืฉืืคืืืช ืืืื ืืช ืืืจืืฉืืช ืืฉืื ืืืกืง ืืืืฆืืขื ืืืกืื ืขืืืจ ืฆืืชืื ืืืื. ืืืืกืจืื ืืื ืชืขืืืจืช ืืฆืืืช ืื ืืกืคืช ืืืขืืจืช ืืืืืืช, ืื ืืื ืืงืืช ืฆืืืจืช ืจืืืืช (ืืืฉืจ ืืืืื ืืืช ืืืืืื ืืช ืงืืืื ืฉื ืืกืคืจ ืืืื ืืื) ืืฉืืืจื ืืืืืื ืืืืืืช ืืขืืืจ ืืฉืืืจ ืขื ืชื ืืขื ืืืืืืืช ืืงืืืืื.
ืชืืืืจ:
GitHub ืฉื ืื ืืืคืืก ืฉื Utreexo ื-Rust ืชืืืืืก ืืจืืื -Utreexo: ืืฆืืจ ืืื ืื ืืืืกืก hash ืืืืชืื ืืกื ืืืืืงืืื UTXO ืืืืจืื ืืื ืคืฉืื ืืชืื ืืืืืจ
ืืงืืจ: www.habr.com