Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Ndewo, Habr!

Na netwọk Bitcoin, ọnụ ọgụgụ niile, site na nkwenye, kwenye na nhazi nke UTXO: ego ole dị maka imefu, onye kpọmkwem, na n'okpuru ọnọdụ ndị dị aṅaa. Ntọala UTXO bụ opekempe data achọrọ maka ọnụ ụzọ nkwado, na-enweghị nke ọnụ agaghị enwe ike ịchọpụta izi ezi nke azụmahịa na-abata na ngọngọ ndị nwere ha.

N'akụkụ a, a na-agba mbọ n'ụzọ ọ bụla o kwere mee iji belata ihe nnọchianya nke setịpụrụ a, iji mpikota onu na-enweghị atụfu nkwa nchekwa. Ọnụ ọgụgụ dị nta nke data echekwara, na-ebelata ohere disk chọrọ nke oghere validator, nke na-eme ka ịmepụta oghere nke ọma dị ọnụ ala, na-enye gị ohere ịgbasa netwọk ahụ wee si otú ahụ dịkwuo nkwụsi ike nke netwọk ahụ.

Na post a, anyị ga-ebipute ụdị nchara nke amụma na-adịbeghị anya sitere n'aka onye na-ede akwụkwọ Akwụkwọ ntanetị ọkụ, Thaddeus Dryja - Utreexo: ihe mkpokọ dabere na hash siri ike emebere maka ntọala Bitcoin UTXO, nke na-enye ohere ibelata ohere diski chọrọ maka oghere validator.

Gịnị ka ọ bụ?

Otu n'ime nsogbu Bitcoin perennial bụ scalability ya. Echiche nke "ụlọ akụ nke gị" chọrọ ndị sonyere netwọk ka ha debe ndekọ ego niile dị maka ojiji. Na Bitcoin, a na-egosipụta ego dịnụ dị ka ihe ntinye nke anaghị emefu - UTXO-set. Ọ bụ ezie na nke a abụghị ihe nnọchiteanya pụrụ iche nke nwere nghọta, ọ bara uru n'ihe gbasara arụmọrụ mmejuputa ya n'elu ihe nnọchiteanya nke "obere akpa" ọ bụla nwere "nguzozi" dị ka ntinye dị iche iche, ma na-agbakwụnyekwa nzuzo (dịka ọmụmaatụ. Udochukwu).

Ọ dị mkpa ịmata ọdịiche dị n'etiti akụkọ ihe mere eme nke azụmahịa (ihe a na-akpọ blockchain) na ọnọdụ nke usoro ugbu a. Akụkọ azụmahịa Bitcoin ugbu a na-ewe ihe dịka 200 GB nke ohere diski, ma na-aga n'ihu na-eto eto. Otú ọ dị, steeti usoro ahụ dị ntakịrị, na usoro nke 4 GB, ma na-eburu n'uche na mmadụ nwere ego ugbu a. Olu nke data a na-abawanye ka oge na-aga, mana na-eji nwayọ nwayọ na mgbe ụfọdụ ọbụna na-agbadata (lee CDPV).

Ndị ahịa ọkụ (SPV) na-ekwe nkwa nchekwa azụmaahịa maka ikike ịchekwa steeti opekempe (UTXO-set) na-abụghị igodo nzuzo.

UTXO na UTXO-set

UTXO (Unspent Transaction Output) bụ mmepụta azụmahịa na-adịghị akwụ ụgwọ, njedebe nke njem nke Satoshi ọ bụla na-ebufe na azụmahịa. Mwepụta a na-akwụghị ụgwọ na-aghọ ntinye nke azụmahịa ọhụrụ wee si otú a na-emefu (emefu) ma wepụ ya na UTXO-set.

A na-emepụta UTXO ọhụrụ mgbe niile site na azụmahịa:

  • azụmahịa coinbase na-enweghị ntinye: mepụta UTXO ọhụrụ mgbe ndị na-egwuputa ihe na-ewepụta mkpụrụ ego
  • azụmahịa oge niile: mepụta UTXO ọhụrụ ka ị na-emefu ụfọdụ UTXO dị adị

