
α αα α!
αα αααα»ααααααΆα Bitcoin ααααΆααααΆααα’αα ααΆααααααΆαααΌαααα·ααααΆ αααααααααΎαααα»ααα UTXOs: ααΎααΆαααΆααααα»ααααΆααααααΆααα αααΆα α’αααααΆαα·αααααΆαα αα·ααα αααααααααααααα’αααΈα αααα»α UTXO ααΊααΆαααα»ααα·ααααααα’αααααααΆαααααααΌαααΆααααααΆααααααΆαααααααΆααα»ααααΆα αααααααΆαααααΆααααΉααα·αα’αΆα αααααααααΆαααα»ααααΆαααααααα·ααααα·ααΆαα αΌα αα·ααααα»ααααααΆααα½αααΆααΆαααα
αααα»ααααααα ααΆαααααΆααΆααααα»αααααΌαααΆαααααΎα‘αΎαααΆαααααααααααααΆααααα’αΆα ααααΎαα ααΆα ααΎααααΈααΆαααααααααααΆααααααΆααααααΆαα»ααααα»αααα ααΎααααΈααααα½αααΆααααα·αααΆαααααααΆαααΆααΆαα»ααααα·ααΆαα ααα ααα·αααααααααααΆααααααΆαα»αααΆααααααΌα αααααΌαααΆαααα αααΆαααααααααΆαααα»ααααΆαααΆααααααΆα αααααααΎα²ααααΆαααΎαααααΎαααΆαααααΆαααα»ααααΆαααΆααααααααα α’αα»ααααΆαα±ααα’ααααααααΈααααααΆα αα·ααααααΎααααααααΆααααααααΆαα
αα αααα»αααΆααααα ααααα ααΎαααΉααααα ααααααΌ Rust ααααααΎααααΈαααΈαα α’ααααα·αααα , - αααα’αα»ααααΆαα±ααααΆααααααααααααΌαααΆαααα αααΆααααααΆααααααΆαααα»ααααΆαα
ααΆαβαααα αΆβα’αααΈ?
αααα αΆαα½ααααα»αα αααααααα αΆαααααΆαα’αΆαα»α αααΎαααααΆααααα Bitcoin ααΊααααααΆαααααΎααΆαααααααΆαααααααΆα αααα·ααα "αααΆααΆαααααΆαααααα½αααααα’ααα" αααααΌαα±ααα’αααα αΌααα½ααααααΆααααααΆαααααααααΆααααΌααα·αα·ααΆααα’αααααααΆααααααΆααααααΎααααΆααα αα αααα»α Bitcoin ααΌααα·αα·αααααΆαααααΌαααΆααααα αΆαααΆαααα»αααααααααααααα·αααΆαα αααΆα - αααα»α UTXO α αααααααααααααα·ααααααΆααααΆααααα·α αΆααααΆααα·αααααααα ααΆααΆαα’ααααααααααααα αααα»αααααααααααααΆαα’αα»ααααααΎααααΆαααα "ααΆααΌα" ααΈαα½ααααΆα "αααα»ααα" ααΆααΆαα»ααΆα ααααα‘αα α αΎααααααΆααααααααααΆαα―ααα (α§. ).
ααΆααΆαααΆααααααΆααααΆαααααα»αααΆααααα αααααΆααααααααα·ααααααα·ααααα·ααΆα (α’αααΈαααααα α ααΆ blockchain) αα·αααααΆαααΆααα αα α»ααααααααααααααααα αααααααα·ααααα·ααααα·ααΆα Bitcoin αα αα α»ααααααααααΌαααΆαααα αααΆααααα αα 200 GB α αΎαααααααΎαα‘αΎαα αααααΆαααΆαααΆααααα ααααΆαααΆαααααααααααΊααΌα ααΆαααα αα ααΆαααααΆααααααα α 4 GB α αΎαααααΆαααααα·αααΌαααΈααΆααα·ααααααΆαα αα α»ααααααααΆαααααΆααααΆααααΆααα αΆααααΆααααα»αααααα ααα·ααΆααααα·αααααααααααααΎαα‘αΎαααΆααααααααΆααα ααα»αααααααα»αα’ααααΆααΊαααΆα α αΎααα½αααΆααααααΆααααΆααα·ααααΆααΆαααα α»α (ααΌαααΎα CDPV)α
ααΆαααΆααΆαα»ααααα·ααΆαααΆαα·αααααααααααα’αα·αα·αααααααΊ (SPVs) αααααΆααααααααΆααααααΆαα»αααααΆαααααα’αααααααΆ (UTXO-set) αααα ααΈααα―αααα
UTXO αα·α UTXO-ααααα
UTXO (Unspent Transaction Output) ααΊααΆααααααααααα·ααααα·ααΆαααααα·αααΆαα αααΆα αααααΆα ααα»α αααα ααααααααΎααααα Satoshi ααΈαα½αααααααΆαααααααααα»αααααα·ααααα·ααΆαα ααααααααααα·αααΆαα αααΆαααααΆαααΆααΆαα»αααα αΌαααααααα·ααααα·ααΆαααααΈ α αΎαααΌα ααααααααΌαααΆαα αααΆα (α αααΆα) αα·αααα ααααΈ UTXO-set α
UTXO ααααΈαααααααααΌαααΆααααααΎαα‘αΎααααααααα·ααααα·ααΆαα
- ααααα·ααααα·ααΆα coinbase αααααααΆαααΆαα»αααα αΌαα αααααΎα UTXO ααααΈαα αααα’ααααα»ααααααα ααααΆαα
- ααααα·ααααα·ααΆααααααΆααα αααααΎα UTXO ααααΈαααααααααα αααΆαααΎαααα»αααΆααααΆαααα UTXO αααααΆαααααΆαα
ααααΎαααΆαααααΆαααααΎααΆαααΆαα½α UTXOα

