Utreexo: συμπίεση πολλών UTXO Bitcoin

Utreexo: συμπίεση πολλών UTXO Bitcoin

Γεια σου Χαμπρ!

Στο δίκτυο Bitcoin, όλοι οι κόμβοι, μέσω συναίνεσης, συμφωνούν σε ένα σύνολο UTXO: πόσα νομίσματα είναι διαθέσιμα για δαπάνη, σε ποιον ακριβώς και υπό ποιες συνθήκες. Το σύνολο UTXO είναι το ελάχιστο σύνολο δεδομένων που απαιτείται για έναν κόμβο επικύρωσης, χωρίς το οποίο ο κόμβος δεν θα μπορεί να επαληθεύσει την εγκυρότητα των εισερχόμενων συναλλαγών και των μπλοκ που τις περιέχουν.

Από αυτή την άποψη, γίνονται προσπάθειες με κάθε δυνατό τρόπο να μειωθεί η αποθηκευμένη αναπαράσταση αυτού του συνόλου, να συμπιεστεί χωρίς να χαθούν εγγυήσεις ασφαλείας. Όσο μικρότερος είναι ο όγκος των αποθηκευμένων δεδομένων, τόσο χαμηλότερες είναι οι απαιτήσεις χώρου στο δίσκο του κόμβου επικύρωσης, γεγονός που καθιστά φθηνή την εκκίνηση ενός κόμβου επικύρωσης, σας επιτρέπει να επεκτείνετε το δίκτυο και, συνεπώς, να αυξήσετε τη σταθερότητα του δικτύου.

Σε αυτήν την ανάρτηση θα δημοσιεύσουμε ένα πρωτότυπο Rust μιας πρόσφατης πρότασης από έναν συν-συγγραφέα Χαρτί δικτύου Lightning, Θάδεϋος Δρυά - Utreexo: ένας δυναμικός συσσωρευτής βασισμένος σε κατακερματισμό βελτιστοποιημένος για το σύνολο Bitcoin UTXO, το οποίο επιτρέπει τη μείωση των απαιτήσεων χώρου στο δίσκο για κόμβους επικύρωσης.

Ποιο είναι το πρόβλημα?

Ένα από τα διαχρονικά προβλήματα του Bitcoin ήταν η επεκτασιμότητα του. Η ιδέα της «δικής σας τράπεζας» απαιτεί από τους συμμετέχοντες στο δίκτυο να τηρούν αρχεία όλων των κεφαλαίων που είναι διαθέσιμα προς χρήση. Στο Bitcoin, τα διαθέσιμα κεφάλαια εκφράζονται ως ένα σύνολο μη δαπανηθέντων εκροών - ένα σύνολο UTXO. Αν και αυτή δεν είναι μια ιδιαίτερα διαισθητική αναπαράσταση, είναι επωφελής όσον αφορά την απόδοση υλοποίησης σε σχέση με μια αναπαράσταση στην οποία κάθε "πορτοφόλι" έχει ένα "υπόλοιπο" ως ξεχωριστή καταχώρηση και προσθέτει επίσης απόρρητο (π.χ. CoinΕγγραφείτε).

Είναι σημαντικό να γίνει διάκριση μεταξύ του ιστορικού των συναλλαγών (αυτό που ονομάζεται blockchain) και της τρέχουσας κατάστασης του συστήματος. Το ιστορικό συναλλαγών Bitcoin καταλαμβάνει επί του παρόντος περίπου 200 GB χώρου στο δίσκο και συνεχίζει να αυξάνεται. Ωστόσο, η κατάσταση του συστήματος είναι πολύ μικρότερη, της τάξης των 4 GB, και λαμβάνει υπόψη μόνο το γεγονός ότι κάποιος έχει επί του παρόντος νομίσματα. Ο όγκος αυτών των δεδομένων αυξάνεται επίσης με την πάροδο του χρόνου, αλλά με πολύ πιο αργό ρυθμό και μερικές φορές τείνει ακόμη και να μειώνεται (βλ. CDPV).

