
Äau Habr!
Bitcoin tÄ«klÄ visi mezgli vienprÄtÄ«gi vienojas par UTXO komplektu: cik monÄtu ir pieejams tÄriÅiem, kam tieÅ”i un ar kÄdiem nosacÄ«jumiem. UTXO kopa ir minimÄlÄ datu kopa, kas nepiecieÅ”ama validatora mezglam, bez kuras mezgls nevarÄs pÄrbaudÄ«t ienÄkoÅ”o transakciju un tos saturoÅ”o bloku derÄ«gumu.
Å ajÄ sakarÄ visos iespÄjamos veidos tiek mÄÄ£inÄts samazinÄt Ŕīs kopas saglabÄto attÄlojumu, saspiest to, nezaudÄjot droŔības garantijas. Jo mazÄks ir saglabÄto datu apjoms, jo zemÄkas ir diska vietas prasÄ«bas validatora mezglam, kas padara validatora mezgla palaiÅ”anu lÄtu, ļauj paplaÅ”inÄt tÄ«klu un tÄdÄjÄdi palielinÄt tÄ«kla stabilitÄti.
Å ajÄ ziÅÄ mÄs ievietosim Rust prototipu nesenam lÄ«dzautora priekÅ”likumam , SÄkot no , kas ļauj samazinÄt diska vietas prasÄ«bas validatora mezgliem.
KÄda ir problÄma?
Viena no Bitcoin daudzgadÄ«gajÄm problÄmÄm ir tÄ mÄrogojamÄ«ba. Ideja par āsavu bankuā pieprasa tÄ«kla dalÄ«bniekiem veikt visu lietoÅ”anai pieejamo lÄ«dzekļu uzskaiti. Bitcoin pieejamie lÄ«dzekļi tiek izteikti kÄ neiztÄrÄto rezultÄtu kopums - UTXO komplekts. Lai gan tas nav Ä«paÅ”i intuitÄ«vs attÄlojums, tas ir izdevÄ«gÄks ievieÅ”anas veiktspÄjas ziÅÄ, salÄ«dzinot ar attÄlojumu, kurÄ katram "makam" ir "lÄ«dzsvars" kÄ atseviŔķs ieraksts, un tas arÄ« palielina privÄtumu (piem., ).
Ir svarÄ«gi atŔķirt darÄ«jumu vÄsturi (to sauc par blokÄ·Ädi) no sistÄmas paÅ”reizÄjÄ stÄvokļa. Bitcoin darÄ«jumu vÄsture Å”obrÄ«d aizÅem aptuveni 200 GB diska vietas un turpina augt. TomÄr sistÄmas stÄvoklis ir daudz mazÄks, apmÄram 4 GB, un Åem vÄrÄ tikai to, ka kÄdam paÅ”laik pieder monÄtas. ArÄ« Å”o datu apjoms laika gaitÄ palielinÄs, taÄu daudz lÄnÄk un dažkÄrt pat mÄdz samazinÄties (sk. CDPV).
Vieglie klienti (SPV) tirgo droŔības garantijas spÄjai saglabÄt tikai privÄtÄs atslÄgas minimÄlo stÄvokli (UTXO-set).
UTXO un UTXO komplekts
UTXO (Unspent Transaction Output) ir neiztÄrÄtÄ darÄ«juma izvade, katra darÄ«jumos pÄrsÅ«tÄ«tÄ Satoshi ceļojuma beigu punkts. NeiztÄrÄtie rezultÄti kļūst par jaunu transakciju ievadi un tÄdÄjÄdi tiek iztÄrÄti (iztÄrÄti) un noÅemti no UTXO kopas.
Jauni UTXO vienmÄr tiek izveidoti ar transakcijÄm:
- monÄtu bÄzes darÄ«jumi bez ievades: izveidojiet jaunus UTXO, kad kalnraÄi izdod monÄtas
- regulÄri darÄ«jumi: izveidojiet jaunus UTXO, vienlaikus iztÄrÄjot noteiktu esoÅ”o UTXO kopu
Darba process ar UTXO:

Maki uzskaita tÄriÅiem pieejamo monÄtu skaitu (bilance), pamatojoties uz UTXO apjomu, kas pieejams Å”im makam tÄriÅiem.
Katram validatora mezglam, lai novÄrstu dubultus tÄriÅu mÄÄ£inÄjumus, ir jÄuzrauga kopa viss UTXO pÄrbaudot katrs darÄ«jumiem no katra bloÄ·Ät.
Mezglam ir jÄbÅ«t loÄ£ikai:
- PapildinÄjumi UTXO komplektam
- Svītrojumi no UTXO komplekta
- Viena UTXO klÄtbÅ«tnes pÄrbaude komplektÄ
Ir veidi, kÄ samazinÄt prasÄ«bas saglabÄtajai informÄcijai par kopu, vienlaikus saglabÄjot iespÄju pievienot un noÅemt elementus, pÄrbaudÄ«t un pierÄdÄ«t elementa esamÄ«bu komplektÄ, izmantojot .
Baterijas priekÅ” UTXO
Ideja izmantot akumulatorus vairÄku UTXO uzglabÄÅ”anai .
UTXO komplekts tiek veidots lidojuma laikÄ, sÄkotnÄjÄs bloka lejupielÄdes (IBD) laikÄ, tiek saglabÄts pilnÄ«bÄ un pastÄvÄ«gi, savukÄrt tÄ saturs mainÄs pÄc transakciju apstrÄdes no katra jauna un pareiza tÄ«kla bloka. Å im procesam ir nepiecieÅ”ams lejupielÄdÄt aptuveni 200 GB bloku datu un pÄrbaudÄ«t simtiem miljonu ciparparakstu. PÄc IBD procesa pabeigÅ”anas UTXO komplekts aizÅems aptuveni 4 GB.
TomÄr, izmantojot akumulatorus, vienprÄtÄ«bas noteikumi attiecÄ«bÄ uz lÄ«dzekļiem tiek samazinÄti lÄ«dz kriptogrÄfisko pierÄdÄ«jumu pÄrbaudei un Ä£enerÄÅ”anai, un pieejamo lÄ«dzekļu izsekoÅ”anas slogs tiek pÄrnests uz Å”o lÄ«dzekļu Ä«paÅ”nieku, kurÅ” sniedz pierÄdÄ«jumus par to esamÄ«bu un Ä«paÅ”umtiesÄ«bÄm.
Akumulatoru var saukt par kompaktu kopas attÄlojumu. SaglabÄtÄ attÄla izmÄram jÄbÅ«t nemainÄ«gam
, vai palielinÄs sublineÄri attiecÄ«bÄ pret kopas kardinalitÄti un paÅ”a elementa izmÄru, piemÄram,
, kur n ir saglabÄtÄs kopas kardinalitÄte.
Å ÄdÄ gadÄ«jumÄ akumulatoram ir jÄļauj Ä£enerÄt pierÄdÄ«jumu par elementa iekļauÅ”anu komplektÄ (iekļauÅ”anas pierÄdÄ«jums) un jÄrada iespÄja efektÄ«vi pÄrbaudÄ«t Å”o pierÄdÄ«jumu.
Akumulatoru sauc dinamisks ja ļauj pievienot elementus un noÅemt elementus no kopas.
Å Äda akumulatora piemÄrs varÄtu bÅ«t . Å Ädam akumulatoram ir nemainÄ«gs saglabÄtÄ attÄlojuma lielums, taÄu tam ir nepiecieÅ”ama klÄtbÅ«tne kopÄ«gs noslÄpums (uzticama iestatīŔana). Å Ä« prasÄ«ba noliedz Å”Äda akumulatora piemÄrojamÄ«bu neuzticamiem tÄ«kliem, piemÄram, Bitcoin, jo datu noplÅ«de slepenÄs Ä£enerÄÅ”anas laikÄ var ļaut uzbrucÄjiem izveidot viltus pierÄdÄ«jumus par UTXO esamÄ«bu, maldinot mezglus ar UTXO komplektu, kura pamatÄ ir Å”Äds akumulators.
Utreekso
Thaddeus Dryja piedÄvÄtais Utreexo dizains ļauj radÄ«t dinamisks akumulators bez uzticama iestatīŔana.
Utreexo ir perfekta binÄra mežs un ir ideju attÄ«stÄ«ba, kas tika prezentÄta , pievienojot iespÄju noÅemt elementus no komplekta.
Akumulatora loÄ£iskÄ struktÅ«ra
Akumulatora Ŕūnas ir izvietotas ideÄlu binÄro koku mežÄ. Koki ir sakÄrtoti pÄc augstuma. Å is attÄlojums tika izvÄlÄts kÄ vizuÄlÄkais un ļauj vizualizÄt koku saplūŔanu darbÄ«bas laikÄ ar akumulatoru.
Autore atzÄ«mÄ, ka, tÄ kÄ visi meÅ¾Ä esoÅ”ie koki ir ideÄli, to augstums tiek izteikts kÄ pakÄpÄ divi, tÄpat kÄ jebkuru naturÄlu skaitli var attÄlot kÄ divu pakÄpju summu. AttiecÄ«gi jebkuru lapu kopu var grupÄt binÄros kokos, un visos gadÄ«jumos jauna elementa pievienoÅ”ana prasa zinÄÅ”anas tikai par glabÄjamo koku sakÅu mezgliem.
TÄdÄjÄdi saglabÄtais Utreexo akumulatora attÄlojums ir saknes mezglu saraksts (Merkle sakne), un ne viss koku mežs.
Saknes elementu sarakstu attÄlosim kÄ Vec<Option<Hash>>. IzvÄles veids Option<Hash> norÄda, ka var trÅ«kt saknes elementa, kas nozÄ«mÄ, ka akumulatorÄ nav koka ar atbilstoÅ”u augstumu.
/// 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],
}
}
}Elementu pievienoŔana
Vispirms aprakstÄ«sim funkciju parent(), kas atpazÄ«st divu norÄdÄ«to elementu vecÄku mezglu.
vecÄku() funkcija
TÄ kÄ mÄs izmantojam Merkles kokus, katra no diviem mezgliem vecÄks ir viens mezgls, kas glabÄ pakÄrtoto mezglu jaucÄjvÄrdu sajaukÅ”anu:
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[..])
}Autors atzÄ«mÄ, ka, lai novÄrstu uzbrukumus, kurus aprakstÄ«ja ÄÄrlzs BuljÄ, PjÄrs AlÄns Fouque, Adi Å amirs un Sebastjens Cimmers
, papildus divÄm jaukÅ”anÄm, savienojumam jÄpievieno arÄ« augstums koka iekÅ”pusÄ.
Pievienojot elementus akumulatoram, jums ir jÄseko lÄ«dzi, kuri saknes elementi tiek mainÄ«ti. Sekojot katra pievienotÄ elementa saknes elementu maiÅas ceļam, vÄlÄk varat izveidot pierÄdÄ«jumu par Å”o elementu klÄtbÅ«tni.
Izsekojiet izmaiÅÄm, kad tÄs pievienojat
Lai izsekotu veiktajÄm izmaiÅÄm, deklarÄsim struktÅ«ru Update, kurÄ tiks saglabÄti dati par mezglu izmaiÅÄm.
#[derive(Debug)]
pub struct Update<'a> {
pub utreexo: &'a mut Utreexo,
// ProofStep Ń
ŃŠ°Š½ŠøŃ "ŃŠ¾ŃеГа" ŃŠ»ŠµŠ¼ŠµŠ½Ńа Šø его положение
pub updated: HashMap<Hash, ProofStep>,
}Lai akumulatoram pievienotu elementu, jums ir nepiecieŔams:
- Izveidojiet sakÅu elementu grozu masÄ«vu
new_rootsun ievietojiet tur esoŔos saknes elementus, pa vienam katram spainim:
Kods
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);
}- Pievienojiet pievienojamos elementus (masīvs
insertions) uz pirmo grozunew_roots[0]:

Kods
new_roots[0].extend_from_slice(insertions);- Apvienojiet pirmajam grozam pievienotÄs preces ar pÄrÄjÄm:
- Visiem groziem ar vairÄkÄm precÄm:
- PaÅemiet divus elementus no groza gala, aprÄÄ·iniet to vecÄkus, noÅemiet abus elementus
- Pievienojiet aprÄÄ·inÄto vecÄku nÄkamajam grozam
- Visiem groziem ar vairÄkÄm precÄm:

Kods
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 });
}
}- PÄrvietojiet saknes elementus no tvertnÄm uz iegÅ«to akumulatoru masÄ«vu
Kods
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]);
}
}PierÄdÄ«juma izveide pievienotajiem elementiem
PierÄdÄ«jums par elementa iekļauÅ”anu akumulatorÄ (Proof) kalpos kÄ Merkles ceļŔ, kas sastÄv no Ä·Ädes ProofStep. Ja ceļŔ nekur neved, tad pierÄdÄ«jums ir nepareizs.
/// ŠŠ“ŠøŠ½ŠøŃŠ½Ńй ŃŠ°Š³ на ŠæŃŃŠø Šŗ ŃŠ»ŠµŠ¼ŠµŠ½ŃŃ Š² Š“ŠµŃŠµŠ²Šµ ŠŠµŃкла.
#[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,
}IepriekÅ” iegÅ«tÄs informÄcijas izmantoÅ”ana, pievienojot elementu (struktÅ«ru Update), varat izveidot pierÄdÄ«jumu, ka akumulatoram ir pievienots elements. Lai to izdarÄ«tu, mÄs apskatÄm veikto izmaiÅu tabulu un pievienojam Merkles ceļam katru soli, kas vÄlÄk kalpos kÄ pierÄdÄ«jums:
Kods
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
}
}PierÄdÄ«juma izveides process

