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.
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:
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 talanoainamuamua.
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 , 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 , 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.
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.
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]:
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:
Ave ni elemene se lua mai le pito o le ato, fuafua o latou matua, aveese uma elemene
Faaopoopo le matua fuafuaina i le isi taavaletoso
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:
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, ¤t_parent)
} else {
parent(¤t_parent, &s.hash)
};
}
current_parent == expected
} else {
false
}
}
Va'ai:
Fa'agasologa o le siakiina o fa'amaoniga mo A
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:
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.
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
Matou te aveese le elemene aʻa lea e tau atu i ai le ala mai le faʻamaoniga
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":
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 Hashes, faatusatusa i Hashes mo nodes fa'akomepiuta, o le n o le mana o le seti UTXO.
Feso'ota'iga fausaga
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.