Οι Light clients (SPV) εμπορεύονται εγγυήσεις ασφάλειας για τη δυνατότητα αποθήκευσης ελάχιστης κατάστασης (UTXO-set) εκτός από ιδιωτικά κλειδιά.

UTXO και UTXO-set

Το UTXO (Unspent Transaction Output) είναι η έξοδος αδιάθετης συναλλαγής, το τελικό σημείο της διαδρομής κάθε Satoshi που μεταφέρεται στις συναλλαγές. Οι μη δαπανημένες έξοδοι γίνονται εισροές νέων συναλλαγών και έτσι δαπανώνται (δαπανούν) και αφαιρούνται από το σύνολο UTXO.

Τα νέα UTXO δημιουργούνται πάντα από συναλλαγές:

  • συναλλαγές coinbase χωρίς εισόδους: δημιουργήστε νέα UTXO όταν οι εξορύκτες εκδίδουν νομίσματα
  • τακτικές συναλλαγές: δημιουργήστε νέα UTXO ενώ ξοδεύετε ένα συγκεκριμένο σύνολο υπαρχόντων UTXO

Διαδικασία εργασίας με UTXO:
Utreexo: συμπίεση πολλών UTXO Bitcoin

Τα πορτοφόλια μετρούν τον αριθμό των κερμάτων που είναι διαθέσιμα για δαπάνη (υπόλοιπο) με βάση το ποσό UTXO που είναι διαθέσιμο σε αυτό το πορτοφόλι για δαπάνες.

Κάθε κόμβος επικύρωσης, για να αποτρέψει τις προσπάθειες διπλής δαπάνης, πρέπει να παρακολουθεί το σύνολο όλα UTXO κατά τον έλεγχο κάθε συναλλαγές του καθενός ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ.

Ο κόμβος πρέπει να έχει λογική:

  • Προσθήκες στο UTXO-set
  • Διαγραφές από το σύνολο UTXO
  • Έλεγχος της παρουσίας ενός μόνο UTXO σε ένα σετ

Υπάρχουν τρόποι να μειωθούν οι απαιτήσεις για αποθηκευμένες πληροφορίες σχετικά με ένα σύνολο, διατηρώντας παράλληλα τη δυνατότητα προσθήκης και αφαίρεσης στοιχείων, ελέγχου και απόδειξης της ύπαρξης ενός στοιχείου σε ένα σύνολο χρησιμοποιώντας κρυπτογραφικοί συσσωρευτές.

Μπαταρίες για UTXO

Η ιδέα της χρήσης μπαταριών για την αποθήκευση πολλαπλών UTXO συζητήθηκε νωρίτερα.

Το UTXO-set χτίζεται on the fly, κατά την αρχική λήψη μπλοκ (IBD), αποθηκεύεται πλήρως και μόνιμα, ενώ τα περιεχόμενά του αλλάζουν μετά την επεξεργασία των συναλλαγών από κάθε νέο και σωστό μπλοκ του δικτύου. Αυτή η διαδικασία απαιτεί λήψη περίπου 200 GB μπλοκ δεδομένων και επαλήθευση εκατοντάδων εκατομμυρίων ψηφιακών υπογραφών. Αφού ολοκληρωθεί η διαδικασία IBD, η ουσία είναι ότι το σύνολο UTXO θα καταλάβει περίπου 4 GB.

Ωστόσο, με τους συσσωρευτές, οι κανόνες συναίνεσης για τα κεφάλαια περιορίζονται στην επαλήθευση και τη δημιουργία κρυπτογραφικών αποδείξεων και το βάρος της παρακολούθησης των διαθέσιμων κεφαλαίων μετατίθεται στον κάτοχο αυτών των κεφαλαίων, ο οποίος παρέχει απόδειξη της ύπαρξης και της ιδιοκτησίας τους.