Elementa pierÄdÄ«juma pÄrbaude
Elementa iekļauÅ”anas pierÄdÄ«juma pÄrbaude nozÄ«mÄ, ka jÄseko Merkles ceļam, lÄ«dz tas noved pie esoÅ”a saknes elementa:
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
}
}VizuÄli:
A pierÄdÄ«juma pÄrbaudes process

Vienumu noÅemÅ”ana
Lai izÅemtu elementu no akumulatora, jums ir jÄsniedz derÄ«gs pierÄdÄ«jums tam, ka baterija tur atrodas. Izmantojot pierÄdÄ«juma datus, var aprÄÄ·inÄt jaunus akumulatora saknes elementus, kuriem dotais pierÄdÄ«jums vairs nebÅ«s patiess.
Algoritms ir Å”Äds:
- TÄpat kÄ papildus, mÄs organizÄjam tukÅ”u grozu komplektu, kas atbilst Merkles kokiem ar augstumu, kas vienÄds ar divu jaudu no groza indeksa
- GrozÄs ievietojam elementus no Merkles takas pakÄpieniem; groza indekss ir vienÄds ar paÅ”reizÄjÄ soļa skaitli
- MÄs noÅemam saknes elementu, uz kuru ved ceļŔ no pierÄdÄ«juma
- TÄpat kÄ pievienojot, mÄs aprÄÄ·inÄm jaunus saknes elementus, apvienojot elementus no groziem pa pÄriem un pÄrvietojot apvienoÅ”anas rezultÄtu uz nÄkamo grozu
Kods
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;
}
}Elementa "A" noÅemÅ”anas process:

IntegrÄcija esoÅ”ajÄ tÄ«klÄ
Izmantojot piedÄvÄto akumulatoru, mezgli var izvairÄ«ties no DB izmantoÅ”anas visu UTXO glabÄÅ”anai, vienlaikus spÄjot mainÄ«t UTXO kopu. TomÄr rodas problÄma darbÄ ar pierÄdÄ«jumiem.
Sauksim validatora mezglu, kas izmanto UTXO akumulatoru kompakts (kompaktÄ stÄvokļa mezgls), un validators bez akumulatora ir pabeigts (pilns mezgls). Divu mezglu klaÅ”u esamÄ«ba rada problÄmas to integrÄÅ”anai vienÄ tÄ«klÄ, jo kompaktiem mezgliem ir nepiecieÅ”ams pierÄdÄ«jums par UTXO esamÄ«bu, kas tiek iztÄrÄti darÄ«jumos, bet pilnajiem mezgliem nav. Ja visi tÄ«kla mezgli vienlaikus un saskaÅoti nepÄries uz Utreexo lietoÅ”anu, tad kompaktie mezgli atpaliks un nespÄs darboties Bitcoin tÄ«klÄ.
Lai atrisinÄtu kompakto mezglu integrÄÅ”anas tÄ«klÄ problÄmu, tiek ierosinÄts ieviest papildu mezglu klasi - tilti. Tilta mezgls ir pilnÄ«gs mezgls, kurÄ glabÄjas arÄ« Utreexo akumulators un ieslÄgÅ”anas apliecinÄjums viss UTXO no UTXO komplekta. Tilti aprÄÄ·ina jaunus jaucÄjus un atjaunina akumulatoru un pierÄdÄ«jumus, kad tiek saÅemti jauni darÄ«jumu bloki. Akumulatora un pierÄdÄ«jumu uzturÄÅ”ana un atjauninÄÅ”ana Å”Ädiem mezgliem neuzliek papildu skaitļoÅ”anas slodzi. Tilti upurÄ vietu diskÄ: nepiecieÅ”ams sakÄrtot lietas
hashes, salīdzinot ar
jaucÄjvÄrtÄ«bas kompaktajiem mezgliem, kur n ir UTXO kopas jauda.
Tīkla arhitektūra

Tilti ļauj pakÄpeniski pievienot tÄ«klam kompaktus mezglus, nemainot esoÅ”o mezglu programmatÅ«ru. Pilni mezgli darbojas tÄpat kÄ iepriekÅ”, sadalot darÄ«jumus un blokus savÄ starpÄ. Tilta mezgli ir pilni mezgli, kas papildus saglabÄ Utreexo akumulatora datus un iekļauÅ”anas pierÄdÄ«jumu kopu viss PagaidÄm UTXO. Tilta mezgls sevi kÄ tÄdu nereklamÄ, izliekoties par pilnu mezglu visiem pilnajiem mezgliem un par kompakto mezglu visiem kompaktajiem. Lai gan tilti savieno abus tÄ«klus kopÄ, tie faktiski ir jÄsavieno tikai vienÄ virzienÄ: no esoÅ”ajiem pilnajiem mezgliem lÄ«dz kompaktajiem mezgliem. Tas ir iespÄjams, jo transakcijas formÄts nav jÄmaina, un UTXO apliecinÄjumus kompaktajiem mezgliem var izmest, tÄpÄc jebkurÅ” kompaktais mezgls var lÄ«dzÄ«gi pÄrraidÄ«t transakcijas visiem tÄ«kla dalÄ«bniekiem bez tilta mezglu lÄ«dzdalÄ«bas.
SecinÄjums
MÄs apskatÄ«jÄm Utreexo akumulatoru un ieviesÄm tÄ prototipu RustÄ. MÄs apskatÄ«jÄm tÄ«kla arhitektÅ«ru, kas ļaus integrÄt uz akumulatoru balstÄ«tus mezglus. Kompakto nozveju priekÅ”rocÄ«ba ir saglabÄto datu lielums, kas logaritmiski ir atkarÄ«gs no UTXO kopas jaudas, kas ievÄrojami samazina diska vietas un uzglabÄÅ”anas veiktspÄjas prasÄ«bas Å”Ädiem mezgliem. TrÅ«kums ir papildu mezglu trafika pierÄdÄ«jumu pÄrsÅ«tīŔanai, taÄu pierÄdÄ«jumu apkopoÅ”anas metodes (kad viens pierÄdÄ«jums pierÄda vairÄku elementu esamÄ«bu) un keÅ”atmiÅa var palÄ«dzÄt saglabÄt trafiku pieÅemamÄs robežÄs.
atsauces:
- SÄkot no
Avots: www.habr.com