ααΆααΌαααΆααα ααα½αααΆαααααααΆααααααΆααα αααΆα (αααα»ααα) αααααα’ααααΎα ααα½α UTXO αααααΆααα αααα»αααΆααΌαααααααααΆααααΆαα αααΆαα
ααααΆαααααααΆααα»ααααΆαααΈαα½αα ααΎααααΈααΆαααΆαααΆαααα»ααααα αααΆαααΈααα ααααΌααααααα½ααα·αα·ααααααα»α Π²ΡΠ΅Ρ UTXO ααααα·αα·ααα ααααΆ ααααα·ααααα·ααΆα ααααααΆ αααα»αα
ααααΆααααααΌαααααΆααααααα·ααααΆα
- ααΆααααααααα UTXO-set
- ααΆααα»αα ααααΈ UTXO-set
- ααΆααα·αα·αααααΎαααααααΆααααα UTXO αααα½ααα αααα»ααααα»ααα½αα
ααΆααα·ααΈααΎααααΈααΆααααααααααααΌαααΆααααααΆααααααααΆααααααΆααααααΆαα»αα’αααΈαααα»α ααααααααααααααΆααΆαααΌααααααααΆααααα»αααΆααααααα αα·ααα»αααΆαα» αα·αα·αααααΎα αα·ααααααΆααα’αααΈα’αααα·ααΆαααααΆαα»αα αααα»ααααα»ααααααααΎ .
ααααααααΆαα UTXO
αααα·αααααΆαααααΎααααΆαααααααΎααααΈαααααΆαα»α UTXOs α αααΎαα .
UTXO-set ααααΌαααΆααααααΎαα‘αΎαααααΆαα ααα‘α»ααααααΆααααααα»αααααΌα (IBD) αααααααΌαααΆααααααΆαα»αααα αα·αααΆα’α α·αααααααα αααααααααααΆαα·ααΆααααααΆααααΆααααααΌααααααΆααααΈααααΎαααΆαααααα·ααααα·ααΆαααΈαααα»αααααΈ αα·αααααΉαααααΌααααααααΆαααΈαα½ααα ααααΎαααΆαααααααααΌαα±ααααΆααααα·αααααααααα»ααααα αα 200 GB αα·ααααααααααΆααα αααααααΆααΈααΈααααΆααααααΆαα αααααΆααααΈααααΎαααΆα IBD ααααΌαααΆααααα αα α ααα»α ααααΆααααΊααΆ UTXO-set ααΉαααΆααααΆαααααα αα 4 GB α
αααααΈααΆαααΆαααΆααααα ααΆαα½αααΉαα’ααααααααΌαααααΆαα α αααΆααααααΆαααΌαααα·ααααΆαααααΆααααΌααα·αα·ααααΌαααΆαααΆααααααααα ααΆααΆααααααααααΆαα αα·αααΆααααααΎαααααα»ααΆαααααΈαααααΈα α αΎαααααα»αααααΆαααΆαααΆαααΌααα·αα·αααααΆαααΊααααΌαααααΌααα ααα αΆααααΌααα·αα·ααΆααααα ααααααααααααα»ααΆαααα’αααα·ααΆα αα·αααΆαααΆααα αΆαααααααα½αααα
accumulator α’αΆα
ααααΌαααΆαααα α
ααΆααααΆαααααα½ααααααα»ααα½αα ααα αααααααΆααααααΆααααααΆαα»αααααΌαααααΆα
ααα½αααα
α¬αααααΎα sublinearly ααΆαααααα
ααΉα cardinality αααααα»α αα·αααα αααααΆαα»αααα½αααΆ α§ααΆα ααα
αααααΆααααααααα n ααΊααΆ cardinality αααααα»ααααααΆααααααΆαα»αα
αααα»αααααΈααα α’ααααααααΌααααα»ααα½αααα’αα»ααααΆαα±αααααααΎαααααα»ααΆαααααΆααα½ααααα αΌαααΆαα»αα αααα»ααααα»α (ααααα»ααΆααα½ααααα αΌα) αα·αααααΎα±ααααΆα’αΆα ααααΎαα ααΆαααΎααααΈαααααααααΆααααααα»ααΆααααααααααααααααα·αααααΆαα
αααααααΌαααΆαααα α ααΆ ααΆααααα ααααα·αααΎα’αα»ααααΆαα±ααα’αααααααααααΆαα» αα·αααααΆαα»α ααααΈαααα»αα
α§ααΆα ααααααααααααααααΉαααΆα . α§ααααααααα»αααααααααΆαααα ααααααααΆαααααΆααααααααΌαααΆααααααΆαα»αααα»αααααααααΌαα±ααααΆαααααααΆα αααααΆααα ααααααα (ααΆαααα‘αΎααααα’αΆα αα»αα α·αααααΆα) α αααααΌαααΆααααααα·αααααΆαα’αα»ααααααααα§ααααααααααΌααααα»ααααααΆαααααααΆαααααα·ααα½αα±αααα»αα α·αααααΌα ααΆ Bitcoin α αΆααααΆααααΈααΆαααα ααααΆααα·ααααααααα‘α»αααααααααΎααααααΆααα’αΆα α±ααα’αααααΆααααα αΆααααααΎαααααα»ααΆααα·ααα·αααα’αααα·ααΆααα UTXO αααααααααααααΆαααααααααΎ UTXO-set αααααα’ααααΎα§ααααααααααΌααααα»αααααααα
Utreexo
ααΆααα ααΆ Utreexo αααααααΎα‘αΎαααα Thaddeus Dryja ααααΎα±ααααΆα’αΆα αααααΎαααΆαα ααΆααααα Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ αααααααΆα ααΆαααα‘αΎααααα’αΆα αα»αα α·αααααΆαα
Utreexo ααΊααΆαααααααααααΈαααααα’α₯αααα αα αα·αααΆααΆαα’αα·αααααααααααα·ααααααΆααααα αΆααα αααα»α αααααααααααααΆααααα»αααΆαααααΆαα»α ααααΈαααα»αα
αα ααΆααααααααα‘αΌααΈααααααα
αααα·ααΆαααααααΌαααΆααααα ααα αααα»αααααααααΎαααΎαααααΈαααααα’α ααΎαααΎααααΌαααΆαααααααααΆαααααααα ααΆαααααΆααααααααΌαααΆαααααΎαααΎαααΆααΌαααΆααααααΎαααΎααααα»α αα·αα’αα»ααααΆαα±ααα’αααααΎαααΎαααΆααααα αΌαααααΆααααΎαααΎα’αα‘α»ααααααααα·ααααα·ααΆαααΎαααα
α’ααααα·ααααααΆαααααααααΆααααΆ αααααΆαααΎαααΎααΆααα’αααα αααα»αααααααΆαααααααααα’ ααααααααααααΆααααΌαααΆααααα αΆαααΆααΆα’αααΆα ααααΈα ααΌα ααααΆααΉαα ααα½αααααααΆαα·ααΆαα½αα’αΆα ααααΌαααΆαααααΆαααΆααΆααααΌαααα’αααΆα ααΈαα ααΌα ααααα αΎα ααααΉαααΎααΆαα½αα’αΆα ααααΌαααΆαααΆααααΆαααα»ααα ααΆααΎαααΎαααααΈα α αΎααααα»ααααααααααΈααΆααα’αα ααΆαααααααααΆαα»ααααΈααΆαααΆαα ααααααΉα ααα’αααΈααααΆααα«αααααΎαααΎααααααααΆαα»α.
ααΌα ααααααααΆααααααΆααααααΆαα»ααα Utreexo accumulator ααΊααΆαααααΈααααααΆααα«α (Merkle root) α α αΎααα·ααααααααααΎααΆααααΌαααα.
α
αΌαααααΆαα±αααααααΈααααΆαα»ααΎαααΆ Vec<Option<Hash>>. ααααααααααα
α
α·ααα Option<Hash> αααα αΆαααΆααΆαα»α«αα’αΆα
ααΆαα αααααΆααααααΆαα·αααΆααααααΆααααααΆααααααααααααααα
αααα»α accumulator ααα
/// 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()
αααααΆαααΎααααα»αααααΎααΎαααΎ Merkle ααααααααΆααααΆααααΈαααΈαα½αα ααΊααΆααααΆαααα½α ααααααααΆαα»ααααααΆααααΆαααααΆαααααααααΆααααααααΆαααα»ααΆαα
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[..])
}α’ααααα·ααααααααααααΆααααΆααΎααααΈααΆαααΆαααΆαααΆααααα αΆααααααΆααα·αααααΆααα Charles Bouillaguet, Pierre-Alain Fouque, Adi Shamir αα·α Sebastien Zimmer αα
αααα»α
ααααααααΈααΎαααααΆααΆααααΈα ααααααααΆααααα»αααΎαααΎαααα½αααααααΌαααΆααααααααα
ααΆαααααΆααααααΆα
αα αααα’αααααααααααΆαα»αα accumulator α’αααααααΌαααΆαααΆαααΆααΎααΆαα»α«αααΆαα½αααααΌαααΆαααααΆααααααΌαα αααααααΎααΆαααααΌαααααΆαααααΆααααααΌαααΆαα» root αααααΆααααΆαα»ααΈαα½αααααα’ααααααααα α’αααα’αΆα αααααΎαααααα»ααΆαααααααααΆαααααααΆαα»ααΆααααααα ααααααααα
ααΆαααΆαααΆαααααΆααααααΌααα αααα’αααααααααααΆα
ααΎααααΈααΆαααΆαααΆαααααΆααααααΌααααααΆαααααΎ α
αΌαααΎααααααΆαα’αααΈαα
ααΆαααααααα 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 });
}
}- ααααΆααααΈααΆαα» root ααΈαα»αααααΆααα α’αΆαα accumulator αααααα
αααααΌα
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) ααΉααααααΎααΆααααΌα Merkle αααααΆααααααααααΆαα 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) α’αααα’αΆα
αααααΎαααααα»ααΆααααααΆααΆαα»αα½αααααΌαααΆααααααααα
αααα»ααααα ααΎααααΈααααΎααΌα
αααα ααΎαααααααΆααααΆααΆαααααΆαααααΆααααααΌααααααΆαααααΎ α αΎαααααααααα αΆαααΈαα½αααα
ααΆααααααΌααααα Merkle αααααΉααααααΎααΆααααα»ααΆαααΆαααααααααΆααα
αααααΌα
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
}
}αααααΎαααΎαα
ααααΎαβααΆαβααβααΆαβαααα½αβαα·αα·αααβααααα»ααΆαβαααααΆαα α

ααΆαααααΆαα»α αα
ααΎααααΈαααααα‘αΆα ααααΈααα α’αααααααΌααααααααααααα»ααΆαααααΉαααααΌααααααΆαααα·ααΆαα ααΈαααα αααααααΎαα·ααααααααΈααααα»ααΆα ααΆααΊα’αΆα ααααΎαα ααΆαααΎααααΈααααΆααΆαα»α«ααααααααΈαα accumulator αααααααα»ααΆααααααΆααααααα±ααααΉααα·ααα·ααααααα
αααα½ααααααααΆαααΆαααΌα ααΆααααααα
- ααααααααΈααΎααα ααΎααααα ααααααααααααα½ααααααααΌαααΉαααΎαααΎ Merkle αααααΆαααααααααααΎααΉαααΆαααααΈαααΈααααααααααααααααα
- ααΎααααα αΌαααΆαα»ααΈααα αΆαααααααΌα Merkle αα αααα»ααααααααα ααααααααααααα ααααΊααααΎααΉαα ααα½αααα αΆααα αα α»αααααα
- ααΎαααααΆαα»α«ααααααααΌαα ααααΈααααα»ααΆαααΉαααΆα
- ααΌα ααΉαααΆααααααα ααΎαααααΆααΆαα»α«αααααΈαααααααααΆαα»ααΈαααααααααΆααΌ αα·αααααΆααααΈαααααααααα ααΈααα ααααααααααααΆααα
αααααΌα
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"α