Ένας συσσωρευτής μπορεί να ονομαστεί μια συμπαγής αναπαράσταση ενός συνόλου. Το μέγεθος της αποθηκευμένης αναπαράστασης πρέπει να είναι είτε σταθερό Utreexo: συμπίεση πολλών UTXO Bitcoin, ή να αυξηθεί υπογραμμικά σε σχέση με την καρδινάτητα του συνόλου και το μέγεθος του ίδιου του στοιχείου, για παράδειγμα Utreexo: συμπίεση πολλών UTXO Bitcoin, όπου n είναι η καρδινάτητα του αποθηκευμένου συνόλου.

Σε αυτήν την περίπτωση, ο συσσωρευτής θα πρέπει να επιτρέπει τη δημιουργία απόδειξης για τη συμπερίληψη ενός στοιχείου στο σύνολο (απόδειξη συμπερίληψης) και να επιτρέπει την αποτελεσματική επαλήθευση αυτής της απόδειξης.

Η μπαταρία ονομάζεται δυναμικός εάν σας επιτρέπει να προσθέσετε στοιχεία και να αφαιρέσετε στοιχεία από ένα σύνολο.

Ένα παράδειγμα τέτοιας μπαταρίας θα ήταν Συσσωρευτής RSA που προτάθηκε από τους Boneh, Bunz, Fisch τον Δεκέμβριο του 2018. Ένας τέτοιος συσσωρευτής έχει ένα σταθερό μέγεθος αποθηκευμένης αναπαράστασης, αλλά απαιτεί την παρουσία κοινό μυστικό (αξιόπιστη εγκατάσταση). Αυτή η απαίτηση αναιρεί τη δυνατότητα εφαρμογής ενός τέτοιου συσσωρευτή για αξιόπιστα δίκτυα όπως το Bitcoin, καθώς η διαρροή δεδομένων κατά τη διάρκεια της μυστικής παραγωγής μπορεί να επιτρέψει στους εισβολείς να δημιουργήσουν ψευδείς αποδείξεις για την ύπαρξη ενός UTXO, εξαπατώντας κόμβους με ένα σύνολο UTXO που βασίζεται σε έναν τέτοιο συσσωρευτή.

Utreexo

Το σχέδιο Utreexo που προτείνει ο Thaddeus Dryja καθιστά δυνατή τη δημιουργία δυναμικός συσσωρευτή χωρίς αξιόπιστη εγκατάσταση.

Το Utreexo είναι ένα δάσος τέλειου δυαδικού Δέντρα Merkle και είναι μια ανάπτυξη των ιδεών που παρουσιάζονται στο Αποτελεσματικοί ασύγχρονοι συσσωρευτές για κατανεμημένο pki, προσθέτοντας τη δυνατότητα αφαίρεσης στοιχείων από ένα σύνολο.

Λογική δομή μπαταρίας

Οι μπαταρίες είναι διατεταγμένες σε ένα δάσος από ιδανικά δυαδικά δέντρα. Τα δέντρα ταξινομούνται κατά ύψος. Αυτή η αναπαράσταση επιλέχθηκε ως η πιο οπτική και σας επιτρέπει να οπτικοποιήσετε τη συγχώνευση δέντρων κατά τη διάρκεια εργασιών στην μπαταρία.

Ο συγγραφέας σημειώνει ότι εφόσον όλα τα δέντρα στο δάσος είναι ιδανικά, το ύψος τους εκφράζεται ως δύναμη του δύο, όπως κάθε φυσικός αριθμός μπορεί να αναπαρασταθεί ως άθροισμα δυνάμεων του δύο. Κατά συνέπεια, οποιοδήποτε σύνολο φύλλων μπορεί να ομαδοποιηθεί σε δυαδικά δέντρα και σε όλες τις περιπτώσεις, η προσθήκη ενός νέου στοιχείου απαιτεί γνώση μόνο για τους ριζικούς κόμβους των αποθηκευμένων δέντρων.

Έτσι, η αποθηκευμένη αναπαράσταση του συσσωρευτή Utreexo είναι μια λίστα ριζικών κόμβων (ρίζα Merkle), και όχι ολόκληρο το δάσος των δέντρων.

