Utreexo: compressing tele UTXO Bitcoin

Utreexo: compressing tele UTXO Bitcoin

Ei Habr!

I totonu o le Bitcoin network, o nodes uma, e ala i maliega, malilie i se seti o UTXOs: e fia tupe e avanoa mo le faʻaaluina, o ai tonu, ma i lalo o a tulaga. O le seti UTXO o le seti pito maualalo lea o faʻamaumauga e manaʻomia mo se faʻamaufaʻailoga faʻamaonia, a aunoa ma lea o le a le mafai e le node ona faʻamaonia le faʻamaonia o fefaʻatauaiga o loʻo oʻo mai ma poloka o loʻo i ai.

I lenei tulaga, o loʻo faia taumafaiga i auala uma e faʻaitiitia ai le teuina o faʻamatalaga o lenei seti, e faʻapipiʻi ai e aunoa ma le leiloa o faʻamaoniga saogalemu. O le laʻititi o le tele o faʻamaumauga o loʻo teuina, o le maualalo lea o manaʻoga avanoa o le vaʻaia o le validator node, lea e taugofie ai le faʻalauiloaina o le validator node, e mafai ai ona e faʻalauteleina le fesoʻotaʻiga ma faʻateleina ai le mautu o le fesoʻotaʻiga.

I lenei pou o le a matou lafoina se Rust prototype o se talosaga lata mai mai se tusitala-tusitala Pepa Fesootaiga Uila, Thaddeus Dryja - Utreexo: o se faʻapipiʻi faʻapipiʻi faʻamaufaʻailoga faʻamalosia mo le seti Bitcoin UTXO, lea e mafai ai ona fa'aitiitia mana'oga avanoa tisiki mo nodes validator.

O le a le faafitauli?

O se tasi o faʻafitauli faʻapitoa a Bitcoin o lona faʻalauteleina. O le manatu o "lau lava faletupe" e manaʻomia ai tagata auai i fesoʻotaʻiga e tausia faʻamaumauga o tupe uma e avanoa mo le faʻaaogaina. I Bitcoin, o tupe avanoa o loʻo faʻaalia o se seti o galuega e leʻi faʻaaluina - o se UTXO-set. E ui e le o se faʻamatalaga faʻapitoa faʻapitoa, e aoga i tulaga o le faʻatinoga o faʻatinoga i luga o se faʻataʻitaʻiga lea e tofu ai le "atotupe" ma le "paleni" o se faʻamatalaga ese, ma faʻaopoopoina le le faalauaiteleina (eg. CoinJoin).

E taua tele le vaʻavaʻai i le va o le talafaasolopito o fefaʻatauaiga (le mea e taʻua o le poloka poloka) ma le tulaga o loʻo iai nei. O le talafaasolopito o fefaʻatauaiga a Bitcoin o loʻo nofoia nei e uiga i le 200 GB o avanoa tisiki, ma faʻaauau pea ona tupu. Ae ui i lea, o le faiga o le setete e sili atu ona laʻititi, i luga o le faʻatonuga o le 4 GB, ma naʻo le amanaia o le mea moni e iai se tasi i le taimi nei o tupe siliva. O le tele o nei fa'amaumauga e fa'atupula'ia fo'i i le taimi, ae i se fua fa'agesegese ma o nisi taimi e fa'aitiitia ai (silasila i le CDPV).

Fa'atauga tau fefa'ataua'iga a tagata fa'atau mama (SPVs) mo le mafai ona teuina leai se tulaga maualalo (UTXO-set) e ese mai i ki patino.

UTXO ma UTXO-set

UTXO (Unspent Transaction Output) o le gaosiga o fefaʻatauaiga e leʻi faʻaaluina, o le pito iʻuga o le faigamalaga a Satoshi taʻitasi na faʻafeiloaʻi i fefaʻatauaiga. O galuega faatino e le'i fa'aalu e avea ma mea e fa'aogaina ai fefa'ataua'iga fou ma fa'apea ona fa'aalu (fa'aalu) ma aveese mai le UTXO-set.

