Utreexo: kukakamiza ambiri UTXO Bitcoin

Utreexo: kukakamiza ambiri UTXO Bitcoin

Pa Habr!

Mu maukonde a Bitcoin, ma node onse, kudzera mu mgwirizano, amavomereza pa gulu la UTXOs: ndi ndalama zingati zomwe zilipo kuti mugwiritse ntchito, kwa ndani kwenikweni, komanso pansi pa zikhalidwe ziti. Seti ya UTXO ndi chiwerengero chochepa cha deta chomwe chimafunika kuti chikhale chovomerezeka cha node, popanda zomwe nodeyo siidzatha kutsimikizira kutsimikizika kwa zochitika zomwe zikubwera ndi midadada yomwe ili nawo.

Pachifukwa ichi, kuyesayesa kukuchitika m'njira iliyonse kuti muchepetse chiwonetsero chosungidwa cha seti iyi, kuti muyipondereze popanda kutaya zitsimikizo zachitetezo. Zing'onozing'ono voliyumu ya deta yosungidwa, kuchepetsa zofunikira za disk space za validator node, zomwe zimapangitsa kukhazikitsa node yovomerezeka yotsika mtengo, kumakupatsani mwayi wowonjezera maukonde ndikuwonjezera kukhazikika kwa intaneti.

Mu positi iyi tiyika chithunzi cha Dzimbiri chamalingaliro aposachedwa kuchokera kwa wolemba nawo Paper Network Lightning, Thaddeus Dryja - Utreexo: cholumikizira chokhazikika cha hashi chokometsedwa pa seti ya Bitcoin UTXO, zomwe zimalola kuchepetsa zofunikira za danga la disk kwa node za validator.

Vuto ndi chiyani?

Imodzi mwamavuto osatha a Bitcoin wakhala scalability. Lingaliro la "banki yanu" limafuna kuti otenga nawo mbali pamaneti azisunga zolemba zandalama zonse zomwe zilipo kuti zigwiritsidwe ntchito. Mu Bitcoin, ndalama zomwe zilipo zimawonetsedwa ngati zotuluka zosagwiritsidwa ntchito - UTXO-set. Ngakhale kuti ichi sichiri choyimira mwachidziwitso, ndi chopindulitsa pakuchita ntchito pa chithunzi chomwe "chikwama" chilichonse chimakhala ndi "balance" monga cholowera chosiyana, komanso chimawonjezera zinsinsi (mwachitsanzo. Ndalama Coin).

Ndikofunika kusiyanitsa pakati pa mbiri ya zochitika (zomwe zimatchedwa blockchain) ndi zomwe zikuchitika panopa. Mbiri ya Bitcoin transaction pakadali pano imatenga pafupifupi 200 GB ya disk space, ndipo ikupitiliza kukula. Komabe, dongosolo la dongosolo ndi laling'ono kwambiri, pa dongosolo la 4 GB, ndipo zimangoganizira kuti wina ali ndi ndalama. Kuchuluka kwa detayi kumawonjezekanso pakapita nthawi, koma pang'onopang'ono ndipo nthawi zina kumachepetsanso (onani CDPV).

Makasitomala opepuka (SPVs) amatsimikizira chitetezo cha malonda kuti athe kusunga malo osachepera (UTXO-set) kupatula makiyi achinsinsi.

UTXO ndi UTXO-set

UTXO (Unspent Transaction Output) ndiye chotulukapo chosagwiritsidwa ntchito, mapeto a ulendo wa Satoshi aliyense amasamutsidwa muzochita. Zotuluka zosagwiritsidwa ntchito zimakhala zolowetsa zamalonda atsopano ndipo zimathera (ndalama) ndikuchotsedwa ku UTXO-set.

Ma UTXO atsopano nthawi zonse amapangidwa ndi zochitika:

  • coinbase transactions popanda zolowetsa: pangani ma UTXO atsopano pomwe ochita migodi atulutsa ndalama
  • kuchita pafupipafupi: pangani ma UTXO atsopano pomwe mukugwiritsa ntchito ma UTXO omwe alipo

Njira yogwirira ntchito ndi UTXO:
Utreexo: kukakamiza ambiri UTXO Bitcoin

Ma wallet amawerengera kuchuluka kwa ndalama zomwe mungagwiritse ntchito (zotsala) kutengera kuchuluka kwa UTXO komwe kukupezeka pachikwamachi kuti muwononge.

Node iliyonse ya validator, kuti mupewe kuwononga ndalama kawiri, iyenera kuyang'anira zomwe zakhazikitsidwa всСх UTXO pofufuza aliyense zochita aliyense chipika.

Node iyenera kukhala ndi logic:

  • Zowonjezera ku UTXO-set
  • Zochotsa ku UTXO-set
  • Kuwona kukhalapo kwa UTXO imodzi mu seti

Pali njira zochepetsera zofunikira pazomwe zasungidwa pa seti, ndikusunga kuthekera kowonjezera ndi kuchotsa zinthu, fufuzani ndikutsimikizira kukhalapo kwa chinthu mu seti yogwiritsira ntchito. ma cryptographic accumulators.

Mabatire a UTXO

Lingaliro logwiritsa ntchito mabatire kusunga ma UTXO angapo zinakambidwa kale.

UTXO-set imamangidwa pa ntchentche, panthawi yotsitsa chipika choyamba (IBD), yosungidwa mokwanira komanso kosatha, pamene zomwe zili mkati mwake zimasintha pambuyo pokonza zochitika kuchokera ku chipika chilichonse chatsopano ndi cholondola cha intaneti. Izi zimafuna kutsitsa pafupifupi 200 GB ya data block ndikutsimikizira masaginecha mamiliyoni mazana ambiri. Pambuyo pa ndondomeko ya IBD, mfundo yaikulu ndi yakuti UTXO-set idzatenga pafupifupi 4 GB.

Komabe, ndi accumulators, malamulo a mgwirizano wa ndalama amachepetsedwa kuti atsimikizidwe ndi kubadwa kwa umboni wa cryptographic, ndipo mtolo wa kufufuza ndalama zomwe zilipo zimasinthidwa kwa mwiniwake wa ndalamazo, yemwe amapereka umboni wa kukhalapo kwawo ndi umwini.

An accumulator akhoza kutchedwa compact chifaniziro cha seti. Kukula kwa choyimira chosungidwa kuyenera kukhala kosasintha Utreexo: kukakamiza ambiri UTXO Bitcoin, kapena kuonjezera sublinearly polemekeza makadi a seti ndi kukula kwa chinthu chokha, mwachitsanzo Utreexo: kukakamiza ambiri UTXO Bitcoin, pomwe n ndi kardinali wa seti yosungidwa.

Pachifukwa ichi, accumulator ayenera kulola kuti apereke umboni wa kuphatikizidwa kwa chinthu mu seti (umboni wophatikizika) ndikupangitsa kuti zitheke kutsimikizira umboniwu.

Batire imatchedwa zazikulu ngati ikulolani kuti muwonjezere zinthu ndikuchotsa zinthu pagulu.

Chitsanzo cha batire yotereyi chingakhale RSA accumulator yoperekedwa ndi Boneh, Bunz, Fisch mu Disembala 2018. Zodzikongoletsera zotere zimakhala ndi kukula kosalekeza kwa chiwonetsero chosungidwa, koma chimafuna kukhalapo chinsinsi chogawana (kukhazikika kodalirika). Chofunikira ichi chimatsutsana ndi kugwiritsidwa ntchito kwa accumulator yotereyi kwa maukonde osadalirika monga Bitcoin, popeza kutayikira kwa data panthawi yachinsinsi kumatha kulola otsutsa kuti apange umboni wonyenga wa kukhalapo kwa UTXO, node zonyenga ndi UTXO-set zochokera ku accumulator yotere.

Utreexo

Kapangidwe ka Utreexo kopangidwa ndi Thaddeus Dryja kumapangitsa kuti apange zazikulu аккумулятор popanda kudalira-kukhazikitsa.

Utreexo ndi nkhalango ya binary yabwino Mitengo ya Merkle ndipo ndikukula kwa malingaliro omwe aperekedwa mu Ma asynchronous accumulators abwino a pki yogawidwa, kuwonjezera kuthekera kochotsa zinthu pagulu.

Battery Logical Kapangidwe kake

Maselo a batri amakonzedwa m'nkhalango ya mitengo yabwino ya binary. Mitengo imayendetsedwa ndi kutalika. Choyimira ichi chinasankhidwa kukhala chowoneka bwino kwambiri ndipo chimakulolani kuti muwonetsere kugwirizanitsa kwa mitengo panthawi ya ntchito pa batri.

Wolembayo akunena kuti popeza mitengo yonse ya m'nkhalangoyi ndi yabwino, kutalika kwake kumawonetsedwa ngati mphamvu ziwiri, monga momwe chiwerengero chilichonse chachilengedwe chikhoza kuimiridwa ngati chiΕ΅erengero cha mphamvu ziwiri. Chifukwa chake, masamba aliwonse amatha kugawidwa mumitengo yama binary, ndipo nthawi zonse, kuwonjezera chinthu chatsopano kumafuna chidziwitso kokha za mizu ya mitengo yosungidwa.

Chifukwa chake, chiwonetsero chosungidwa cha Utreexo accumulator ndi mndandanda wa node za mizu (muzu wa Merkle), osati nkhalango yonse ya mitengo.

Tiyeni tiyimire mndandanda wa mizu ngati Vec<Option<Hash>>. Zosankha mtundu Option<Hash> zimasonyeza kuti muzu chinthu mwina akusowa, kutanthauza kuti palibe mtengo ndi kutalika koyenera mu 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],
        }
    }
}

Kuwonjezera zinthu

Choyamba, tiyeni tifotokoze ntchito parent(), yomwe imazindikira mfundo ya makolo pazigawo ziwiri zoperekedwa.

parent () ntchito

Popeza tikugwiritsa ntchito mitengo ya Merkle, kholo la node iliyonse ndi mfundo imodzi yomwe imasunga hashi ya kuphatikizika kwa ma hashes a nodi za ana:

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

Wolembayo akunena kuti kupewa kuukira komwe Charles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, ndi Sebastien Zimmer mu
Kuwukira kwachiwiri kwazithunzi pazochita za dithered hashi, kuwonjezera pa ma hashes awiri, kutalika mkati mwa mtengo kuyeneranso kuwonjezeredwa ku concatenation.

Mukamawonjezera zinthu ku accumulator, muyenera kuyang'anira zomwe mizu imasinthidwa. Potsatira njira yosinthira mizu ya chinthu chilichonse chomwe mumawonjezera, mutha kupanga umboni wa kukhalapo kwa zinthu izi.

Tsatani zosintha pamene mukuziwonjezera

Kuti tilondole zosintha zomwe zachitika, tiyeni tilengeze kapangidwe kake Update, zomwe zidzasunga zambiri zokhudza kusintha kwa node.

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

Kuti muwonjezere chinthu ku batri, muyenera:

  • Pangani madengu angapo a mizu new_roots ndipo ikani mizu yomwe ilipo pamenepo, imodzi pachidebe chilichonse:

kachidindo

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

  • Onjezani zinthu zomwe zikuyenera kuwonjezeredwa (array insertions) kungolo yoyamba new_roots[0]:

Utreexo: kukakamiza ambiri UTXO Bitcoin

kachidindo

new_roots[0].extend_from_slice(insertions);

  • Gwirizanitsani zinthu zomwe zawonjezeredwa mudengu loyamba ndi zina zonse:
    • Pamangolo onse okhala ndi zinthu zopitilira chimodzi:
      1. Tengani zinthu ziwiri kumapeto kwa dengu, werengerani kholo lawo, chotsani zinthu zonse ziwiri
      2. Onjezani kholo lowerengeredwa kungolo yotsatira

Utreexo: kukakamiza ambiri UTXO Bitcoin

kachidindo

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

  • Chotsani mizu kuchokera ku nkhokwe kupita ku gulu la accumulator

kachidindo

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

Kupanga umboni wa zinthu zowonjezera

Umboni wakuphatikizidwa kwa cell mu batri (Proof) idzakhala ngati Njira ya Merkle, yokhala ndi unyolo ProofStep. Ngati njirayo sikupita kulikonse, ndiye kuti umboniwo ndi wolakwika.

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

Kugwiritsa ntchito zomwe zidapezeka kale powonjezera chinthu (mapangidwe Update), mutha kupanga umboni kuti chinthu chawonjezeredwa ku batri. Kuti tichite izi, timadutsa muzosintha zomwe zasinthidwa ndikuwonjezera sitepe iliyonse panjira ya Merkle, yomwe pambuyo pake idzakhala umboni:

kachidindo

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

Njira yopangira umboni

Utreexo: kukakamiza ambiri UTXO Bitcoin

Kuwona umboni wa chinthu

Kuyang'ana umboni wophatikizika wa chinthu kumagwera mpaka kutsatira njira ya Merkle mpaka kukafika ku mizu yomwe ilipo:

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

Zowoneka:

Njira yowonera umboni wa A

Utreexo: kukakamiza ambiri UTXO Bitcoin

Kuchotsa zinthu

Kuti muchotse selo mu batire, muyenera kupereka umboni womveka kuti seloyo ilipo. Pogwiritsa ntchito deta kuchokera ku umboni, ndizotheka kuwerengera mizu yatsopano ya accumulator yomwe umboni woperekedwawo sudzakhalanso woona.

Ma algorithm ndi awa:

  1. Monganso, timapanga madengu opanda kanthu ofanana ndi mitengo ya Merkle yokhala ndi kutalika kofanana ndi mphamvu ziwiri kuchokera pamndandanda wadengu.
  2. Timayika zinthu kuchokera pamasitepe a Merkle njira mu madengu; mndandanda wadengu ndi wofanana ndi chiwerengero cha sitepe yamakono
  3. Timachotsa muzu womwe njira yochokera ku umboni imatsogolera
  4. Monga ndikuwonjezera, timawerengera mizu yatsopano pophatikiza zinthu kuchokera ku madengu awiriawiri ndikusuntha zotsatira za mgwirizano kupita ku dengu lotsatira.

kachidindo

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

Njira yochotsera chinthu "A":
Utreexo: kukakamiza ambiri UTXO Bitcoin

Kuphatikiza mu netiweki yomwe ilipo

Pogwiritsa ntchito accumulator yomwe mukufuna, ma node amatha kupewa kugwiritsa ntchito DB kusunga ma UTXO onse ndikutha kusintha UTXO-set. Komabe, vuto logwira ntchito ndi umboni limakhalapo.

Tiyeni tiyimbe node yovomerezeka yomwe imagwiritsa ntchito cholumikizira cha UTXO compact (compact-state node), ndi validator popanda accumulator ndi wathunthu (node ​​yonse). Kukhalapo kwa magulu awiri a node kumabweretsa vuto lowaphatikiza mu intaneti imodzi, popeza ma compact node amafunikira umboni wa kukhalapo kwa UTXOs, zomwe zimagwiritsidwa ntchito pochita malonda, pamene node zonse sizitero. Ngati mfundo zonse maukonde musati imodzi ndi mogwirizana kusintha kusintha kwa ntchito Utreexo, ndiye mfundo yaying'ono adzasiyidwa ndipo sangathe ntchito pa maukonde Bitcoin.

Kuti athetse vuto la kuphatikiza ma compact node mu netiweki, akufunsidwa kuti akhazikitse gulu lina la node - milatho. Node ya mlatho ndi node yathunthu yomwe imasunganso batire ya Utreexo ndi umboni wamagetsi всСх UTXO kuchokera ku UTXO-set. Bridges amawerengera ma hashes atsopano ndikusintha cholimbikitsira ndi maumboni pomwe midadada yatsopano yosinthira ikufika. Kusunga ndi kukonzanso cholimbikitsira ndi maumboni sizimawonjezera katundu wowonjezera pama node otere. Milatho imapereka malo a disk: amafunika kusunga zinthu mwadongosolo Utreexo: kukakamiza ambiri UTXO Bitcoin hashes, poyerekeza ndi Utreexo: kukakamiza ambiri UTXO Bitcoin ma hashes a ma compact node, pomwe n ndi mphamvu ya seti ya UTXO.

Network zomangamanga

Utreexo: kukakamiza ambiri UTXO Bitcoin

Milatho imapangitsa kuti pang'onopang'ono kuwonjezera ma compact node pa intaneti popanda kusintha mapulogalamu a node omwe alipo. Ma node athunthu amagwira ntchito monga kale, akugawa zotuluka ndi midadada pakati pawo. Ma node a Bridge ndi ma node athunthu omwe amasunganso deta ya batri ya Utreexo ndi maumboni angapo ophatikizira всСх UTXO pakali pano. Node ya mlatho simadzilengeza yokha motere, imadziyesa ngati node yathunthu yamagulu onse athunthu ndi mfundo yophatikizika kwa onse ophatikizika. Ngakhale milatho imalumikiza maukonde onse awiri palimodzi, amangofunika kuwalumikiza mbali imodzi: kuchokera ku mfundo zonse zomwe zilipo mpaka zolumikizana. Izi ndizotheka chifukwa mawonekedwe amalonda safunikira kusinthidwa, ndipo maumboni a UTXO a ma compact node amatha kutayidwa, kotero kuti node iliyonse yolumikizana imatha kuwulutsanso zochitika kwa onse omwe akuchita nawo maukonde popanda kutenga nawo gawo pama node a mlatho.

Pomaliza

Tidayang'ana batire ya Utreexo ndikugwiritsa ntchito mawonekedwe ake ku Rust. Tidayang'ana mamangidwe a netiweki omwe angalole kuphatikiza ma node otengera batri. Ubwino wa nsomba zazing'ono ndi kukula kwa deta yosungidwa, yomwe imadalira logarithmically pa mphamvu ya seti ya UTXOs, yomwe imachepetsa kwambiri zofunikira za disk space ndi ntchito yosungiramo ma node oterowo. Choyipa chake ndi kuchuluka kwa njira zotumizira maumboni, koma njira zophatikizira umboni (pamene umboni umodzi utsimikizira kukhalapo kwa zinthu zingapo) ndi kusungirako kungathandize kuti magalimoto azikhala m'malire ovomerezeka.

powatsimikizira:

Source: www.habr.com

Kuwonjezera ndemanga