Ας αναπαραστήσουμε τη λίστα των ριζικών στοιχείων ως Vec<Option<Hash>>. Προαιρετικός τύπος Option<Hash> υποδεικνύει ότι το ριζικό στοιχείο μπορεί να λείπει, πράγμα που σημαίνει ότι δεν υπάρχει δέντρο με το κατάλληλο ύψος στον συσσωρευτή.

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

Προσθήκη στοιχείων

Αρχικά, ας περιγράψουμε τη λειτουργία parent(), το οποίο αναγνωρίζει τον γονικό κόμβο για δύο δεδομένα στοιχεία.

συνάρτηση γονέα().

Εφόσον χρησιμοποιούμε δέντρα Merkle, ο γονέας καθενός από τους δύο κόμβους είναι ένας κόμβος που αποθηκεύει τον κατακερματισμό της συνένωσης των κατακερματισμών των θυγατρικών κόμβων:

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

Ο συγγραφέας σημειώνει ότι για την πρόληψη των επιθέσεων που περιγράφονται από τους Charles Bouillaguet, Pierre-Alain Fouque, Adi Shamir και Sebastien Zimmer στο
Δεύτερες επιθέσεις προεικόνας σε συναρτήσεις κατακερματισμού με διάσπαση, εκτός από τους δύο κατακερματισμούς, στη συνένωση θα πρέπει να προστεθεί και το ύψος μέσα στο δέντρο.

Καθώς προσθέτετε στοιχεία στον συσσωρευτή, πρέπει να παρακολουθείτε ποια ριζικά στοιχεία έχουν αλλάξει. Ακολουθώντας τη διαδρομή αλλαγής των ριζικών στοιχείων για κάθε στοιχείο που προσθέτετε, μπορείτε αργότερα να δημιουργήσετε μια απόδειξη της παρουσίας αυτών των στοιχείων.

Παρακολουθήστε τις αλλαγές καθώς τις προσθέτετε

Για να παρακολουθήσετε τις αλλαγές που έγιναν, ας δηλώσουμε τη δομή Update, το οποίο θα αποθηκεύει δεδομένα σχετικά με τις αλλαγές κόμβων.

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

Για να προσθέσετε ένα στοιχείο στην μπαταρία, χρειάζεστε:

  • Δημιουργήστε μια σειρά από καλάθια ριζικών στοιχείων new_roots και τοποθετήστε τα υπάρχοντα ριζικά στοιχεία εκεί, ένα για κάθε κάδο:

Κώδικας

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

  • Προσθέστε τα στοιχεία που θα προστεθούν (πίνακας insertions) στο πρώτο καρότσι new_roots[0]:

Utreexo: συμπίεση πολλών UTXO Bitcoin

Κώδικας

new_roots[0].extend_from_slice(insertions);

  • Συνδυάστε τα αντικείμενα που προστέθηκαν στο πρώτο καλάθι με τα υπόλοιπα:
    • Για όλα τα καροτσάκια με περισσότερα από ένα είδη:
      1. Πάρτε δύο στοιχεία από την άκρη του καλαθιού, υπολογίστε τον γονέα τους, αφαιρέστε και τα δύο στοιχεία
      2. Προσθέστε τον υπολογισμένο γονέα στο επόμενο καλάθι

Utreexo: συμπίεση πολλών UTXO Bitcoin

Κώδικας

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

  • Μετακινήστε τα ριζικά στοιχεία από τα bins στον προκύπτοντα πίνακα συσσωρευτή

Κώδικας

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

Δημιουργία απόδειξης για πρόσθετα στοιχεία

Απόδειξη συμπερίληψης του στοιχείου στην μπαταρία (Proof) θα χρησιμεύσει ως το μονοπάτι Merkle, που αποτελείται από μια αλυσίδα ProofStep. Εάν το μονοπάτι δεν οδηγεί πουθενά, τότε η απόδειξη είναι εσφαλμένη.

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

Χρησιμοποιώντας τις πληροφορίες που ελήφθησαν νωρίτερα κατά την προσθήκη ενός στοιχείου (δομή Update), μπορείτε να δημιουργήσετε απόδειξη ότι ένα στοιχείο έχει προστεθεί στην μπαταρία. Για να το κάνουμε αυτό, περνάμε από τον πίνακα των αλλαγών που έγιναν και προσθέτουμε κάθε βήμα στο μονοπάτι της Merkle, το οποίο στη συνέχεια θα χρησιμεύσει ως απόδειξη:

Κώδικας

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

Διαδικασία δημιουργίας απόδειξης

Utreexo: συμπίεση πολλών UTXO Bitcoin

Έλεγχος της απόδειξης για ένα στοιχείο

Ο έλεγχος της απόδειξης συμπερίληψης ενός στοιχείου καταλήγει στο να ακολουθήσετε τη διαδρομή Merkle μέχρι να οδηγήσει σε ένα υπάρχον ριζικό στοιχείο:

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

Οπτικά:

Διαδικασία ελέγχου της απόδειξης για Α

Utreexo: συμπίεση πολλών UTXO Bitcoin

Αφαίρεση αντικειμένων

Για να αφαιρέσετε ένα στοιχείο από μια μπαταρία, πρέπει να προσκομίσετε έγκυρες αποδείξεις ότι το στοιχείο βρίσκεται εκεί. Χρησιμοποιώντας τα δεδομένα από την απόδειξη, είναι δυνατός ο υπολογισμός νέων ριζικών στοιχείων του συσσωρευτή για τα οποία η δεδομένη απόδειξη δεν θα είναι πλέον αληθής.

Ο αλγόριθμος έχει ως εξής:

  1. Όπως και με την προσθήκη, οργανώνουμε ένα σύνολο άδειων καλαθιών που αντιστοιχούν στα δέντρα Merkle με ύψος ίσο με τη δύναμη δύο από τον δείκτη του καλαθιού
  2. Εισάγουμε στοιχεία από τα βήματα της διαδρομής Merkle στα καλάθια. ο δείκτης του καλαθιού είναι ίσος με τον αριθμό του τρέχοντος βήματος
  3. Αφαιρούμε το ριζικό στοιχείο στο οποίο οδηγεί η διαδρομή από την απόδειξη
  4. Όπως και με την προσθήκη, υπολογίζουμε νέα στοιχεία ρίζας συνδυάζοντας στοιχεία από καλάθια σε ζεύγη και μετακινώντας το αποτέλεσμα της ένωσης στο επόμενο καλάθι

Κώδικας

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

Η διαδικασία αφαίρεσης του στοιχείου "Α":
Utreexo: συμπίεση πολλών UTXO Bitcoin

Ενσωμάτωση σε υπάρχον δίκτυο

Χρησιμοποιώντας τον προτεινόμενο συσσωρευτή, οι κόμβοι μπορούν να αποφύγουν τη χρήση DB για την αποθήκευση όλων των UTXO, ενώ μπορούν να αλλάξουν το σύνολο UTXO. Ωστόσο, προκύπτει το πρόβλημα της εργασίας με στοιχεία.

Ας καλέσουμε τον κόμβο επικύρωσης που χρησιμοποιεί τον συσσωρευτή UTXO συμπαγής (κόμβος συμπαγούς κατάστασης) και ο επικυρωτής χωρίς συσσωρευτή είναι ολοκληρώστε (πλήρης κόμβος). Η ύπαρξη δύο τάξεων κόμβων δημιουργεί πρόβλημα για την ενσωμάτωσή τους σε ένα ενιαίο δίκτυο, καθώς οι συμπαγείς κόμβοι απαιτούν απόδειξη της ύπαρξης UTXO, που δαπανώνται σε συναλλαγές, ενώ οι πλήρεις κόμβοι όχι. Εάν όλοι οι κόμβοι δικτύου δεν αλλάξουν ταυτόχρονα και με συντονισμένο τρόπο στη χρήση του Utreexo, τότε οι συμπαγείς κόμβοι θα μείνουν πίσω και δεν θα μπορούν να λειτουργήσουν στο δίκτυο Bitcoin.