UTXO fou e faia i taimi uma e ala i fefaʻatauaiga:

  • fefa'ataua'iga coinbase e aunoa ma ni mea e fa'aoga ai: faia ni UTXO fou pe a tu'uina atu e le au miners ni tupe
  • fefaʻatauaʻiga masani: fatuina UTXO fou aʻo faʻaalu se seti o UTXO o iai

Fa'agasologa o le galue ma UTXO:
Utreexo: compressing tele UTXO Bitcoin

E faitau e atotupe le aofaʻi o tupe siliva e avanoa mo le faʻaaluina (paleni) e faʻatatau i le aofaʻi o le UTXO o loʻo avanoa i lenei atotupe mo le faʻaaluina.

O node fa'amaonia ta'itasi, e taofia ai taumafaiga fa'aalu fa'alua, e tatau ona mata'ituina le seti всех UTXO pe a siaki taʻitasi fefa'ataua'iga taʻitasi poloka.

O le node e tatau ona i ai se fa'atatau:

  • Fa'aopoopo i le UTXO-set
  • Aveese mai UTXO-set
  • Siaki le iai o se UTXO e tasi i se seti

E i ai auala e faʻaitiitia ai manaʻoga mo faʻamatalaga teuina e uiga i se seti, aʻo faʻatumauina le gafatia e faʻaopoopo ma aveese elemene, siaki ma faʻamaonia le i ai o se elemene i totonu o se seti faʻaaoga fa'apipi'i fa'aputugatusi.

Ma'a mo UTXO

Le manatu o le faʻaaogaina o maa e teu ai le tele o UTXOs sa talanoaina muamua.

O le UTXO-set e fausia i luga o le lele, i le taimi o le uluai poloka poloka (IBD), teuina i le atoatoa ma tumau, aʻo suia mea o loʻo i ai pe a uma ona faʻatautaia fefaʻatauaiga mai poloka fou ma saʻo taʻitasi o le fesoʻotaʻiga. O lenei faiga e mana'omia ai le la'uina mai e tusa ma le 200 GB o fa'amaumauga poloka ma fa'amaonia le fiaselau miliona o saini numera. A maeʻa le faagasologa o le IBD, o le laina pito i lalo o le UTXO-set o le a nofo i le 4 GB.

Ae ui i lea, faʻatasi ai ma tagata faʻapipiʻi, o tulafono o le maliliega mo tupe e faʻaitiitia i le faʻamaonia ma le faʻatupuina o faʻamaoniga faʻamaonia, ma o le avega o le suʻeina o tupe avanoa e faʻafeiloaʻi atu i lē e ona na tupe, o loʻo tuʻuina atu faʻamaoniga o lo latou i ai ma le umiaina.

O se accumulator e mafai ona taʻua o se faʻatusa faʻatusatusa o se seti. Ole tele ole fa'atusa o lo'o teuina e tatau ona tumau Utreexo: compressing tele UTXO Bitcoin, poʻo le faʻateleina i lalo ole laina e faʻatatau i le cardinality o le seti ma le tele o le elemene lava ia, mo se faʻataʻitaʻiga Utreexo: compressing tele UTXO Bitcoin, o le n o le cardinality o le seti teuina.

I lenei tulaga, e tatau i le accumulator ona faʻatagaina le fausiaina o se faʻamaoniga o le aofia ai o se elemene i totonu o le seti (faʻamaonia faʻamaonia) ma mafai ai ona faʻamaonia lelei lenei faʻamaoniga.

Ua ta'ua le maa malosi pe a faʻatagaina oe e faʻaopoopo elemene ma aveese elemene mai se seti.

O se faʻataʻitaʻiga o sea maa o le a RSA accumulator na fuafuaina e Boneh, Bunz, Fisch ia Tesema 2018. O sea accumulator o loʻo i ai se tele faifaipea o faʻamatalaga teuina, ae manaʻomia le i ai faasoa faalilolilo (faatulagaina fa'atuatuaina). O lenei manaʻoga e faʻaleagaina ai le faʻaogaina o sea accumulator mo fesoʻotaʻiga le talitonuina e pei o Bitcoin, talu ai o le faʻaogaina o faʻamatalaga i le taimi o le faʻatupu faalilolilo e mafai ona faʻatagaina tagata osofaʻi e faia se faʻamaoniga sese o le i ai o se UTXO, faʻaseseina nodes ma se UTXO-set e faʻavae i luga o sea accumulator.

Utreexo

O le mamanu Utreexo na tuʻuina mai e Thaddeus Dryja e mafai ai ona fatuina malosi faaputuputu e aunoa ma faatuatuaina-setup.

Utreexo o se vaomatua o le binary atoatoa Laau Merkle ma o se atinae o manatu o loo tuuina atu i totonu Asynchronous accumulators lelei mo pki tufatufa, faʻaopoopoina le gafatia e aveese elemene mai se seti.

Ma'a Fa'atonu Fa'atonu

O sela maa o loʻo faʻatulagaina i totonu o se vaomatua o laʻau binary lelei. O la'au e fa'atonu i le maualuga. O lenei faʻataʻitaʻiga na filifilia e sili ona vaʻaia ma mafai ai ona e vaʻavaʻai i le tuʻufaʻatasia o laʻau i le taimi o gaioiga i luga o le maa.

Ua matauina e le tusitala talu ai o laau uma i totonu o le vaomatua e lelei, o lo latou maualuga o loʻo faʻaalia o se malosi o le lua, e pei lava o soʻo se numera masani e mafai ona faʻatusalia o se aofaiga o malosiaga e lua. E tusa ai ma lea, soʻo se seti o lau e mafai ona faʻavasegaina i laʻau binary, ma i tulaga uma, faʻaopoopoina se elemene fou e manaʻomia ai le malamalama. na'o le a'a o la'au teu.

O le mea lea, o le faʻataʻitaʻiga teuina o le Utreexo accumulator o se lisi o aʻa aʻa (Merkle root), ae le o le vaomatua atoa o laau.

Tatou fai ma sui o le lisi o elemene a'a e pei o Vec<Option<Hash>>. Ituaiga filifiliga Option<Hash> o loʻo faʻaalia ai o le aʻa elemene atonu o loʻo misi, o lona uiga e leai se laau e iai le maualuga talafeagai i le 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],
        }
    }
}

Faaopoopo elemene

Muamua, se'i o tatou fa'amatala le galuega parent(), lea e iloa ai le pona matua mo elemene e lua.

matua() galuega

Talu ai o loʻo matou faʻaaogaina laau Merkle, o le matua o faʻamau taʻitasi e lua o le tasi le node e teu ai le hash o le tuʻufaʻatasia o faʻamau o nodes tamaiti:

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

Ua matauina e le tusitala ina ia taofia osofaiga na faamatalaina e Charles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, ma Sebastien Zimmer i
O osofa'iga lona lua a'o le'i fa'atusaina i luga o fa'agaioiga hash dithered, i le faaopoopo atu i le lua hashes, o le maualuga i totonu o le laau e tatau foi ona faaopoopo i le concatenation.

A'o e fa'aopoopoina elemene i le accumulator, e tatau ona e siaki po'o fea elemene a'a e suia. I le mulimuli i le ala o le suia o elemene aʻa mo elemene taʻitasi e te faʻaopoopoina, e mafai ona e fausia mulimuli ane se faʻamaoniga o le i ai o nei elemene.

Su'e suiga aoe fa'aopoopoina

Ina ia siaki suiga ua faia, sei ta'utino le fausaga Update, lea o le a teuina faʻamatalaga e uiga i suiga node.

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

Ina ia faaopoopo se elemene i le maa, e te manaʻomia:

  • Fausia se seti o ato o elemene a'a new_roots ma tu'u i ai elemene a'a o lo'o iai, tasi mo pakete ta'itasi:

kote

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

  • Fa'aopoopo elemene e fa'aopoopo (faasologa insertions) i le taavale toso muamua new_roots[0]:

Utreexo: compressing tele UTXO Bitcoin

kote

new_roots[0].extend_from_slice(insertions);

  • Fa'atasi mea fa'aopoopo i le ato muamua ma isi mea:
    • Mo taavale toso uma e sili atu ma le tasi mea:
      1. Ave ni elemene se lua mai le pito o le ato, fuafua o latou matua, aveese uma elemene
      2. Faaopoopo le matua fuafuaina i le isi taavaletoso

Utreexo: compressing tele UTXO Bitcoin

kote

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

  • Si'i elemene a'a mai talone i le fa'aputuga fa'aputu

kote

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

Fausia se faʻamaoniga mo elemene faʻaopoopo

Faʻamaoniga o le faʻaofiina o le sela i totonu o le maa (Proof) o le a avea ma Merkle Path, e aofia ai se filifili ProofStep. Afai e leai se mea e tau i ai le ala, o lona uiga e le sa'o le faamaoniga.

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

Fa'aaogāina o fa'amatalaga na maua muamua pe a fa'aopoopoina se elemene (structure Update), e mafai ona e fatuina se faʻamaoniga ua faʻaopoopoina se elemene i le maa. Ina ia faia lenei mea, matou te alu i le laulau o suiga ua faia ma faʻaopoopo laasaga taʻitasi i le ala o Merkle, lea o le a mulimuli ane avea ma faʻamaoniga:

kote

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

Fa'agasologa o le faia o se fa'amaoniga

Utreexo: compressing tele UTXO Bitcoin

Siaki le faʻamaoniga mo se elemene

O le siakiina o le faʻamaoniga o le faʻaogaina o se elemene e faʻafefe i lalo i le mulimuli i le auala Merkle seia oʻo atu i se aʻa elemene o loʻo iai:

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

Va'ai:

Fa'agasologa o le siakiina o fa'amaoniga mo A

Utreexo: compressing tele UTXO Bitcoin

Aveese mea

Ina ia aveese se sela mai se maa, e tatau ona e tuuina atu se faamaoniga moni o loo iai le sela. I le faʻaaogaina o faʻamatalaga mai le faʻamaoniga, e mafai ona faʻatusatusa elemene aʻa fou o le accumulator lea o le a le toe moni ai le faʻamaoniga.

O le algorithm e faʻapea:

  1. E pei o le faʻaopoopoga, matou te faʻatulagaina se seti o ato gaogao e fetaui ma laau Merkle ma le maualuga e tutusa ma le malosi o le lua mai le faʻailoga ato.
  2. Matou te tuʻuina elemene mai laasaga o le auala Merkle i totonu o ato; o le fa'ailoga ato e tutusa ma le numera o le laasaga o lo'o iai nei
  3. Matou te aveese le elemene aʻa lea e tau atu i ai le ala mai le faʻamaoniga
  4. E pei o le faʻaopoopoina, matou te faʻatusatusa elemene aʻa fou e ala i le tuʻufaʻatasia o elemene mai ato taitoalua ma faʻanofo le taunuuga o le faʻatasi i le isi ato.

kote

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

Le faagasologa o le aveesea o elemene "A":
Utreexo: compressing tele UTXO Bitcoin

Tu'ufa'atasiga i se feso'ota'iga o iai

I le faʻaaogaina o le accumulator fuafuaina, e mafai e nodes ona aloese mai le faʻaaogaina o se DB e teu ai UTXO uma aʻo mafai pea ona suia le UTXO-set. Ae ui i lea, o le faʻafitauli o le galue ma faʻamaoniga e tulaʻi mai.

Se'i o tatou vala'au le node validator lea e fa'aaoga ai le UTXO accumulator fa'atasi (node ​​compact-state), ma le validator e aunoa ma se accumulator o uma (node ​​atoa). O le i ai o vasega e lua o nodes e mafua ai se faʻafitauli mo le tuʻufaʻatasia i totonu o se fesoʻotaʻiga e tasi, talu ai e manaʻomia e nodes faʻamaonia le faʻamaoniga o le i ai o UTXOs, lea e faʻaalu i fefaʻatauaiga, ae leai ni nodes atoa. Afai e le o fa'atasi uma nodes feso'ota'iga ma i se faiga fa'amaopoopo fa'afeso'ota'i le fa'aogaina o le Utreexo, ona tu'u ai lea o nodes fa'atusatusa i tua ma o le a le mafai ona fa'agaoioi i luga ole feso'otaiga Bitcoin.

Ina ia foia le faʻafitauli o le tuʻufaʻatasia o nodes faʻapipiʻi i totonu o le fesoʻotaʻiga, ua fautuaina e faʻafeiloaʻi se isi vasega o nodes - alalaupapa. O le alalaupapa alalaupapa o se node atoatoa e teu ai foi le Utreexo maa ma le malosi-i luga o faamaoniga mo всех UTXO mai UTXO-set. E fa'atatau e Bridges fa'ailoga fou ma fa'afou le fa'aputu ma fa'amaoniga pe a o'o mai poloka fou o fefa'atauaiga. O le fa'atumauina ma le fa'afouina o le fa'aputu ma fa'amaoniga e le fa'aopoopoina ai se uta fa'aopoopo i luga o ia pona. Alalaupapa ositaulaga avanoa tisiki: manaʻomia le faʻatulagaina o mea Utreexo: compressing tele UTXO Bitcoin Hashes, faatusatusa i Utreexo: compressing tele UTXO Bitcoin Hashes mo nodes fa'akomepiuta, o le n o le mana o le seti UTXO.

Feso'ota'iga fausaga

Utreexo: compressing tele UTXO Bitcoin

O alalaupapa e mafai ai ona faʻaopoopo faʻasolosolo nodes faʻapipiʻi i le fesoʻotaʻiga e aunoa ma le suia o le polokalama o nodes o loʻo iai. O nodes atoa o loʻo faʻaogaina e pei o muamua, tufatufaina fefaʻatauaiga ma poloka ia i latou lava. O pona alalaupapa o pona atoa ia e teuina ai fa'amaumauga o maa Utreexo ma se seti o fa'amaoniga fa'aofi mo всех UTXO mo le taimi nei. E le fa'asalalauina e le pona alalaupapa o ia lava, e fa'afoliga o se pona atoa mo pona atoa uma ma se pona fa'akomepiuta mo pona uma. E ui ina fa'afeso'ota'i fa'atasi e alalaupapa ia feso'ota'iga uma e lua, e mana'omia lava ona fa'afeso'ota'i i le itu e tasi: mai nodes atoa o lo'o iai i nodes fa'amau. E mafai lenei mea ona e le manaʻomia ona suia le faʻasologa o fefaʻatauaiga, ma e mafai ona lafoaʻi faʻamaoniga UTXO mo nodes faʻapipiʻi, o lea e mafai ai e soʻo se pona faʻapipiʻi ona faʻasalalau faʻasalalauga i tagata uma e auai i fesoʻotaiga e aunoa ma le auai o node alalaupapa.

iʻuga

Na matou tilotilo i le Utreexo maa ma faʻatino lona faʻataʻitaʻiga i Rust. Na matou vaʻavaʻai i le fausaga o fesoʻotaʻiga o le a faʻatagaina ai le tuʻufaʻatasia o nodes faʻavae maa. O le lelei o puʻe puʻupuʻu o le tele o faʻamaumauga o loʻo teuina, lea e faʻalagolago i le logarithmically i luga o le mana o le seti o UTXOs, lea e faʻaitiitia ai manaʻoga mo le avanoa vaʻaia ma le teuina o gaioiga mo ia nodes. O le fa'aletonu o le fa'aopoopoina o fe'avea'i node mo le tu'uina atu o fa'amaoniga, ae o metotia fa'aputuga fa'amaoniga (pe a fa'amaonia e se tasi fa'amaoniga le i ai o ni elemene) ma le fa'aogaina e mafai ona fesoasoani e fa'atumauina felauaiga i totonu o tapula'a talafeagai.

mau:

puna: www.habr.com

Faaopoopo i ai se faamatalaga