ααΆααα½ααααα αΌααα αααα»ααααααΆααααααΆαααααΆαα
αααααααΎ accumulator αααααΆαααααΎα‘αΎα ααααΆααα’αΆα αααααΆαααΆαααααΎ DB ααΎααααΈαααααΆαα»α UTXO ααΆααα’αα ααααααααααα ααα’αΆα ααααΆααααααΌα UTXO-setα αααααΆαααΆαααΆααααααααα αΆααααΆαααααΎααΆαααΆαα½αααααα»ααΆαααΎαα‘αΎαα
αααα α ααααΆαααα»ααααΆααααααααΎ UTXO accumulator ααααα½α (compact-state node) α αΎα validator αααααααΆα accumulator ααΊ αααα αα (ααααΆααααα) α α’αααα·ααΆαααααααΆααααααΆααααΈααααααΎααααα αΆαααααΆααααΆααα½ααααα αΌααα½αααΆαα αααα»ααααααΆααααα½α α αΆααααΆααααΈααααΆααααααα½αααααΌαααΆαααααα»ααΆαααα’αααα·ααΆααα UTXO αααααααΌαααΆαα αααΆααααα»αααααα·ααααα·ααΆα ααααααααααΆαααααααααα·αααΆαα ααααα·αααΎααααΆαααααααΆαααΆααα’αααα·ααααα»ααααααααΆαααααΆ α αΎααααα»ααααααααααααααα½αααααΌααα ααααΎ Utreexo αααααααΆααααααα½αααΉαααααΌααα»αα αα α αΎαααΉααα·αα’αΆα ααααΎαααΆαααΎαααααΆα Bitcoin ααΆαααα
ααΎααααΈαααααααΆααααα αΆααααΆααα½ααααα
αΌαααααΆααααααα½ααα
αααα»ααααααΆα ααΆααααΌαααΆαααααΎα‘αΎαααΎααααΈααααΆαααααΆααααααααααααααΆαα - ααααΆα. ααααΆααααααΆαααΊααΆααααΆααααααααααααααααΆαα»αααα Utreexo αα·αααααα»ααΆαααααΆαααΎαααΆααααααααα Π²ΡΠ΅Ρ
UTXO ααΈ UTXO-set α Bridges ααααΆαααα αΆαααααΈ αα·αααααΎαα
αα
α»ααααααααΆαα§ααααααααααΌα αα·αααααα»ααΆα αα
αααααααααα»αααααΈααααααα·ααααα·ααΆααααααα ααΆααααααααΆ αα·αααααΎαα
αα
α»ααααααααΆαα§ααααααααα»α αα·αααααα»ααΆααα·αααΆααααααα»αααααααααΎααααΆααααααααααα ααααΆααααααααα αααΆαα α
αΆαααΆα
αααααΌααααααΆα’αααΈαα±ααααΆαααααααααα
hashes αααααΉα
αααααΆαααααΆααααααΆααααααα½α ααα n ααΊααΆααΆααααααααα»α UTXO α
ααααΆαααααααααααααΆα