Για την επίλυση του προβλήματος της ενσωμάτωσης συμπαγών κόμβων στο δίκτυο, προτείνεται η εισαγωγή μιας πρόσθετης κατηγορίας κόμβων - γέφυρες. Ένας κόμβος γέφυρας είναι ένας πλήρης κόμβος που αποθηκεύει επίσης την μπαταρία Utreexo και την προστασία ενεργοποίησης όλα UTXO από το σύνολο UTXO. Οι γέφυρες υπολογίζουν νέους κατακερματισμούς και ενημερώνουν τον συσσωρευτή και τις αποδείξεις καθώς φτάνουν νέα μπλοκ συναλλαγών. Η συντήρηση και η ενημέρωση του συσσωρευτή και των δοκιμών δεν επιβάλλει πρόσθετο υπολογιστικό φορτίο σε τέτοιους κόμβους. Οι γέφυρες θυσιάζουν χώρο στο δίσκο: πρέπει να κρατάμε τα πράγματα οργανωμένα Utreexo: συμπίεση πολλών UTXO Bitcoin hashes, σε σύγκριση με Utreexo: συμπίεση πολλών UTXO Bitcoin hashes για συμπαγείς κόμβους, όπου n είναι η ισχύς του συνόλου UTXO.

Αρχιτεκτονική δικτύου

Utreexo: συμπίεση πολλών UTXO Bitcoin

Οι γέφυρες καθιστούν δυνατή τη σταδιακή προσθήκη συμπαγών κόμβων στο δίκτυο χωρίς αλλαγή του λογισμικού των υπαρχόντων κόμβων. Οι πλήρεις κόμβοι λειτουργούν όπως πριν, διανέμοντας συναλλαγές και μπλοκ μεταξύ τους. Οι κόμβοι γέφυρας είναι πλήρεις κόμβοι που αποθηκεύουν επιπλέον δεδομένα μπαταρίας Utreexo και ένα σύνολο αποδείξεων συμπερίληψης για όλα UTXO προς το παρόν. Ο κόμβος γέφυρας δεν διαφημίζεται ως τέτοιος, προσποιούμενος ότι είναι ένας πλήρης κόμβος για όλους τους πλήρεις κόμβους και ένας συμπαγής κόμβος για όλους τους συμπαγείς. Αν και οι γέφυρες συνδέουν και τα δύο δίκτυα μαζί, στην πραγματικότητα χρειάζεται να τα συνδέσουν μόνο προς μία κατεύθυνση: από τους υπάρχοντες πλήρεις κόμβους σε συμπαγείς κόμβους. Αυτό είναι δυνατό επειδή η μορφή συναλλαγής δεν χρειάζεται να αλλάξει και οι αποδείξεις UTXO για συμπαγείς κόμβους μπορούν να απορριφθούν, έτσι οποιοσδήποτε συμπαγής κόμβος μπορεί παρομοίως να μεταδίδει συναλλαγές σε όλους τους συμμετέχοντες στο δίκτυο χωρίς τη συμμετοχή κόμβων γέφυρας.

Συμπέρασμα

Εξετάσαμε την μπαταρία Utreexo και εφαρμόσαμε το πρωτότυπό της στο Rust. Εξετάσαμε την αρχιτεκτονική δικτύου που θα επιτρέψει την ενσωμάτωση κόμβων που βασίζονται σε μπαταρίες. Το πλεονέκτημα των συμπαγών συλλήψεων είναι το μέγεθος των αποθηκευμένων δεδομένων, το οποίο εξαρτάται λογαριθμικά από την ισχύ του συνόλου των UTXO, γεγονός που μειώνει σημαντικά τις απαιτήσεις για χώρο στο δίσκο και την απόδοση αποθήκευσης για τέτοιους κόμβους. Το μειονέκτημα είναι η πρόσθετη κίνηση κόμβου για τη μετάδοση αποδείξεων, αλλά οι τεχνικές συγκέντρωσης στοιχείων (όταν μια απόδειξη αποδεικνύει την ύπαρξη πολλών στοιχείων) και η προσωρινή αποθήκευση μπορούν να βοηθήσουν στη διατήρηση της κυκλοφορίας εντός αποδεκτών ορίων.

παραπομπές:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο