I-Utreexo: icindezela i-UTXO Bitcoin eminingi

I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Sawubona Habr!

Kunethiwekhi ye-Bitcoin, wonke ama-node, ngokuvumelana, avumelana ngeqoqo le-UTXOs: zingaki izinhlamvu zemali ezitholakalayo zokusebenzisa, kubani ngokuqondile, futhi ngaphansi kwaziphi izimo. Isethi ye-UTXO iyisethi encane yedatha edingekayo ku-node yokuqinisekisa, ngaphandle kwalokho i-node ngeke ikwazi ukuqinisekisa ukufaneleka kokuthengiselana okungenayo kanye namabhulokhi aqukethe.

Mayelana nalokhu, imizamo yenziwa ngazo zonke izindlela zokunciphisa ukumelwa okugciniwe kwalesi sethi, ukuyicindezela ngaphandle kokulahlekelwa iziqinisekiso zokuphepha. Ivolumu encane yedatha egciniwe, iyancipha izidingo zesikhala sediski se-validator node, okwenza ukuqaliswa kwe-validator node kushibhile, kukuvumela ukuthi ukwandise inethiwekhi futhi ngaleyo ndlela ukwandise ukuzinza kwenethiwekhi.

Kulokhu okuthunyelwe sizothumela i-Rust prototype yesiphakamiso sakamuva esivela komunye umbhali Lightning Network Paper, Thaddeus Dryja - I-Utreexo: i-accumulator eguquguqukayo esekwe ku-hash elungiselelwe isethi ye-Bitcoin UTXO, okuvumela ukunciphisa izidingo zesikhala sediski kuma-validator node.

Yini inkinga?

Enye yezinkinga ezingapheli ze-Bitcoin kube ukuqina kwayo. Umqondo "webhange lakho" udinga abahlanganyeli benethiwekhi ukuthi bagcine amarekhodi azo zonke izimali ezitholakalayo ukuze zisetshenziswe. Ku-Bitcoin, izimali ezitholakalayo zivezwa njengesethi yemiphumela engasetshenzisiwe - isethi ye-UTXO. Nakuba lokhu kungekona ukumelwa okunembile, kunenzuzo mayelana nokusebenza okungaphezu kwesethulo lapho "isikhwama semali" ngasinye sine "bhalansi" njengokufakwa okuhlukile, futhi sengeza ubumfihlo (isb. CoinJoyina).

Kubalulekile ukuhlukanisa phakathi komlando wokuthengiselana (lokho okubizwa ngokuthi i-blockchain) kanye nesimo samanje sesistimu. Umlando wokuthengiselana we-Bitcoin njengamanje uthatha cishe u-200 GB wesikhala sediski, futhi uyaqhubeka nokukhula. Kodwa-ke, isimo sesistimu sincane kakhulu, nge-oda le-4 GB, futhi sicabangela kuphela iqiniso lokuthi othile okwamanje ungumnikazi wezinhlamvu zemali. Ivolumu yale datha nayo iyanda ngokuhamba kwesikhathi, kodwa ngenani eliphansi kakhulu futhi ngezinye izikhathi ivame ukwehla (bona i-CDPV).

Π›Ρ‘Π³ΠΊΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ (SPV) ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ бСзопасности Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ минимального состояния (UTXO-set), ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

I-UTXO ne-UTXO-set

I-UTXO (Okukhiphayo Kokwenziwayo Okungasetshenzisiwe) okuphumayo kokwenziwe okungakasetshenziswa, indawo yokugcina yohambo lwe-Satoshi ngayinye edluliselwe kumisebenzi. Okuphumayo okungasetshenzisiwe kuba okokufaka kwemisebenzi emisha futhi ngaleyo ndlela kusetshenziswe (kuchithwe) futhi kukhishwe kusethi ye-UTXO.

Ama-UTXO amasha ahlala enziwa ngokuthengiselana:

  • ukuthengiselana kwe-coinbase ngaphandle kokufaka: dala ama-UTXO amasha lapho abavukuzi bekhipha izinhlamvu zemali
  • okwenziwa njalo: dala ama-UTXO amasha ngenkathi usebenzisa isethi ethile yama-UTXO akhona

ΠŸΡ€ΠΎΡ†Π΅ΡΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с UTXO:
I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Izikhwama zibala inani lezinhlamvu zemali ezitholakalayo ukuze zisetshenziswe (ibhalansi) ngokusekelwe enanini le-UTXO elitholakala kulesi sikhwama ukuze lisetshenziswe.

I-validator nodi ngayinye, ukuvimbela imizamo yokuchitha kabili imali, kufanele igade isethi всСх UTXO uma ubheka ngamunye ukuthengiselana ngamunye vimba.

I-node kufanele ibe nengqondo:

  • Izengezo ku-UTXO-set
  • Ukususwa ku-UTXO-set
  • Ihlola ubukhona be-UTXO eyodwa kusethi

Kunezindlela zokunciphisa izimfuneko zolwazi olugciniwe mayelana nesethi, kuyilapho ugcina ikhono lokwengeza nokukhipha izakhi, hlola futhi ufakazele ukuba khona kwesici kusethi kusetshenziswa. i-cryptographic accumulators.

Amabhethri e-UTXO

Umqondo wokusebenzisa amabhethri ukugcina ama-UTXO amaningi kwaxoxwa ngakho phambilini.

I-UTXO-set yakhelwe empukaneni, ngesikhathi sokukhishwa kwe-block yokuqala (IBD), egcinwe ngokugcwele futhi unomphela, kuyilapho okuqukethwe kwayo kushintsha ngemva kokucubungula ukuthengiselana okuvela ku-block entsha nelungile yenethiwekhi. Le nqubo idinga ukulanda cishe u-200 GB wedatha yokuvimba nokuqinisekisa amakhulu ezigidi zamasiginesha edijithali. Ngemuva kokuthi inqubo ye-IBD isiqediwe, okubalulekile ukuthi i-UTXO-set izothatha cishe i-4 GB.

Kodwa-ke, ngama-accumulators, imithetho yokuvumelana kwezimali iyancipha ekuqinisekiseni nasekukhiqizeni ubufakazi be-cryptographic, futhi umthwalo wokulandelela izimali ezitholakalayo ushintshelwa kumnikazi walezo zimali, ohlinzeka ngobufakazi bokuthi zikhona kanye nobunikazi bazo.

I-accumulator ingabizwa ngokumelela okuhlangene kwesethi. Usayizi wesethulo esigciniwe kufanele sibe njalo I-Utreexo: icindezela i-UTXO Bitcoin eminingi, noma andise kancane kancane ngokuphathelene nekhadinali yesethi kanye nosayizi we-elementi ngokwayo, isibonelo I-Utreexo: icindezela i-UTXO Bitcoin eminingi, lapho u-n kuyikhadinali yesethi egciniwe.

ΠŸΡ€ΠΈ этом аккумулятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ элСмСнта Π² мноТСство (inclusion proof) ΠΈ Π΄Π°Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ эффСктивно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ.

Ibhethri libizwa inamandla uma ikuvumela ukuthi wengeze izakhi futhi ususe izakhi kusethi.

Isibonelo sebhethri elinjalo kungaba I-accumulator ye-RSA ephakanyiswe ngu-Boneh, Bunz, Fisch ngo-December 2018. I-accumulator enjalo inosayizi ongashintshi wokumelela okugciniwe, kodwa idinga ubukhona imfihlo eyabiwe (ukusetha okuthenjiwe). Le mfuneko iphikisana nokusetshenziswa kwe-accumulator enjalo yamanethiwekhi angathembeki njenge-Bitcoin, njengoba ukuvuza kwedatha ngesikhathi sokukhiqiza okuyimfihlo kungavumela abahlaseli ukuthi benze ubufakazi obungamanga bokuba khona kwe-UTXO, ama-node akhohlisayo nge-UTXO-set esekelwe ku-accumulator enjalo.

Utreexo

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ Thaddeus Dryja конструкция Utreexo позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ inamandla ibhethri ngaphandle ukusetha okuthembekile.

Utreexo прСдставляСт собою лСс ΠΈΠ· ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Izihlahla ze-Merkle ΠΈ являСтся Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅ΠΉ, прСдставлСнных Π² Ama-accumulators asynchronous asebenzayo we-pki esabalalisiwe, ingeza ikhono lokususa izakhi kusethi.

ЛогичСская структура аккумулятора

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ аккумулятора располоТСны Π² Π²ΠΈΠ΄Π΅ лСса ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π². Π”Π΅Ρ€Π΅Π²ΡŒΡ упорядочСны ΠΏΠΎ высотС. Π”Π°Π½Π½ΠΎΠ΅ прСдставлСниС Π²Ρ‹Π±Ρ€Π°Π½ΠΎ ΠΊΠ°ΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ наглядноС ΠΈ позволяСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слияниС Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π² Ρ…ΠΎΠ΄Π΅ провСдСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ аккумулятором.

Umbhali uphawula ukuthi njengoba zonke izihlahla ezisehlathini zilungile, ukuphakama kwazo kuboniswa njengamandla amabili, njengoba nje noma iyiphi inombolo yemvelo ingamelwa njengesamba samandla amabili. Ngakho-ke, noma yiliphi iqoqo lamaqabunga lingahlanganiswa libe yizihlahla kanambambili, futhi kuzo zonke izimo, ukwengeza isici esisha kudinga ulwazi kuphela mayelana nezimpande zezihlahla ezigciniwe.

Ngakho-ke, ukumelwa okugciniwe kwe-accumulator ye-Utreexo kuwuhlu lwamanodi ezimpande (impande ye-Merkle), hhayi lonke ihlathi lezihlahla.

Ake simele uhlu lwezimpande njenge Vec<Option<Hash>>. Uhlobo lokuzikhethela Option<Hash> kubonisa ukuthi ingxenye yempande kungenzeka ingekho, okusho ukuthi asikho isihlahla esinobude obufanele ku-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],
        }
    }
}

Ukwengeza izakhi

Okokuqala, ake sichaze umsebenzi parent(), ebona inodi yomzali yezakhi ezimbili ezinikeziwe.

parent() umsebenzi

Njengoba sisebenzisa izihlahla ze-Merkle, umzali wenodi ngayinye kwamabili uyinodi eyodwa egcina i-hashi yokuhlangana kwama-hashe wamanodi ezingane:

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[..])
}

Umbhali uphawula ukuthi ukuvimbela ukuhlaselwa okuchazwe nguCharles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, noSebastien Zimmer e.
Ukuhlaselwa kwe-preimage kwesibili emisebenzini ye-hash ehlanganisiwe, ngaphezu kwama-hashes amabili, ukuphakama ngaphakathi kwesihlahla kufanele futhi kwengezwe ekuhlanganiseni.

Π’ Ρ…ΠΎΠ΄Π΅ добавлСния элСмСнтов Π² аккумулятор, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Π΅ элСмСнты ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹. БлСдуя ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ измСнСния ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… элСмСнтов для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ добавляСмого элСмСнта, ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ наличия этих элСмСнтов.

Landelela izinguquko njengoba uzengeza

Ukulandelela izinguquko ezenziwe, masimemezele isakhiwo Update, ezogcina idatha mayelana nezinguquko zenodi.

#[derive(Debug)]
pub struct Update<'a> {
    pub utreexo: &'a mut Utreexo,
    // ProofStep Ρ…Ρ€Π°Π½ΠΈΡ‚ "сосСда" элСмСнта ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
    pub updated: HashMap<Hash, ProofStep>,
}

Для добавлСния элСмСнта Π² аккумулятор, Π½ΡƒΠΆΠ½ΠΎ:

  • Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ массив ΠΊΠΎΡ€Π·ΠΈΠ½ ΠΊΠΎΡ€Π½Π΅Π²Ρ‹Ρ… элСмСнтов new_roots bese ubeka izakhi zempande ezikhona lapho, eyodwa ngebhakede ngalinye:

Ikhodi

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);
}

  • Yengeza ama-elementi azokwengezwa (amalungu afanayo insertions) enqoleni yokuqala new_roots[0]:

I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Ikhodi

new_roots[0].extend_from_slice(insertions);

  • Hlanganisa izinto ezengezwe kubhasikidi wokuqala nezinye:
    • Kuwo wonke amakalishi anezinto ezingaphezu kweyodwa:
      1. Thatha izakhi ezimbili kusukela ekupheleni kubhasikidi, bala umzali wabo, susa izakhi zombili
      2. Engeza umzali obaliwe enqoleni elandelayo

I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Ikhodi

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 });
    }
}

  • Hambisa izakhi zezimpande zisuka emigqonyeni ziye kuhlelo lwe-accumulator oluwumphumela

Ikhodi

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]);
    }
}

Ukudala ubufakazi bezinto ezengeziwe

Ubufakazi bokufakwa kweseli ebhethrini (Proof) izosebenza njengeMerkle Path, ehlanganisa iketango ProofStep. Uma indlela ingayi ndawo, khona-ke ubufakazi abulungile.

/// Π•Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ шаг Π½Π° ΠΏΡƒΡ‚ΠΈ ΠΊ элСмСнту Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠœΠ΅Ρ€ΠΊΠ»Π°.
#[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,
}

Ukusebenzisa ulwazi olutholwe ngaphambilini lapho wengeza i-elementi (isakhiwo Update), ungakha ubufakazi bokuthi into ethile yengeziwe ebhethrini. Ukwenza lokhu, sidlula kuthebula lezinguquko ezenziwe futhi sengeza isinyathelo ngasinye endleleni ka-Merkle, ezosebenza njengobufakazi:

Ikhodi

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
    }
}

Inqubo yokudala ubufakazi

I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Ihlola ubufakazi bento ethile

Ukuhlola ubufakazi bokufakwa kwe-elementi kubikela ekulandeleni indlela ye-Merkle kuze kube kuholela entweni ekhona yempande:

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, &current_parent)
            } else {
                parent(&current_parent, &s.hash)
            };
        }

        current_parent == expected
    } else {
        false
    }
}

Ngokubukeka:

Inqubo yokuhlola ubufakazi buka-A

I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Ikhipha izinto

Ukukhipha iseli ebhethrini, kufanele unikeze ubufakazi obusebenzayo bokuthi iseli likhona. Ngokusebenzisa idatha evela ebufakazini, kungenzeka ukubala izici ezintsha zezimpande ze-accumulator lapho ubufakazi obunikeziwe bungeke busaba iqiniso.

I-algorithm imi kanjena:

  1. Njengokwengeza, sihlela isethi yamabhasikidi angenalutho ahambisana nezihlahla ze-Merkle ezinobude obulingana namandla amabili asuka kunkomba kabhasikidi.
  2. Sifaka izakhi ezivela ezinyathelweni zendlela ye-Merkle kubhasikidi; inkomba yebhasikidi ilingana nenani lesinyathelo samanje
  3. УдаляСм ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ элСмСнт, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΏΡƒΡ‚ΡŒ ΠΈΠ· Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°
  4. Njengokwengeza, sibala izakhi zezimpande ezintsha ngokuhlanganisa izakhi ukusuka kubhasikidi ngamabili bese sihambisa umphumela wenyunyana siwuyise kubhasikidi olandelayo.

Ikhodi

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;
    }
}

Inqubo yokususa isici "A":
I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Ukuhlanganiswa kunethiwekhi ekhona

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ аккумулятор, ΡƒΠ·Π»Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ использования Π‘Π” для хранСния всСх UTXO, сохраняя ΠΏΡ€ΠΈ этом Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ UTXO-set. Однако Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°ΠΌΠΈ.

