Sawubona Habr!
Kunethiwekhi ye-Bitcoin, wonke ama-node, ngokuvumelana, avumelana ngeqoqo le-UTXOs: zingaki izinhlamvu zemali ezitholakalayo zokusebenzisa, kubani ngokuqondile, futhi ngaphansi kwaziphi izimo. Isethi ye-UTXO iyisethi encane yedatha edingekayo ku-node yokuqinisekisa, ngaphandle kwalokho i-node ngeke ikwazi ukuqinisekisa ukufaneleka kokuthengiselana okungenayo kanye namabhulokhi aqukethe.
Mayelana nalokhu, imizamo yenziwa ngazo zonke izindlela zokunciphisa ukumelwa okugciniwe kwalesi sethi, ukuyicindezela ngaphandle kokulahlekelwa iziqinisekiso zokuphepha. Ivolumu encane yedatha egciniwe, iyancipha izidingo zesikhala sediski se-validator node, okwenza ukuqaliswa kwe-validator node kushibhile, kukuvumela ukuthi ukwandise inethiwekhi futhi ngaleyo ndlela ukwandise ukuzinza kwenethiwekhi.
Kulokhu okuthunyelwe sizothumela i-Rust prototype yesiphakamiso sakamuva esivela komunye umbhali
Yini inkinga?
Enye yezinkinga ezingapheli ze-Bitcoin kube ukuqina kwayo. Umqondo "webhange lakho" udinga abahlanganyeli benethiwekhi ukuthi bagcine amarekhodi azo zonke izimali ezitholakalayo ukuze zisetshenziswe. Ku-Bitcoin, izimali ezitholakalayo zivezwa njengesethi yemiphumela engasetshenzisiwe - isethi ye-UTXO. Nakuba lokhu kungekona ukumelwa okunembile, kunenzuzo mayelana nokusebenza okungaphezu kwesethulo lapho "isikhwama semali" ngasinye sine "bhalansi" njengokufakwa okuhlukile, futhi sengeza ubumfihlo (isb.
Kubalulekile ukuhlukanisa phakathi komlando wokuthengiselana (lokho okubizwa ngokuthi i-blockchain) kanye nesimo samanje sesistimu. Umlando wokuthengiselana we-Bitcoin njengamanje uthatha cishe u-200 GB wesikhala sediski, futhi uyaqhubeka nokukhula. Kodwa-ke, isimo sesistimu sincane kakhulu, nge-oda le-4 GB, futhi sicabangela kuphela iqiniso lokuthi othile okwamanje ungumnikazi wezinhlamvu zemali. Ivolumu yale datha nayo iyanda ngokuhamba kwesikhathi, kodwa ngenani eliphansi kakhulu futhi ngezinye izikhathi ivame ukwehla (bona i-CDPV).
ΠΡΠ³ΠΊΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ (SPV) ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡ Π³Π°ΡΠ°Π½ΡΠΈΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ Ρ ΡΠ°Π½ΠΈΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (UTXO-set), ΠΊΡΠΎΠΌΠ΅ ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ.
I-UTXO ne-UTXO-set
I-UTXO (Okukhiphayo Kokwenziwayo Okungasetshenzisiwe) okuphumayo kokwenziwe okungakasetshenziswa, indawo yokugcina yohambo lwe-Satoshi ngayinye edluliselwe kumisebenzi. Okuphumayo okungasetshenzisiwe kuba okokufaka kwemisebenzi emisha futhi ngaleyo ndlela kusetshenziswe (kuchithwe) futhi kukhishwe kusethi ye-UTXO.
Ama-UTXO amasha ahlala enziwa ngokuthengiselana:
- ukuthengiselana kwe-coinbase ngaphandle kokufaka: dala ama-UTXO amasha lapho abavukuzi bekhipha izinhlamvu zemali
- okwenziwa njalo: dala ama-UTXO amasha ngenkathi usebenzisa isethi ethile yama-UTXO akhona
ΠΡΠΎΡΠ΅ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ UTXO:
Izikhwama zibala inani lezinhlamvu zemali ezitholakalayo ukuze zisetshenziswe (ibhalansi) ngokusekelwe enanini le-UTXO elitholakala kulesi sikhwama ukuze lisetshenziswe.
I-validator nodi ngayinye, ukuvimbela imizamo yokuchitha kabili imali, kufanele igade isethi Π²ΡΠ΅Ρ UTXO uma ubheka ngamunye ukuthengiselana ngamunye vimba.
I-node kufanele ibe nengqondo:
- Izengezo ku-UTXO-set
- Ukususwa ku-UTXO-set
- Ihlola ubukhona be-UTXO eyodwa kusethi
Kunezindlela zokunciphisa izimfuneko zolwazi olugciniwe mayelana nesethi, kuyilapho ugcina ikhono lokwengeza nokukhipha izakhi, hlola futhi ufakazele ukuba khona kwesici kusethi kusetshenziswa.
Amabhethri e-UTXO
Umqondo wokusebenzisa amabhethri ukugcina ama-UTXO amaningi
I-UTXO-set yakhelwe empukaneni, ngesikhathi sokukhishwa kwe-block yokuqala (IBD), egcinwe ngokugcwele futhi unomphela, kuyilapho okuqukethwe kwayo kushintsha ngemva kokucubungula ukuthengiselana okuvela ku-block entsha nelungile yenethiwekhi. Le nqubo idinga ukulanda cishe u-200 GB wedatha yokuvimba nokuqinisekisa amakhulu ezigidi zamasiginesha edijithali. Ngemuva kokuthi inqubo ye-IBD isiqediwe, okubalulekile ukuthi i-UTXO-set izothatha cishe i-4 GB.
Kodwa-ke, ngama-accumulators, imithetho yokuvumelana kwezimali iyancipha ekuqinisekiseni nasekukhiqizeni ubufakazi be-cryptographic, futhi umthwalo wokulandelela izimali ezitholakalayo ushintshelwa kumnikazi walezo zimali, ohlinzeka ngobufakazi bokuthi zikhona kanye nobunikazi bazo.
I-accumulator ingabizwa ngokumelela okuhlangene kwesethi. Usayizi wesethulo esigciniwe kufanele sibe njalo , noma andise kancane kancane ngokuphathelene nekhadinali yesethi kanye nosayizi we-elementi ngokwayo, isibonelo , lapho u-n kuyikhadinali yesethi egciniwe.
ΠΡΠΈ ΡΡΠΎΠΌ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ (inclusion proof) ΠΈ Π΄Π°Π²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ.
Ibhethri libizwa inamandla uma ikuvumela ukuthi wengeze izakhi futhi ususe izakhi kusethi.
Isibonelo sebhethri elinjalo kungaba
Utreexo
ΠΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Π°Ρ Thaddeus Dryja ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Utreexo ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ inamandla ibhethri ngaphandle ukusetha okuthembekile.
Utreexo ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΡ Π»Π΅Ρ ΠΈΠ· ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΡ
Π΄Π²ΠΎΠΈΡΠ½ΡΡ
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ° Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ°
ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠ° ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π² Π²ΠΈΠ΄Π΅ Π»Π΅ΡΠ° ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π². ΠΠ΅ΡΠ΅Π²ΡΡ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Ρ ΠΏΠΎ Π²ΡΡΠΎΡΠ΅. ΠΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ±ΡΠ°Π½ΠΎ ΠΊΠ°ΠΊ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»ΠΈΡΠ½ΠΈΠ΅ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² Π² Ρ ΠΎΠ΄Π΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡΠΎΠΌ.
Umbhali uphawula ukuthi njengoba zonke izihlahla ezisehlathini zilungile, ukuphakama kwazo kuboniswa njengamandla amabili, njengoba nje noma iyiphi inombolo yemvelo ingamelwa njengesamba samandla amabili. Ngakho-ke, noma yiliphi iqoqo lamaqabunga lingahlanganiswa libe yizihlahla kanambambili, futhi kuzo zonke izimo, ukwengeza isici esisha kudinga ulwazi kuphela mayelana nezimpande zezihlahla ezigciniwe.
Ngakho-ke, ukumelwa okugciniwe kwe-accumulator ye-Utreexo kuwuhlu lwamanodi ezimpande (impande ye-Merkle), hhayi lonke ihlathi lezihlahla.
Ake simele uhlu lwezimpande njenge Vec<Option<Hash>>
. Uhlobo lokuzikhethela Option<Hash>
kubonisa ukuthi ingxenye yempande kungenzeka ingekho, okusho ukuthi asikho isihlahla esinobude obufanele ku-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],
}
}
}
Ukwengeza izakhi
Okokuqala, ake sichaze umsebenzi parent()
, ebona inodi yomzali yezakhi ezimbili ezinikeziwe.
parent() umsebenzi
Njengoba sisebenzisa izihlahla ze-Merkle, umzali wenodi ngayinye kwamabili uyinodi eyodwa egcina i-hashi yokuhlangana kwama-hashe wamanodi ezingane:
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[..])
}
Umbhali uphawula ukuthi ukuvimbela ukuhlaselwa okuchazwe nguCharles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, noSebastien Zimmer e.
Π Ρ ΠΎΠ΄Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΡΠ½Π΅Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ. Π‘Π»Π΅Π΄ΡΡ ΠΏΠΎ ΠΏΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΡΠ½Π΅Π²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π½Π°Π»ΠΈΡΠΈΡ ΡΡΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
Landelela izinguquko njengoba uzengeza
Ukulandelela izinguquko ezenziwe, masimemezele isakhiwo Update
, ezogcina idatha mayelana nezinguquko zenodi.
#[derive(Debug)]
pub struct Update<'a> {
pub utreexo: &'a mut Utreexo,
// ProofStep Ρ
ΡΠ°Π½ΠΈΡ "ΡΠΎΡΠ΅Π΄Π°" ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
pub updated: HashMap<Hash, ProofStep>,
}
ΠΠ»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ, Π½ΡΠΆΠ½ΠΎ:
- Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΠΊΠΎΡΠ·ΠΈΠ½ ΠΊΠΎΡΠ½Π΅Π²ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
new_roots
bese ubeka izakhi zempande ezikhona lapho, eyodwa ngebhakede ngalinye:
Ikhodi
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);
}
- Yengeza ama-elementi azokwengezwa (amalungu afanayo
insertions
) enqoleni yokuqalanew_roots[0]
:
Ikhodi
new_roots[0].extend_from_slice(insertions);
- Hlanganisa izinto ezengezwe kubhasikidi wokuqala nezinye:
- Kuwo wonke amakalishi anezinto ezingaphezu kweyodwa:
- Thatha izakhi ezimbili kusukela ekupheleni kubhasikidi, bala umzali wabo, susa izakhi zombili
- Engeza umzali obaliwe enqoleni elandelayo
- Kuwo wonke amakalishi anezinto ezingaphezu kweyodwa:
Ikhodi
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 });
}
}
- Hambisa izakhi zezimpande zisuka emigqonyeni ziye kuhlelo lwe-accumulator oluwumphumela
Ikhodi
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]);
}
}
Ukudala ubufakazi bezinto ezengeziwe
Ubufakazi bokufakwa kweseli ebhethrini (Proof
) izosebenza njengeMerkle Path, ehlanganisa iketango ProofStep
. Uma indlela ingayi ndawo, khona-ke ubufakazi abulungile.
/// ΠΠ΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΡΠ°Π³ Π½Π° ΠΏΡΡΠΈ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² Π΄Π΅ΡΠ΅Π²Π΅ ΠΠ΅ΡΠΊΠ»Π°.
#[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,
}
Ukusebenzisa ulwazi olutholwe ngaphambilini lapho wengeza i-elementi (isakhiwo Update
), ungakha ubufakazi bokuthi into ethile yengeziwe ebhethrini. Ukwenza lokhu, sidlula kuthebula lezinguquko ezenziwe futhi sengeza isinyathelo ngasinye endleleni ka-Merkle, ezosebenza njengobufakazi:
Ikhodi
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
}
}
Inqubo yokudala ubufakazi
Ihlola ubufakazi bento ethile
Ukuhlola ubufakazi bokufakwa kwe-elementi kubikela ekulandeleni indlela ye-Merkle kuze kube kuholela entweni ekhona yempande:
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
}
}
Ngokubukeka:
Inqubo yokuhlola ubufakazi buka-A
Ikhipha izinto
Ukukhipha iseli ebhethrini, kufanele unikeze ubufakazi obusebenzayo bokuthi iseli likhona. Ngokusebenzisa idatha evela ebufakazini, kungenzeka ukubala izici ezintsha zezimpande ze-accumulator lapho ubufakazi obunikeziwe bungeke busaba iqiniso.
I-algorithm imi kanjena:
- Njengokwengeza, sihlela isethi yamabhasikidi angenalutho ahambisana nezihlahla ze-Merkle ezinobude obulingana namandla amabili asuka kunkomba kabhasikidi.
- Sifaka izakhi ezivela ezinyathelweni zendlela ye-Merkle kubhasikidi; inkomba yebhasikidi ilingana nenani lesinyathelo samanje
- Π£Π΄Π°Π»ΡΠ΅ΠΌ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΏΡΡΡ ΠΈΠ· Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π°
- Njengokwengeza, sibala izakhi zezimpande ezintsha ngokuhlanganisa izakhi ukusuka kubhasikidi ngamabili bese sihambisa umphumela wenyunyana siwuyise kubhasikidi olandelayo.
Ikhodi
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;
}
}
Inqubo yokususa isici "A":
Ukuhlanganiswa kunethiwekhi ekhona
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ, ΡΠ·Π»Ρ ΠΌΠΎΠ³ΡΡ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ UTXO, ΡΠΎΡ ΡΠ°Π½ΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ UTXO-set. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π°ΠΌΠΈ.
Ake sibize i-validator node esebenzisa i-accumulator ye-UTXO kuhlangene (i-compact-state node), kanye ne-validator ngaphandle kwe-accumulator ephelele (i-node ephelele). Ukuba khona kwamakilasi amabili ama-node kudala inkinga yokuwahlanganisa kunethiwekhi eyodwa, ngoba ama-compact nodes adinga ubufakazi bokuthi kukhona ama-UTXO, asetshenziselwa ukuthengiselana, kuyilapho ama-node agcwele engenzi. Uma wonke ama-node enethiwekhi engashintshi ngesikhathi esisodwa futhi ngendlela ehlelekile ekusebenziseni i-Utreexo, khona-ke ama-compact nodes azosala futhi ngeke akwazi ukusebenza kunethiwekhi ye-Bitcoin.
Ukuxazulula inkinga yokuhlanganisa ama-compact node kunethiwekhi, kuhlongozwa ukwethula iklasi elengeziwe lama-node - amabhuloho. Indawo yebhuloho iyinodi ephelele ephinde igcine ibhethri le-Utreexo kanye nobufakazi bamandla Π²ΡΠ΅Ρ I-UTXO evela ku-UTXO-set. Amabhuloho abala ama-hashe amasha futhi abuyekeze i-accumulator nobufakazi njengoba amabhulokhi amasha okuthenga efika. Ukugcina nokuvuselela i-accumulator nobufakazi akubeki umthwalo owengeziwe wokubala kumanodi anjalo. Amabhuloho adela isikhala sediski: isidingo sokugcina izinto zihlelekile Ρ Π΅ΡΠ΅ΠΉ, ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ama-hashes ama-compact nodes, lapho u-n engamandla esethi ye-UTXO.
Isakhiwo senethiwekhi
Amabhuloho enza kube nokwenzeka ukwengeza kancane kancane ama-compact nodes kunethiwekhi ngaphandle kokushintsha isofthiwe yama-node akhona. Ama-node agcwele asebenza njengakuqala, asabalalisa ukuthengiselana namabhulokhi phakathi kwawo. Ama-Bridge node angama-node agcwele agcina futhi idatha yebhethri ye-Utreexo kanye nesethi yobufakazi bokufakwa kwayo Π²ΡΠ΅Ρ UTXO okwamanje. I-node yebhuloho ayizikhangisi kanjalo, izenza i-node egcwele yawo wonke ama-node agcwele kanye ne-compact node yawo wonke ahlangene. Nakuba amabhuloho exhumanisa amanethiwekhi womabili ndawonye, ββempeleni adinga kuphela ukuwaxhuma endaweni eyodwa: ukusuka kuma-node akhona agcwele kuya kuma-compact node. Lokhu kungenzeka ngoba ifomethi yokuthengiselana ayidingi ukushintshwa, futhi ubufakazi be-UTXO bama-compact node bungalahlwa, ngakho noma iyiphi i-compact node ingasakaza ngokufanayo ukuthengiselana kubo bonke abahlanganyeli benethiwekhi ngaphandle kokubamba iqhaza kwamanodi ebhuloho.
isiphetho
Sibheke ibhethri le-Utreexo futhi sasebenzisa i-prototype yayo ku-Rust. Sibheke ukwakheka kwenethiwekhi okuzovumela ukuhlanganiswa kwamanodi asekelwe kubhethri. Inzuzo yokubamba okuhlangene ubukhulu bedatha egciniwe, okuncike nge-logarithmically emandleni esethi ye-UTXOs, okunciphisa kakhulu izidingo zesikhala sediski nokusebenza kokugcinwa kwamanode anjalo. Ububi ubuningi bethrafikhi ye-node eyengeziwe yokudlulisa ubufakazi, kodwa amasu okuhlanganisa ubufakazi (lapho ubufakazi obubodwa bufakazela ukuba khona kwezinto ezimbalwa) kanye nokugcinwa kwesikhashana kungasiza ukugcina ithrafikhi ingaphakathi kwemikhawulo eyamukelekayo.
izithenjwa:
I-GitHub ye-Utreexo prototype e-Rust Thaddeus Dryja -I-Utreexo: i-accumulator eguquguqukayo esekwe ku-hash elungiselelwe isethi ye-Bitcoin UTXO ΠΠ½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΠΈ ΠΈΠ· ΡΡΠ°ΡΡΠΈ
Source: www.habr.com