Usoro nke ịrụ ọrụ na UTXO:
Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Akpa ego na-agụta ọnụ ọgụgụ nke mkpụrụ ego dị maka imefu (ntụziaka) dabere na ọnụọgụ UTXO dị na obere akpa a maka imefu.

Ọnụ ụzọ nkwado ọ bụla, iji gbochie mgbalị imefu okpukpu abụọ, ga-enyocharịrị ntọala ahụ всех UTXO mgbe ịlele nke ọ bụla azụmahịa onye obula ngọngọ.

Ọnụ ga-enwerịrị mgbagha:

  • Mgbakwunye na UTXO-set
  • Nhichapụ sitere na UTXO-set
  • Na-enyocha ọnụnọ nke otu UTXO na setịpụ

Enwere ụzọ iji belata ihe achọrọ maka ozi echekwara gbasara setịpụ, ebe ị na-ejigide ikike ịgbakwunye na iwepu ihe, lelee ma gosipụta ịdị adị nke ihe dị na setịpụ site na iji. cryptographic accumulators.

Batrị maka UTXO

Echiche nke iji batrị na-echekwa ọtụtụ UTXO a tụlere na mbụ.

The UTXO-set na-wuru na ofufe, n'oge mbụ ngọngọ download (IBD), echekwara na zuru na-adịgide adịgide, mgbe ọdịnaya ya na-agbanwe mgbe nhazi azụmahịa site ọhụrụ ọ bụla na ezi ngọngọ nke netwọk. Usoro a chọrọ nbudata ihe dịka 200 GB nke data ngọngọ yana nyochaa ọtụtụ narị nde mbinye aka dijitalụ. Mgbe usoro IBD mechara, akara ala bụ na UTXO-set ga-anọ ihe dịka 4 GB.

Otú ọ dị, na accumulators, iwu nke nkwenye maka ego na-ebelata na nkwenye na ọgbọ nke cryptographic proofs, na ibu nke nsuso ego dịnụ na-agafere onye nwe ego ndị ahụ, onye na-enye ihe àmà nke ịdị adị na nwe.

Enwere ike ịkpọ onye na-akwakọba ihe nnochi anya kọmpat nke otu. Ogo nke ihe nnọchianya echekwara ga-adịrịrị ma ọ bụ na-adịgide adịgide Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin, ma ọ bụ na-abawanye sublinearly n'ihe gbasara kadinality nke set na nha nke mmewere n'onwe ya, dịka ọmụmaatụ. Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin, ebe n bụ kadinality nke ihe echekwara.

N'okwu a, onye nchịkọta kwesịrị ikwe ka ịmepụta ihe akaebe nke ntinye nke mmewere na setịpụ (ihe akaebe ntinye) ma mee ka o kwe omume iji nyochaa ihe akaebe a nke ọma.

A na-akpọ batrị ahụ ike ma ọ bụrụ na-enye gị ohere ịgbakwunye ihe ma wepụ ihe na setịpụ.

Ihe atụ nke batrị dị otú ahụ ga-abụ RSA mkpokọta Boneh, Bunz, Fisch tụrụ aro na Disemba 2018. Ihe nchịkọta dị otú ahụ nwere nha mgbe niile nke ihe nnọchianya echekwara, mana ọ chọrọ ọnụnọ ya òkè nzuzo (nhazi ntụkwasị obi). Nke a chọrọ negates na applicability nke ndị dị otú ahụ accumulator maka ntụkwasị obi netwọk dị ka Bitcoin, ebe ọ bụ na data leakage n'oge nzuzo ọgbọ nwere ike ikwe ka ndị na-awakpo ike ụgha àmà nke ịdị adị nke a UTXO, aghụghọ ọnụ na a UTXO-set dabeere dị otú ahụ accumulator.

Utreexo

Nhazi Utreexo nke Thaddeus Dryja tụpụtara na-eme ka o kwe omume ịmepụta ike batrị enweghị ntụkwasị obi-ntọala.

Utreexo bụ oke ọhịa nke ọnụọgụ abụọ zuru oke Osisi Merkle na bụ mmepe nke echiche ewepụtara na Mgbakọ asynchronous nke ọma maka pki ekesa, na-agbakwụnye ikike iwepụ ihe na setịpụ.

Nhazi ezi uche nke batrị

A na-ahazi mkpụrụ ndụ batrị n'ime ọhịa nke osisi ọnụọgụ abụọ dị mma. A na-enye osisi iwu site n'ịdị elu. A họọrọ ihe nnọchianya a dị ka nke kachasị anya ma na-enye gị ohere iji anya nke uche hụ njikọ nke osisi n'oge arụ ọrụ na batrị.

Onye edemede ahụ na-ekwu na ebe ọ bụ na osisi niile dị n'oké ọhịa dị mma, a na-egosipụta ịdị elu ha dị ka ike nke abụọ, dịka ọnụọgụ ọ bụla sitere n'okike nwere ike ịnọchite anya dị ka nchikota ike nke abụọ. N'ihi ya, akwụkwọ ọ bụla nwere ike ịchịkọta ya na osisi ọnụọgụ abụọ, na n'ọnọdụ niile, ịgbakwunye ihe ọhụrụ chọrọ ihe ọmụma naanị banyere oghere mgbọrọgwụ nke osisi echekwara.

Ya mere, ihe nnọchianya nke Utreexo accumulator echekwara bụ ndepụta nke oghere mgbọrọgwụ (Merkle mgbọrọgwụ), ma ọ bụghị oke ọhịa dum.

Ka anyị na-anọchi anya ndepụta nke mgbọrọgwụ ọcha dị ka Vec<Option<Hash>>. Ụdị nhọrọ Option<Hash> na-egosi na ihe mgbọrọgwụ nwere ike na-efu, nke pụtara na ọ dịghị osisi nwere ogologo kwesịrị ekwesị na nchịkọta.

/// 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],
        }
    }
}

Na-agbakwụnye ihe

Nke mbụ, ka anyị kọwaa ọrụ ahụ parent(), nke na-amata ọnụ nne na nna maka ihe abụọ enyere.

ọrụ nne na nna ().

Ebe anyị na-eji osisi Merkle, nne na nna nke ọ bụla n'ime oghere abụọ ahụ bụ otu ọnụ na-echekwa hash nke concatenation nke hashes nke ọnụ ụmụaka:

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

Onye edemede ahụ kwuru na iji gbochie mwakpo ndị Charles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, na Sebastien Zimmer kọwara na.
Mwakpo ihu nke abụọ na ọrụ hash mebiri emebi, na mgbakwunye na hashes abụọ ahụ, ịdị elu dị n'ime osisi ahụ kwesịkwara ịgbakwunye na concatenation.

Ka ị na-agbakwụnye ihe ndị na-emepụta ihe na-ekpo ọkụ, ị kwesịrị ịdebe ihe ndị a na-agbanwe mgbọrọgwụ. Site n'ịgbaso ụzọ nke ịgbanwe ihe mgbọrọgwụ maka ihe ọ bụla ị gbakwunyere, ị nwere ike mechaa wuo ihe akaebe nke ọnụnọ nke ihe ndị a.

Soro mgbanwe ka ị na-agbakwunye ha

Iji soro mgbanwe ndị emere, ka anyị kwupụta usoro a Update, nke ga-echekwa data gbasara mgbanwe ọnụ.

#[derive(Debug)]
pub struct Update<'a> {
    pub utreexo: &'a mut Utreexo,
    // ProofStep хранит "соседа" элемента и его положение
    pub updated: HashMap<Hash, ProofStep>,
}

Iji tinye ihe na batrị, ị ga-achọ:

  • Mepụta ọtụtụ nkata nke ihe mgbọrọgwụ new_roots ma tinye ihe mgbọrọgwụ dị n'ebe ahụ, otu maka ịwụ ọ bụla:

Usoro

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

  • Tinye ihe ndị a ga-agbakwunye (array insertions) na ụgbọ ibu nke mbụ new_roots[0]:

Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Usoro

new_roots[0].extend_from_slice(insertions);

  • Jikọta ihe ndị agbakwunyere na nkata mbụ na ihe ndị ọzọ:
    • Maka ụgbọ ala niile nwere ihe karịrị otu ihe:
      1. Were ihe abụọ site na njedebe nke nkata ahụ, gbakọọ nne na nna ha, wepụ ihe abụọ ahụ
      2. Tinye nne na nna gbakọrọ na ụgbọ na-esote

Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Usoro

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

  • Bugharịa ihe mgbọrọgwụ site na bins gaa n'usoro nchịkọta ihe na-arụpụta

Usoro

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

Ịmepụta ihe akaebe maka ihe agbakwunyere

Ihe akaebe na nsonye cell na batrị (Proof) ga-eje ozi dị ka ụzọ Merkle, nke nwere agbụ ProofStep. Ọ bụrụ na ụzọ ahụ edugaghị ebe ọ bụla, mgbe ahụ ihe akaebe ezighi ezi.

/// Единичный шаг на пути к элементу в дереве Меркла.
#[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,
}

Iji ozi enwetara na mbụ mgbe ị na-agbakwunye ihe (structure Update), ị nwere ike ịmepụta ihe akaebe na etinyela ihe na batrị. Iji mee nke a, anyị na-aga na tebụl mgbanwe emere ma tinye nzọụkwụ ọ bụla na ụzọ Merkle, nke ga-emesị bụrụ ihe akaebe:

Usoro

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

Usoro nke ịmepụta ihe akaebe

Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Na-enyocha ihe akaebe maka mmewere

Ịlele ihe akaebe nsonye nke mmewere na-agbada na ịgbaso ụzọ Merkle ruo mgbe ọ na-eduga na mmewere mgbọrọgwụ dị ugbu a:

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

N'anya:

Usoro ịlele ihe akaebe maka A

Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Na-ewepụ ihe

Iji wepụ cell na batrị, ị ga-eweta ezigbo ihe akaebe na cell dị ebe ahụ. N'iji data sitere na ihe akaebe, ọ ga-ekwe omume ịgbakọ ihe mgbọrọgwụ ọhụrụ nke mkpokọta nke ihe akaebe e nyere agaghịzi abụ eziokwu.

The algọridim bụ dị ka ndị:

  1. Dị ka mgbakwunye, anyị na-ahazi otu nkata tọgbọ chakoo kwekọrọ na osisi Merkle nwere ogo nha nha abụọ site na ndeksi nkata.
  2. Anyị na-etinye ihe ndị sitere na nzọụkwụ nke ụzọ Merkle n'ime nkata; nkata nkata nhata na ọnụọgụ nke nzọụkwụ dị ugbu a
  3. Anyị na-ewepụ ihe mgbọrọgwụ nke ụzọ si na ihe akaebe na-eduga
  4. Dị ka ịgbakwụnye, anyị na-agbakọ ihe mgbọrọgwụ ọhụrụ site na ijikọta ihe sitere na nkata na ụzọ abụọ ma bugharịa nsonaazụ nke otu ahụ na nkata ọzọ.

Usoro

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

Usoro iwepụ elementrị "A":
Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Ntinye n'ime netwọk dị adị

Iji na-atụ aro accumulator, ọnụ nwere ike izere iji a DB na-echekwa niile UTXO mgbe ka na-enwe ike ịgbanwe UTXO-set. Otú ọ dị, nsogbu nke ịrụ ọrụ na ihe àmà na-ebilite.

Ka anyị kpọọ ọnụ ihe nkwado nke na-eji UTXO accumulator kọmpat (kọmpat-steeti ọnụ), na validator na-enweghị accumulator bụ zuru ezu (ọnụ ọnụ zuru oke). Ịdị adị nke klas abụọ nke ọnụ na-emepụta nsogbu maka ijikọta ha n'ime otu netwọk, ebe ọ bụ na ọnụ ọgụgụ kọmpat chọrọ ihe akaebe nke ịdị adị nke UTXO, nke a na-eji na azụmahịa, ebe ọnụ ọgụgụ zuru ezu adịghị. Ọ bụrụ na ọnụ ụzọ netwọkụ niile adịghị n'otu oge na n'ụzọ a haziri ahazi gbanwee gaa na iji Utreexo, mgbe ahụ, a ga-ahapụ ọnụ ọnụ kọmpat ma ọ gaghị enwe ike ịrụ ọrụ na netwọk Bitcoin.

Iji dozie nsogbu nke itinye ọnụ ọnụ kọmpat na netwọkụ, a na-atụ aro iwebata klas ọzọ nke ọnụ ọnụ - àkwà mmiri. Ọnụ mmiri mmiri bụ ọnụ zuru oke nke na-echekwa batrị Utreexo na ihe akaebe maka всех UTXO sitere na UTXO-set. Àkwà mmiri na-agbakọ hashes ọhụrụ wee melite mkpokọta na ihe akaebe ka ngọngọ azụmahịa na-abịarute. Idokwa na imelite ihe mkpokọ na ihe akaebe anaghị etinyekwu ibu mgbakọ na mwepụ ndị dị otú ahụ. Bridges na-achụ ohere diski: mkpa idobe ihe ahaziri Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin hashes, tụnyere Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin hashes maka ọnụ ọnụ kọmpat, ebe n bụ ike nke UTXO set.

Nhazi netwọkụ

Utreexo: na-akpakọ ọtụtụ UTXO Bitcoin

Àkwà mmiri na-eme ka o kwe omume iji nwayọọ nwayọọ tinye ọnụ ọnụ na netwọk na-agbanweghị ngwanrọ nke ọnụ ọnụ dị ugbu a. Ọnụ ụzọ zuru ezu na-arụ ọrụ dị ka ọ dị na mbụ, na-ekesa azụmahịa na ngọngọ n'etiti onwe ha. Ọnụ ọnụ mmiri bụ ọnụ ọnụ zuru oke nke na-echekwa data batrị Utreexo yana ihe akaebe nsonye maka всех UTXO maka ugbu a. Ọnụ ụzọ akwa akwa anaghị akpọsa onwe ya dị ka nke a, na-eme ka ọ bụ ọnụ ọnụ zuru oke maka ọnụ ọnụ niile zuru ezu na ọnụ ọnụ maka ndị niile na-arụkọ ọrụ ọnụ. Ọ bụ ezie na àkwà mmiri jikọtara netwọk abụọ ahụ ọnụ, ọ dị ha mkpa ijikọ ha n'otu akụkụ: site na ọnụ ọnụ zuru ezu dị ugbu a ruo na ọnụ ọnụ. Nke a ga-ekwe omume n'ihi na ọ dịghị mkpa ka a gbanwee usoro azụmahịa, yana UTXO ihe akaebe maka ọnụ ọnụ ọnụ nwere ike tụfuo, ya mere ọnụ ụzọ ọ bụla kọmpat nwere ike gbasaa azụmahịa na ndị niile na-eso netwọk na-enweghị òkè nke ọnụ mmiri.

nkwubi

Anyị lere batrị Utreexo wee tinye ụdị ya na Rust. Anyị lere anya na nhazi netwọk nke ga-ekwe ka njikọ nke ọnụ ndị dabeere na batrị. Uru nke nchịkọta kọmpat bụ nha nke data echekwara, nke na-adabere logarithmically na ike nke UTXOs, nke na-ebelata ihe ndị a chọrọ maka ohere diski na arụmọrụ nchekwa maka ọnụ ndị dị otú ahụ. Ọdịmma ahụ bụ okporo ụzọ ọnụ ụzọ maka ịnyefe ihe akaebe, mana usoro nchịkọta ihe akaebe (mgbe otu ihe akaebe gosipụtara ịdị adị nke ọtụtụ ihe) na caching nwere ike inye aka idobe okporo ụzọ n'ime oke anabatara.

zoro:

isi: www.habr.com

Tinye a comment