Ake sibize i-validator node esebenzisa i-accumulator ye-UTXO kuhlangene (i-compact-state node), kanye ne-validator ngaphandle kwe-accumulator ephelele (i-node ephelele). Ukuba khona kwamakilasi amabili ama-node kudala inkinga yokuwahlanganisa kunethiwekhi eyodwa, ngoba ama-compact nodes adinga ubufakazi bokuthi kukhona ama-UTXO, asetshenziselwa ukuthengiselana, kuyilapho ama-node agcwele engenzi. Uma wonke ama-node enethiwekhi engashintshi ngesikhathi esisodwa futhi ngendlela ehlelekile ekusebenziseni i-Utreexo, khona-ke ama-compact nodes azosala futhi ngeke akwazi ukusebenza kunethiwekhi ye-Bitcoin.

Ukuxazulula inkinga yokuhlanganisa ama-compact node kunethiwekhi, kuhlongozwa ukwethula iklasi elengeziwe lama-node - amabhuloho. Indawo yebhuloho iyinodi ephelele ephinde igcine ibhethri le-Utreexo kanye nobufakazi bamandla всСх I-UTXO evela ku-UTXO-set. Amabhuloho abala ama-hashe amasha futhi abuyekeze i-accumulator nobufakazi njengoba amabhulokhi amasha okuthenga efika. Ukugcina nokuvuselela i-accumulator nobufakazi akubeki umthwalo owengeziwe wokubala kumanodi anjalo. Amabhuloho adela isikhala sediski: isidingo sokugcina izinto zihlelekile I-Utreexo: icindezela i-UTXO Bitcoin eminingi Ρ…Π΅ΡˆΠ΅ΠΉ, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с I-Utreexo: icindezela i-UTXO Bitcoin eminingi ama-hashes ama-compact nodes, lapho u-n engamandla esethi ye-UTXO.

Isakhiwo senethiwekhi

I-Utreexo: icindezela i-UTXO Bitcoin eminingi

Amabhuloho enza kube nokwenzeka ukwengeza kancane kancane ama-compact nodes kunethiwekhi ngaphandle kokushintsha isofthiwe yama-node akhona. Ama-node agcwele asebenza njengakuqala, asabalalisa ukuthengiselana namabhulokhi phakathi kwawo. Ama-Bridge node angama-node agcwele agcina futhi idatha yebhethri ye-Utreexo kanye nesethi yobufakazi bokufakwa kwayo всСх UTXO okwamanje. I-node yebhuloho ayizikhangisi kanjalo, izenza i-node egcwele yawo wonke ama-node agcwele kanye ne-compact node yawo wonke ahlangene. Nakuba amabhuloho exhumanisa amanethiwekhi womabili ndawonye, ​​empeleni adinga kuphela ukuwaxhuma endaweni eyodwa: ukusuka kuma-node akhona agcwele kuya kuma-compact node. Lokhu kungenzeka ngoba ifomethi yokuthengiselana ayidingi ukushintshwa, futhi ubufakazi be-UTXO bama-compact node bungalahlwa, ngakho noma iyiphi i-compact node ingasakaza ngokufanayo ukuthengiselana kubo bonke abahlanganyeli benethiwekhi ngaphandle kokubamba iqhaza kwamanodi ebhuloho.

isiphetho

Sibheke ibhethri le-Utreexo futhi sasebenzisa i-prototype yayo ku-Rust. Sibheke ukwakheka kwenethiwekhi okuzovumela ukuhlanganiswa kwamanodi asekelwe kubhethri. Inzuzo yokubamba okuhlangene ubukhulu bedatha egciniwe, okuncike nge-logarithmically emandleni esethi ye-UTXOs, okunciphisa kakhulu izidingo zesikhala sediski nokusebenza kokugcinwa kwamanode anjalo. Ububi ubuningi bethrafikhi ye-node eyengeziwe yokudlulisa ubufakazi, kodwa amasu okuhlanganisa ubufakazi (lapho ubufakazi obubodwa bufakazela ukuba khona kwezinto ezimbalwa) kanye nokugcinwa kwesikhashana kungasiza ukugcina ithrafikhi ingaphakathi kwemikhawulo eyamukelekayo.

izithenjwa:

Source: www.habr.com

Engeza amazwana