Bridges ααααΎα±ααααΆα’αΆα ααααααααααΆααααααα½αααααα·α ααααααα αααα»ααααααΆαααααα·αααααΆααααααΌααααααα·ααΈααααααααΆαααααααΆαααααΆααα ααααΆααααααααααααΎαααΆαααΌα ααΈαα»α α ααα αΆαααααα·ααααα·ααΆα αα·ααααα»ααααα»αα αααααα½αααα ααααΆααααααΆαααΊααΆααααΆααααααααααααααααΆαα»ααα·ααααααααα Utreexo αα·ααααα»αααααααα»ααΆααα½ααααα αΌααααααΆαα Π²ΡΠ΅Ρ UTXO αααααΆααααααααα ααααΆααααααΆααα·αααααααααααΆαααααααα½αααΆαα αααααααΎαα»αααΆααααΆαααααααααααααΆααααααΆααααααααααΆααα’αα αα·αααααΆααααααα½ααααααΆααααααΆααααΌα ααΆααα’ααα αααααΈααΆααααΆααααααΆαααααααΆαααΆααααΈαααΆαα½αααααΆααααα ααΆααα·ααα½αααααααΆααααααααΌαααΆαααααΆαααα½αααΆαααα»ααα·ααα αααα½αααα»αααααα ααΈααααΆαααααααααααααΆαααααΆαααα ααααΆααααααα½αα αααα’αΆα αα αα½α αααααΆαααααααααααα·ααααα·ααΆααα·αα αΆαααΆα αααααΌαααΆαααααΆααααααΌα α αΎαααααα»ααΆα UTXO αααααΆααααααΆααααααα½αα’αΆα ααααΌαααΆααα»αα αα ααΌα ααααααααΆααααααα½αααΆαα½αα’αΆα ααααΆαααααα·ααααα·ααΆαααΌα ααααΆαα ααΆααα’αααα αΌααα½ααααααΆαααΆααα’ααααααα·αααΆαααΆαα αΌααα½αααΈααααΆααααααΆαα
ααα ααααΈααααα·ααααΆα
ααΎαααΆαααΎαααα Utreexo α αΎαααΆαα’αα»ααααααααΌααααααΆαα αααα»α Rust α ααΎαααΆααααα‘ααααΎαααααΆαααααααααααααΆααααααΉαα’αα»ααααΆαα±αααα½ααααα αΌαααααΆαααααααΆαααΌαααααΆαααΎαααα α’αααααααααααααααΆαααααα½αααΌα ααΊααΆααα ααααα·αααααααααααΆααααααΆαα»ααααα’αΆαααααααΎααααΆααΈαααΎααΆααααααααα»α UTXO αααααΆααααααααααΆαααααΆααααΌααααααΌαααΆααααααΆααααα αααΆα αα·αααααΎαααΆααααα»ααααααΆααααααΆααααααααα αα»ααα·ααααα·ααΊα ααΆα αααααΆαααααααααααααΆααααΆααααααΌαααααα»ααΆα ααα»αααααα αα αααααααααΆααααααΌααααα»αααααα»ααΆα (αα ααααααααααα»ααΆααα½ααααα αΆαααΈα’αααα·ααΆαααααΆαα»ααΆα αααΎα) αα·αααααΆαααααααΆααα’αΆα αα½ααααααΆα ααΆα ααααα»ααααααααααααα’αΆα ααα½αααααΆαα
ααα ααααΈααα:
- -
ααααα: www.habr.com
