Shabakadda Bitcoin, dhammaan qanjidhada, iyada oo loo marayo is-afgarad, waxay ku heshiiyaan qaybo UTXO ah: inta qadaadiic ah ayaa diyaar u ah kharashka, cidda saxda ah, iyo shuruudaha. Jadwalka UTXO waa xogta ugu yar ee looga baahan yahay noodhka ansaxaya, kaas oo la'aanteed aanu noodu awoodi karin inuu xaqiijiyo sax ahaanshaha macaamil ganacsi ee soo socda iyo blockyada ay ku jiraan.
Marka la eego, isku dayo ayaa lagu sameeyaa si kasta oo suurtagal ah si loo dhimo matalaadda kaydsan ee setkan, si loo cadaadiyo iyada oo aan luminin dammaanadda amniga. Mugga yar ee xogta la kaydiyay, hoos ayuu u dhigayaa shuruudaha booska diskka ee noodhka ansaxiyaha ah, taas oo ka dhigaysa bilaabista noodhka ansaxiyaha raqiis ah, waxay kuu ogolaaneysaa inaad ballaariso shabakadda oo aad kordhiso xasilloonida shabakadda.
Mid ka mid ah dhibaatooyinka joogtada ah ee Bitcoin ayaa ahaa miisaankeeda. Fikradda "bangigaaga" wuxuu u baahan yahay ka qaybgalayaasha shabakadu inay hayaan diiwaannada dhammaan lacagaha la heli karo si loo isticmaalo. Seeraar, lacagaha la heli karo waxaa lagu muujiyaa sida wax soo saarka aan la isticmaalin - UTXO-set. Inkastoo tani aysan ahayn matalaad dareen gaar ah leh, waxay faa'iido u leedahay marka la eego waxqabadka fulinta marka loo eego matalaadda taas oo "wallet" kastaa uu leeyahay "dheelitir" gelitaan gaar ah, iyo sidoo kale ku daraya sirta (tusaale. CoinJoin).
Waa muhiim in la kala saaro taariikhda wax kala iibsiga (waxa loo yaqaan blockchain) iyo xaaladda hadda ee nidaamka. Taariikhda wax kala iibsiga Seeraar waxay hadda haysaa ilaa 200 GB oo boos disk ah, wayna sii socotaa. Si kastaba ha noqotee, nidaamka nidaamka aad ayuu u yar yahay, marka loo eego 4 GB, oo kaliya ayaa tixgelinaya xaqiiqda ah in qof hadda leeyahay qadaadiicda. Mugga xogtani sidoo kale way korodhaa wakhti ka dib, laakiin heer aad u gaabis ah oo mararka qaarkood xitaa waxay u egtahay inay hoos u dhacdo (eeg CDPV).
UTXO (Unspent Transaction Output) waa soosaarka wax kala iibsiga ee aan la isticmaalin, meesha ugu dambeysa ee safarka Satoshi kasta oo lagu wareejiyo macaamil ganacsi. Wax-soo-saarka aan la isticmaalin ayaa noqda wax-soo-saarka macaamil ganacsi oo cusub oo sidaas lagu kharash gareeyo (kharash) lagana saaro UTXO-set.
UTXO cusub waxaa had iyo jeer abuuray wax kala iibsiga:
coinbase macaamil ganacsi la'aan: abuur UTXO cusub marka macdan qodayaasha soo saaraan qadaadiicda
Shandadyadu waxay tiriyaan tirada qadaadiicda ah ee la heli karo kharashka (dheellitirka) iyadoo lagu salaynayo cadadka UTXO ee loo heli karo boorsadan kharashka.
Nod kasta oo ansax ah, si looga hortago isku dayada kharashka labalaabka ah, waa inuu la socdaa habka Π²ΡΠ΅Ρ UTXO markaad hubinayso mid kasta wax kala iibsiga mid kasta xannibid.
Noodku waa inuu lahaadaa macquul:
Wax lagu daro UTXO-set
Tirtiridda UTXO-set
Hubinta joogitaanka hal UTXO oo ku jira set
Waxaa jira habab lagu dhimo shuruudaha macluumaadka la keydiyay ee ku saabsan set, iyadoo la ilaalinayo awoodda wax lagu dari karo lagana saari karo curiyeyaasha, hubinta iyo caddaynta jiritaanka shay ku jira set iyadoo la isticmaalayo kaydiyaha cryptographic.
Beteriyada UTXO
Fikradda isticmaalka baytariyada si loo kaydiyo UTXO badan ayaa laga hadlayhore.
UTXO-set waxaa lagu dhisay duulista, inta lagu guda jiro download block bilowga ah (IBD), kaydiyaa si buuxda iyo si joogto ah, halka ay ka kooban beddelo ka dib markii processing xawaaladaha ka block kasta oo cusub oo sax ah ee network. Habkani wuxuu u baahan yahay soo dejinta qiyaastii 200 GB ee xogta xannibaadda iyo xaqiijinta boqolaal milyan oo saxeex dhijitaal ah. Ka dib marka habka IBD la dhammeeyo, xariiqda hoose ayaa ah in UTXO-set uu ku noolaan doono qiyaastii 4 GB.
Si kastaba ha noqotee, iyada oo la adeegsanayo accumulators, xeerarka la isku waafaqsan yahay ee lacagaha ayaa la dhimay si loo xaqiijiyo iyo abuurista caddaynta cryptographic, iyo culeyska dabagalka lacagaha la heli karo ayaa loo wareejiyaa milkiilaha lacagahaas, kaas oo bixiya caddaynta jiritaankooda iyo lahaanshaha.
Accumulator waxaa loogu yeeri karaa matalaad is haysta ee go'an. Cabbirka matalaadda kaydsan waa inay ahaataa mid joogto ah , ama u kordhi si hoose marka loo eego kadinnimada jaantuska iyo cabbirka curiyaha laftiisa, tusaale ahaan , halkaas oo n ay tahay kadinnimada ee set kaydsan.
Xaaladdan oo kale, ururiyehu waa inuu oggolaadaa soo saarista caddaynta ku darista shay ku jira set (caddaynta ka mid noqoshada) oo ay suurtogal ka dhigto in si wax ku ool ah loo xaqiijiyo caddayntan.
Batteriga ayaa la yiraahdaa firfircoon haddii ay kuu ogolaato in aad ku darto canaasirta oo aad ka saartid curiyayaasha set.
Tusaale ahaan baytariga noocaas ah wuxuu noqon lahaa Ururiyaha RSA waxaa soo jeediyay Boneh, Bunz, Fisch bishii Disembar 2018. Ururinta noocan oo kale ah waxay leedahay cabbir joogto ah oo matalaad kaydsan, laakiin waxay u baahan tahay joogitaanka sir la wadaago (habayn lagu kalsoon yahay). Shuruudahan ayaa diidaya ku-dhaqanka accumulator sida shabakadaha aan la aamini karin sida Seeraar, tan iyo daadinta xogta inta lagu jiro jiilka sirta ah waxay u oggolaan kartaa weeraryahannada inay abuuraan caddayn been ah oo jiritaanka UTXO ah, khayaanada noodhka leh UTXO-ku-salaysan oo ku salaysan accumulator sida.
Utreexo
Naqshadaynta Utreexo ee uu soo jeediyay Thaddeus Dryja ayaa suurtogal ka dhigaysa in la abuuro firfircoon baytariga iyada oo aan habayn lagu kalsoon yahay.
Marka hore, aan qeexno shaqada parent(), kaas oo u aqoonsan noodhka waalidka ee laba walxood oo la siiyay.
shaqada waalidka ()
Maadaama aan isticmaaleyno geedaha Merkle, waalidka mid kasta oo ka mid ah labada nood waa hal nood oo kaydiya xashiishka isku dhafka xashiishyada qanjidhada ilmaha:
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[..])
}
Qoraagu wuxuu xusay in si looga hortago weerarrada ay ku sifeeyeen Charles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, iyo Sebastien Zimmer Weerarrada labaad ee horudhaca ah ee hawlaha xashiishyada ee kala go'ay, marka lagu daro labada xashiish, dhererka geedka dhexdiisa waa in sidoo kale lagu daro isku-dhafka.
Markaad ku darto curiyayaasha ururiyaha, waxaad u baahan tahay inaad la socoto curiyayaasha xididka la beddelo. Adigoo raacaya dariiqa beddelidda curiyeyaasha xididka ee shay kasta oo aad ku darto, waxaad hadhow dhisi kartaa caddaynta jiritaanka walxahan.
Lasoco isbedelada markaad ku darto
Si aan ula socono isbedelada la sameeyay, aan ku dhawaaqno qaab dhismeedka Update, kaas oo kaydin doona xogta ku saabsan isbeddelada noodhka.
Si aad shay ugu darto batteriga, waxaad u baahan tahay:
Samee dambiisha tiro badan oo xubno xidid ah new_roots oo dhig curiyeyaasha xididka jira, hal baaldi kasta:
Code
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);
}
Ku dheji walxaha lagu darayo (array insertions) gaadhiga kowaad new_roots[0]:
Code
new_roots[0].extend_from_slice(insertions);
Ku xidh alaabta lagu daray dambiisha ugu horraysa inta soo hadhay:
Dhammaan gawaarida leh wax ka badan hal shay:
Laba walxood ka soo qaad dhamaadka dambiisha, xisaabi waalidkood, ka saar labada walxood
Ku dar waalidka la xisaabiyay gaariga xiga
Code
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 });
}
}
Ka dhaqaaji canaasiirta xididka qashin-qubka una guuri soo koobida ururinta
Code
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]);
}
}
Abuuritaanka caddaynta walxaha lagu daray
Caddeynta ku darida unugga batteriga (Proof) waxay u adeegi doontaa sida Waddada Merkle, oo ka kooban silsilad ProofStep. Haddii dariiqu meelna u maro, markaa caddayntu waa khalad.
Isticmaalka macluumaadka hore loo helay marka lagu daro curiye (qaab dhismeedka Update), waxaad samayn kartaa caddayn ah in curiye lagu daray batteriga. Si tan loo sameeyo, waxaan dhex mareynaa shaxda isbeddelada la sameeyay oo aan ku darno tallaabo kasta waddada Merkle, taas oo markaa u adeegi doonta caddayn:
Hubinta caddaynta ku darida shaygu waxay hoos ugu dhacdaa raacitaanka dariiqa Merkle ilaa ay ka keento curiye xidid jira:
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
}
}
Muuqaal ahaan:
Habka hubinta caddaynta A
Saarida walxaha
Si unug looga saaro batteriga, waa inaad keentaa caddayn sax ah in unuggu halkaas ku jiro. Isticmaalka xogta caddaynta, waxaa suurtagal ah in la xisaabiyo xididada xididada cusub ee ururiyaha kuwaas oo caddaynta la siiyay aysan run ahaan doonin.
Algorithm waa sida soo socota:
Sida lagu daro, waxaanu abaabulnaa dambiisha madhan oo u dhiganta geedaha Merkle ee dhererkoodu le'eg yahay awoodda laba ee tusmada dambiisha.
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;
}
}
Habka saarista curiyaha "A":
Is dhexgalka shabakada jira
Isticmaalka aruuriyaha la soo jeediyay, noodhadhku waxay iska ilaalin karaan isticmaalka DB si ay u kaydiyaan dhammaan UTXO inta ay weli awoodaan inay beddelaan UTXO-set. Si kastaba ha noqotee, dhibaatada ku shaqeynta caddaynta ayaa soo baxda.
Aynu wacno noodhka ansaxiyaha ah ee adeegsada ururiyaha UTXO is haysta (node-goboleed is haysta), iyo ansaxiyaha aan lahayn ururiye waa dhamaystiran (noqo buuxa). Jiritaanka laba qaybood oo qanjidhada ah waxay abuurtaa dhibaato isku dhafka hal shabakad, maaddaama qanjidhada is haysta ay u baahan yihiin caddaynta jiritaanka UTXOs, kuwaas oo lagu kharash gareeyo macaamil ganacsi, halka qanjidhada buuxa aysan samayn. Haddii dhammaan qanjidhada shabakadu aysan isku mar isku mar ahayn oo si isku-dubbarid leh u beddelaan isticmaalka Utreexo, markaa qanjidhada is haysta waa laga tagi doonaa mana awoodi doonaan inay ku shaqeeyaan shabakadda Bitcoin.
Si loo xalliyo dhibaatada isku dhafka qanjidhada cufan ee shabakada, waxaa la soo jeediyay in la soo bandhigo fasal dheeraad ah oo qanjidhada ah - buundooyinka. Noodka buundada waa nood dhammays tiran oo sidoo kale kaydisa baytariga Utreexo iyo caddaynta korontada Π²ΡΠ΅Ρ UTXO ka UTXO-set. Biriijyadu waxay xisaabiyaan xashiishyada cusub waxayna cusboonaysiiyaan kaydiyaha iyo cadaymaha marka ay xidhmo cusub oo wax kala iibsi ahi yimaadaan. Joogteynta iyo cusboonaysiinta ururiyaha iyo cadaymaha kuma soo rogayaan culays xisaabeed dheeraad ah qanjidhadan oo kale. Buundooyinka waxay allabari u bixiyaan booska diskka: waxay u baahan yihiin in wax la habeeyo xashiishka, marka loo eego xashiishyada qanjidhada is haysta, halkaasoo n ay tahay awoodda UTXO.
Nashqadaynta shabakada
Buundooyinka ayaa suurtogal ka dhigaya in si tartiib tartiib ah loogu daro qanjidhada is haysta ee shabakada iyada oo aan la beddelin software-ka noodhka jira. Nodes buuxa waxay u shaqeeyaan sidii hore, qaybinta wax kala iibsiga iyo blocks dhexdooda. Buundooyinka buundada waa qanjidhada buuxa kuwaas oo sidoo kale kaydiya xogta batteriga Utreexo iyo caddaymaha ka mid noqoshada Π²ΡΠ΅Ρ UTXO hadda. Buundada buundada lafteeda uma xayeysiiso sidaan oo kale, isaga oo iska dhigaya in ay tahay nood buuxa oo dhan qanjidhada buuxa iyo qanjirada is haysta ee dhammaan kuwa is haysta. Inkasta oo buundooyinku ay isku xidhaan labada shabakadood, dhab ahaantii waxay u baahan yihiin inay ku xidhaan hal jiho: min qanjidhada buuxa ee jira ilaa qanjidhada is haysta. Tani waa suurtogal sababtoo ah qaabka wax kala iibsiga uma baahna in la beddelo, iyo caddaynta UTXO ee qanjidhada is haysta waa la tuuri karaa, sidaas darteed node kasta oo is haysta ayaa si la mid ah u baahin kara macaamilka dhammaan ka qaybgalayaasha shabakada iyada oo aan ka qaybqaadaneynin qanjidhada buundada.
gunaanad
Waxaan eegnay batteriga Utreexo waxaana ku hirgelinay noociisa Rust. Waxaan eegnay qaab dhismeedka shabakadda kaas oo u oggolaan doona is-dhexgalka qanjidhada ku salaysan baytariyada. Faa'iidada qabashada is haysta waa cabbirka xogta kaydsan, taas oo ku xidhan logarithmically awoodda set of UTXOs, taas oo aad u yaraynaysaa shuruudaha meel disk iyo waxqabadka kaydinta ee noodes sida. Khasaaradu waa taraafikada dheeraadka ah ee gudbinta caddaynta, laakiin farsamooyinka isku-darka caddaynta (marka hal caddayntu caddaynayso jiritaanka dhowr walxood) iyo kaydinta waxay kaa caawin kartaa in gaadiidka lagu ilaaliyo xadka la aqbali karo.