Utreexo: kumanikidza akawanda UTXO Bitcoin

Utreexo: kumanikidza akawanda UTXO Bitcoin

Hei Habr!

MuBitcoin network, node dzese, kuburikidza nekubvumirana, dzinobvumirana pane seti yeUTXOs: ingani mari inowanikwa yekushandisa, kuna ani chaizvo, uye pasi pemamiriro api. Iyo UTXO seti ndiyo yakaderera seti yedata inodiwa kune validator node, pasina iyo iyo node haizokwanise kuonesa kutendeseka kweanouya transaction uye mabhuroki ane iwo.

Panyaya iyi, kuedza kuri kuitwa nenzira dzese dzinogoneka kuderedza inomiririra yakachengetwa yeiyi seti, kuimanikidza pasina kurasikirwa nevimbiso yekuchengetedza. Iyo diki vhoriyamu ye data yakachengetwa, iyo yakaderera iyo dhisiki nzvimbo inodiwa yeiyo validator node, iyo inoita kuti kuvhura iyo validator node yakachipa, inobvumidza iwe kuwedzera network uye nekudaro kuwedzera kugadzikana kwetiweki.

Mune ino positi tichaisa Rust prototype yechikumbiro chazvino kubva kune mumwe-munyori Mheni Network Pepa, Thaddeus Dryja - Utreexo: ane simba hash-based accumulator yakagadziridzwa yeBitcoin UTXO set, iyo inobvumira kuderedza dhisiki nzvimbo zvinodiwa kune validator node.

Dambudziko nderei?

Rimwe rematambudziko eBitcoin risingaperi rave riri scalability. Pfungwa ye "bhangi rako wega" inoda kuti vatori vechikamu network vachengete marekodhi emari yese iripo yekushandisa. MuBitcoin, mari iripo inotaridzwa seti yezvisina kushandiswa - a UTXO-set. Kunyangwe iyi isiri yakanyanya kumiririra inomiririra, inobatsira maererano nekuita kwekuita pamusoro peinomiririra iyo yega yega "chikwama" ine "chiyero" seyakasiyana yekupinda, uye zvakare inowedzera kuvanzika (semuenzaniso. CoinJoin).

Zvakakosha kusiyanisa pakati penhoroondo yekutengeserana (inonzi blockchain) uye mamiriro ezvino ehurongwa. Bitcoin transaction history parizvino inotora 200 GB ye disk space, uye inoramba ichikura. Nekudaro, iyo sisitimu mamiriro idiki zvakanyanya, pahurongwa hwe4 GB, uye inongofunga nezve chokwadi chekuti mumwe munhu parizvino ane mari. Huwandu hwe data iyi hunowedzerawo nekufamba kwenguva, asi pamwero wakaderera uye dzimwe nguva unotoita kudzikira (ona CDPV).

Vatengi vakareruka (SPVs) vatengesi vekuchengetedza vimbiso yekukwanisa kuchengeta hapana hushoma mamiriro (UTXO-set) kunze kwemakiyi akavanzika.

UTXO uye UTXO-set

UTXO (Unspent Transaction Output) ndiyo isina kushandiswa transaction yakabuda, magumo erwendo rweSatoshi yega yega inotamiswa mukutengesa. Zvisina kushandiswa zvinobuda zvinova zvekushandisa zvezvitsva zvekutengesa uye nekudaro zvinoshandiswa (kushandisa) uye kubviswa kubva kuUTXO-set.

New UTXOs inogara yakagadzirwa nekutengeserana:

  • coinbase transactions pasina zvinopinza: gadzira maUTXO matsva kana vacheri vachiburitsa mari
  • kutengeserana nguva dzose: gadzira maUTXO matsva uchipedza imwe seti yeUTXO iripo

Maitiro ekushanda neUTXO:
Utreexo: kumanikidza akawanda UTXO Bitcoin

Mawallet anoverenga huwandu hwemari iripo yekushandisa (yasara) zvichienderana nehuwandu hweUTXO huripo kune ichi chikwama chekushandisa.

Imwe neimwe validator node, kudzivirira kaviri kushandisa mari kuedza, inofanirwa kutarisa seti всСх UTXO paunotarisa imwe neimwe kutengeserana cheumwe neumwe block.

Iyo node inofanirwa kuve ine logic:

  • Kuwedzera kune UTXO-set
  • Deletions kubva kuUTXO-set
  • Kutarisa kuvepo kweiyo UTXO museti

Pane nzira dzekudzikisa zvinodiwa zveruzivo rwakachengetwa nezve seti, uchichengetedza kugona kwekuwedzera nekubvisa zvinhu, tarisa uye kuratidza kuvepo kwechinhu museti uchishandisa. cryptographic accumulators.

Mabhatiri eUTXO

Pfungwa yekushandisa mabhatiri kuchengetedza akawanda UTXOs yakakurukurwa pakutanga.

Iyo UTXO-set yakavakirwa pane nhunzi, panguva yekutanga block download (IBD), yakachengetwa yakazara uye nekusingaperi, nepo zvirimo zvichichinja mushure mekugadzirisa kutengeserana kubva kune yega yega nyowani uye chaiyo block yetiweki. Kuita uku kunoda kudhawunirodha ingangoita 200 GB yeblock data uye kuona mazana emamiriyoni emasiginecha edhijitari. Mushure meiyo IBD maitiro apera, iyo yepasi ndeyekuti iyo UTXO-set ichagara inosvika 4 GB.

Zvisinei, nevaunganidzi, mitemo yekubvumirana kwemari inoderedzwa kusvika pakusimbiswa uye chizvarwa chekrisptographic proofs, uye mutoro wekutevera mari iripo unotamisirwa kumuridzi wemari iyoyo, uyo anopa humbowo hwekuvapo kwavo uye varidzi.

An accumulator inogona kunzi compact inomiririra seti. Saizi yeyakachengetwa inomiririra inofanira kunge isingachinji Utreexo: kumanikidza akawanda UTXO Bitcoin, kana kuwedzera sublinearly maererano nekadhiiniti yeti uye saizi yechinhu pachayo, semuenzaniso. Utreexo: kumanikidza akawanda UTXO Bitcoin, uko n ndiyo kadhidhi yeyakachengetwa seti.

Muchiitiko ichi, accumulator inofanirwa kubvumira kuburitsa humbowo hwekuiswa kwechinhu museti (kusanganisira humbowo) uye kuita kuti zvikwanise kunyatso simbisa humbowo uhu.

Bhatiri rinonzi simba kana ichikubvumidza kuti uwedzere zvinhu uye kubvisa zvinhu kubva pane seti.

Muenzaniso webhatiri rakadaro ungave RSA accumulator yakakurudzirwa naBoneh, Bunz, Fisch muna Zvita 2018. Iyo accumulator yakadaro ine saizi yenguva dzose yekumiririra yakachengetwa, asi inoda kuvepo zvakagovaniswa zvakavanzika (yakavimbika setup). Izvi zvinodikanwa zvinopesana nekushandiswa kweiyo accumulator yeakavimbika network seBitcoin, sezvo kuburitswa kwedata panguva yechizvarwa chakavanzika kunogona kubvumira vanorwisa kuti vagadzire humbowo hwenhema hwekuvapo kweUTXO, inonyengera node neUTXO-set yakavakirwa pane yakadaro accumulator.

Utreexo

Iyo Utreexo dhizaini yakakurudzirwa naThaddeus Dryja inoita kuti zvikwanise kugadzira simba аккумулятор kunze yakavimbika-setup.

Utreexo isango remabhinari akakwana Merkle Trees uye kuvandudzwa kwemazano anoratidzwa mukati Inoshanda asynchronous accumulators yekugovera pki, kuwedzera kukwanisa kubvisa zvinhu kubva pane imwe seti.

Battery Logical Structure

Masero ebheteri akarongwa musango remiti yakanaka yemabhinari. Miti inorongwa nekukwirira. Iyi inomiririra yakasarudzwa seyakanyanya kuona uye inokubvumira kuti uone kubatanidzwa kwemiti panguva yekushanda pabhatiri.

Munyori anocherechedza kuti sezvo miti yose iri musango yakanaka, kureba kwayo kunoratidzwa sesimba rezviviri, sezvinongoita nhamba ipi zvayo yechisikigo inogona kumiririrwa sehuwandu hwemasimba maviri. Saizvozvo, chero seti yemashizha inogona kuiswa mumabhinari miti, uye mune zvese zviitiko, kuwedzera chinhu chitsva kunoda ruzivo chete nezvemidzi yemiti yakachengetwa.

Saka, iyo yakachengetwa inomiririra yeUtreexo accumulator rondedzero yemidzi nodes (Merkle mudzi), uye kwete sango rose remiti.

Ngatimirirei rondedzero yemidzi yezvinhu se Vec<Option<Hash>>. Optional type Option<Hash> inoratidza kuti mudzi wemudzi unogona kushaikwa, zvinoreva kuti hapana muti une hurefu hwakakodzera mune 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],
        }
    }
}

Kuwedzera zvinhu

Kutanga, ngatitsanangure basa racho parent(), iyo inoziva node yemubereki yezvinhu zviviri zvakapihwa.

mubereki () basa

Sezvo isu tiri kushandisa miti yeMerkle, mubereki weimwe neimwe yemanodhi mbiri imwe node inochengeta hashi yekubatanidzwa kwehashi dzemwana node:

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

Munyori anoti kudzivirira kurwiswa kwakatsanangurwa naCharles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, uye Sebastien Zimmer mu.
Chechipiri preimage kurwisa pane dithered hash mabasa, kuwedzera kune maviri hashes, kureba mukati memuti kunofanirawo kuwedzerwa kune concatenation.

Sezvo iwe uchiwedzera zvinhu kune accumulator, iwe unofanirwa kutarisa kuti ndeapi midzi midzi inoshandurwa. Nekutevera nzira yekushandura midzi yechinhu chimwe nechimwe chaunowedzera, iwe unogona gare gare kuvaka humbowo hwekuvapo kwezvinhu izvi.

Tarisa shanduko paunodziwedzera

Kutevera shanduko dzakaitwa, ngatizivise chimiro Update, iyo inochengetedza data nezve node shanduko.

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

Kuti uwedzere chinhu kubhatiri, unoda:

  • Gadzira mutsara wematengu emidzi zvinhu new_roots uye isa iyo iripo midzi zvinhu ipapo, imwe kune yega bhaketi:

kodhi

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

  • Wedzera zvinhu zvichawedzerwa (array insertions) kungoro yekutanga new_roots[0]:

Utreexo: kumanikidza akawanda UTXO Bitcoin

kodhi

new_roots[0].extend_from_slice(insertions);

  • Unganidza zvinhu zvakawedzerwa kubhasiki rekutanga nezvimwe zvese:
    • Pangoro dzese dzine zvinhu zvinopfuura chimwe:
      1. Tora zvinhu zviviri kubva kumagumo ebhasiketi, verenga mubereki wavo, bvisa zvese zviri zviviri
      2. Wedzera mubereki akaverengerwa kungoro inotevera

Utreexo: kumanikidza akawanda UTXO Bitcoin

kodhi

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

  • Fambisa midzi kubva kumabhini kuenda kune inoguma accumulator array

kodhi

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

Kugadzira humbowo hwezvinhu zvakawedzerwa

Uchapupu hwekuiswa kwesero mubhatiri (Proof) ichashanda seMerkle Path, ine cheni ProofStep. Kana nzira yacho isina kwainoenda, ipapo humbowo hahuna kururama.

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

Kushandisa ruzivo rwakawanikwa pakutanga paunenge uchiwedzera chinhu (chimiro Update), unogona kugadzira humbowo hwekuti chinhu chawedzerwa kubhatiri. Kuti tiite izvi, tinopfuura nepatafura yekuchinja kwakaitwa uye towedzera nhanho imwe neimwe munzira yaMerkle, iyo inozoshanda sehumbowo:

kodhi

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

Nzira yekugadzira humbowo

Utreexo: kumanikidza akawanda UTXO Bitcoin

Kuongorora humbowo hwechinhu

Kutarisa humbowo hwekusanganisirwa kwechinhu kunowira pasi pakutevera nzira yeMerkle kudzamara yatungamira kune iripo mudzi chinhu:

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

Zvinoonekwa:

Maitiro ekutarisa humbowo hweA

Utreexo: kumanikidza akawanda UTXO Bitcoin

Kubvisa zvinhu

Kuti ubvise sero kubva mubhatiri, unofanirwa kupa humbowo hunoshanda hwekuti sero riripo. Uchishandisa iyo data kubva kune humbowo, zvinokwanisika kuverenga mitsva midzi yeaccumulator iyo humbowo hwakapihwa huchave husiri hwechokwadi.

Iyo algorithm iri seinotevera:

  1. Sekuwedzera, isu tinoronga seti yemabhasikiti asina chinhu anoenderana nemiti yeMerkle ine hurefu hwakaenzana nesimba remaviri kubva kubhasiketi index.
  2. Isu tinoisa zvinhu kubva pamatanho enzira yeMerkle mumabhasikiti; indekisi yebhasiketi yakaenzana nenhamba yedanho razvino
  3. Isu tinobvisa iyo midzi chinhu iyo nzira kubva kune humbowo inotungamira
  4. Sekuwedzera, isu tinoverenga midzi mitsva nekubatanidza zvinhu kubva mumabhasikiti ari maviri maviri uye kufambisa mhedzisiro yemubatanidzwa kune inotevera dengu.

kodhi

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

Maitiro ekubvisa chinhu "A":
Utreexo: kumanikidza akawanda UTXO Bitcoin

Kubatanidzwa mune network iripo

Uchishandisa iyo yakarongwa accumulator, node dzinogona kudzivirira kushandisa DB kuchengetedza maUTXO ese achiri kukwanisa kushandura UTXO-set. Zvisinei, dambudziko rekushanda nehumbowo rinomuka.

Ngatishevedze iyo validator node inoshandisa iyo UTXO accumulator compact (compact-state node), uye iyo validator isina accumulator iri zadzisa (node ​​yakazara). Kuvapo kwemakirasi maviri emanodhi kunogadzira dambudziko rekuvabatanidza mune imwechete network, sezvo compact node inoda humbowo hwekuvapo kweUTXOs, iyo inoshandiswa mukutengeserana, nepo node yakazara isingaite. Kana ese mambure node zvikasadaro panguva imwe chete uye nenzira yakarongeka chinja kushandisa Utreexo, ipapo compact nodes achasara kumashure uye havazokwanisi kushanda paBitcoin network.

Kugadzirisa dambudziko rekubatanidza compact node mune network, zvinokurudzirwa kuunza imwe kirasi yemanodhi - mabhiriji. Bhiriji node inzvimbo yakakwana inochengetawo Utreexo bhatiri uye simba-pachiratidzo che всСх UTXO kubva kuUTXO-set. Mabhiriji anoverenga hashes matsva uye anovandudza accumulator uye humbowo sezvo mabhuroko matsva ekutengeserana anosvika. Kuchengetedza uye kugadzirisa iyo accumulator uye humbowo hauisi yakawedzera computational mutoro pane dzakadaro node. Mabhiriji anobayira dhisiki nzvimbo: inoda kuchengeta zvinhu zvakarongeka Utreexo: kumanikidza akawanda UTXO Bitcoin hashes, zvichienzaniswa ne Utreexo: kumanikidza akawanda UTXO Bitcoin hashes ye compact node, uko n isimba reiyo UTXO set.

Network architecture

Utreexo: kumanikidza akawanda UTXO Bitcoin

Mabhiriji anoita kuti zvikwanisike kuwedzera zvishoma nezvishoma compact node kune network pasina kushandura software yemanodhi aripo. Manodhi akazara anoshanda sekare, achigovera matransaction nemabhuroko pakati pavo. Bridge node izere node dzinowedzera kuchengetedza Utreexo bhatiri data uye seti yekusanganisirwa humbowo hwe всСх UTXO ikozvino. Iyo bhiriji node haizvishambadzire sekudaro, ichinyepedzera kunge izere node kune ese akazara node uye compact node kune ese akabatana. Kunyangwe mabhiriji achibatanidza manetwork ese pamwechete, anotoda chete kuabatanidza munzira imwe: kubva kune aripo akazara node kuenda kune compact node. Izvi zvinogoneka nekuti mafomati ekutengeserana haadi kuchinjwa, uye humbowo hweUTXO hwema compact node hunogona kuraswa, saka chero compact node inogonawo kutepfenyura kutengeserana kune vese vanotora network pasina kutora chikamu kwebhiriji node.

mhedziso

Takatarisa bhatiri reUtreexo uye takashandisa prototype yayo muRust. Isu takatarisa kune network architecture iyo inobvumira kubatanidzwa kwebhatiri-based node. Kubatsira kwe compact catches hukuru hwe data yakachengetwa, iyo inoenderana nelogarithmically pane simba reseti yeUTXOs, iyo inoderedza zvikuru zvinodiwa zve disk space uye kuchengetedza kushanda kwenode dzakadaro. Chakashata ndiyo yekuwedzera node traffic yekutumira humbowo, asi humbowo nzira dzekuunganidza (apo humbowo humwe hunoratidza kuvepo kwezvinhu zvakati wandei) uye caching inogona kubatsira kuchengetedza traffic mukati memiganhu inogamuchirwa.

nezvakanyorwa:

Source: www.habr.com

Voeg