Hei Habr!
MuBitcoin network, node dzese, kuburikidza nekubvumirana, dzinobvumirana pane seti yeUTXOs: ingani mari inowanikwa yekushandisa, kuna ani chaizvo, uye pasi pemamiriro api. Iyo UTXO seti ndiyo yakaderera seti yedata inodiwa kune validator node, pasina iyo iyo node haizokwanise kuonesa kutendeseka kweanouya transaction uye mabhuroki ane iwo.
Panyaya iyi, kuedza kuri kuitwa nenzira dzese dzinogoneka kuderedza inomiririra yakachengetwa yeiyi seti, kuimanikidza pasina kurasikirwa nevimbiso yekuchengetedza. Iyo diki vhoriyamu ye data yakachengetwa, iyo yakaderera iyo dhisiki nzvimbo inodiwa yeiyo validator node, iyo inoita kuti kuvhura iyo validator node yakachipa, inobvumidza iwe kuwedzera network uye nekudaro kuwedzera kugadzikana kwetiweki.
Mune ino positi tichaisa Rust prototype yechikumbiro chazvino kubva kune mumwe-munyori
Dambudziko nderei?
Rimwe rematambudziko eBitcoin risingaperi rave riri scalability. Pfungwa ye "bhangi rako wega" inoda kuti vatori vechikamu network vachengete marekodhi emari yese iripo yekushandisa. MuBitcoin, mari iripo inotaridzwa seti yezvisina kushandiswa - a UTXO-set. Kunyangwe iyi isiri yakanyanya kumiririra inomiririra, inobatsira maererano nekuita kwekuita pamusoro peinomiririra iyo yega yega "chikwama" ine "chiyero" seyakasiyana yekupinda, uye zvakare inowedzera kuvanzika (semuenzaniso.
Zvakakosha kusiyanisa pakati penhoroondo yekutengeserana (inonzi blockchain) uye mamiriro ezvino ehurongwa. Bitcoin transaction history parizvino inotora 200 GB ye disk space, uye inoramba ichikura. Nekudaro, iyo sisitimu mamiriro idiki zvakanyanya, pahurongwa hwe4 GB, uye inongofunga nezve chokwadi chekuti mumwe munhu parizvino ane mari. Huwandu hwe data iyi hunowedzerawo nekufamba kwenguva, asi pamwero wakaderera uye dzimwe nguva unotoita kudzikira (ona CDPV).
Vatengi vakareruka (SPVs) vatengesi vekuchengetedza vimbiso yekukwanisa kuchengeta hapana hushoma mamiriro (UTXO-set) kunze kwemakiyi akavanzika.
UTXO uye UTXO-set
UTXO (Unspent Transaction Output) ndiyo isina kushandiswa transaction yakabuda, magumo erwendo rweSatoshi yega yega inotamiswa mukutengesa. Zvisina kushandiswa zvinobuda zvinova zvekushandisa zvezvitsva zvekutengesa uye nekudaro zvinoshandiswa (kushandisa) uye kubviswa kubva kuUTXO-set.
New UTXOs inogara yakagadzirwa nekutengeserana:
- coinbase transactions pasina zvinopinza: gadzira maUTXO matsva kana vacheri vachiburitsa mari
- kutengeserana nguva dzose: gadzira maUTXO matsva uchipedza imwe seti yeUTXO iripo
Maitiro ekushanda neUTXO:
Mawallet anoverenga huwandu hwemari iripo yekushandisa (yasara) zvichienderana nehuwandu hweUTXO huripo kune ichi chikwama chekushandisa.
Imwe neimwe validator node, kudzivirira kaviri kushandisa mari kuedza, inofanirwa kutarisa seti Π²ΡΠ΅Ρ UTXO paunotarisa imwe neimwe kutengeserana cheumwe neumwe block.
Iyo node inofanirwa kuve ine logic:
- Kuwedzera kune UTXO-set
- Deletions kubva kuUTXO-set
- Kutarisa kuvepo kweiyo UTXO museti
Pane nzira dzekudzikisa zvinodiwa zveruzivo rwakachengetwa nezve seti, uchichengetedza kugona kwekuwedzera nekubvisa zvinhu, tarisa uye kuratidza kuvepo kwechinhu museti uchishandisa.
Mabhatiri eUTXO
Pfungwa yekushandisa mabhatiri kuchengetedza akawanda UTXOs
Iyo UTXO-set yakavakirwa pane nhunzi, panguva yekutanga block download (IBD), yakachengetwa yakazara uye nekusingaperi, nepo zvirimo zvichichinja mushure mekugadzirisa kutengeserana kubva kune yega yega nyowani uye chaiyo block yetiweki. Kuita uku kunoda kudhawunirodha ingangoita 200 GB yeblock data uye kuona mazana emamiriyoni emasiginecha edhijitari. Mushure meiyo IBD maitiro apera, iyo yepasi ndeyekuti iyo UTXO-set ichagara inosvika 4 GB.
Zvisinei, nevaunganidzi, mitemo yekubvumirana kwemari inoderedzwa kusvika pakusimbiswa uye chizvarwa chekrisptographic proofs, uye mutoro wekutevera mari iripo unotamisirwa kumuridzi wemari iyoyo, uyo anopa humbowo hwekuvapo kwavo uye varidzi.
An accumulator inogona kunzi compact inomiririra seti. Saizi yeyakachengetwa inomiririra inofanira kunge isingachinji , kana kuwedzera sublinearly maererano nekadhiiniti yeti uye saizi yechinhu pachayo, semuenzaniso. , uko n ndiyo kadhidhi yeyakachengetwa seti.
Muchiitiko ichi, accumulator inofanirwa kubvumira kuburitsa humbowo hwekuiswa kwechinhu museti (kusanganisira humbowo) uye kuita kuti zvikwanise kunyatso simbisa humbowo uhu.
Bhatiri rinonzi simba kana ichikubvumidza kuti uwedzere zvinhu uye kubvisa zvinhu kubva pane seti.
Muenzaniso webhatiri rakadaro ungave
Utreexo
Iyo Utreexo dhizaini yakakurudzirwa naThaddeus Dryja inoita kuti zvikwanise kugadzira simba Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΎΡ kunze yakavimbika-setup.
Utreexo isango remabhinari akakwana
Battery Logical Structure
Masero ebheteri akarongwa musango remiti yakanaka yemabhinari. Miti inorongwa nekukwirira. Iyi inomiririra yakasarudzwa seyakanyanya kuona uye inokubvumira kuti uone kubatanidzwa kwemiti panguva yekushanda pabhatiri.
Munyori anocherechedza kuti sezvo miti yose iri musango yakanaka, kureba kwayo kunoratidzwa sesimba rezviviri, sezvinongoita nhamba ipi zvayo yechisikigo inogona kumiririrwa sehuwandu hwemasimba maviri. Saizvozvo, chero seti yemashizha inogona kuiswa mumabhinari miti, uye mune zvese zviitiko, kuwedzera chinhu chitsva kunoda ruzivo chete nezvemidzi yemiti yakachengetwa.
Saka, iyo yakachengetwa inomiririra yeUtreexo accumulator rondedzero yemidzi nodes (Merkle mudzi), uye kwete sango rose remiti.
Ngatimirirei rondedzero yemidzi yezvinhu se Vec<Option<Hash>>
. Optional type Option<Hash>
inoratidza kuti mudzi wemudzi unogona kushaikwa, zvinoreva kuti hapana muti une hurefu hwakakodzera mune 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],
}
}
}
Kuwedzera zvinhu
Kutanga, ngatitsanangure basa racho parent()
, iyo inoziva node yemubereki yezvinhu zviviri zvakapihwa.
mubereki () basa
Sezvo isu tiri kushandisa miti yeMerkle, mubereki weimwe neimwe yemanodhi mbiri imwe node inochengeta hashi yekubatanidzwa kwehashi dzemwana node:
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[..])
}
Munyori anoti kudzivirira kurwiswa kwakatsanangurwa naCharles Bouillaguet, Pierre-Alain Fouque, Adi Shamir, uye Sebastien Zimmer mu.
Sezvo iwe uchiwedzera zvinhu kune accumulator, iwe unofanirwa kutarisa kuti ndeapi midzi midzi inoshandurwa. Nekutevera nzira yekushandura midzi yechinhu chimwe nechimwe chaunowedzera, iwe unogona gare gare kuvaka humbowo hwekuvapo kwezvinhu izvi.
Tarisa shanduko paunodziwedzera
Kutevera shanduko dzakaitwa, ngatizivise chimiro Update
, iyo inochengetedza data nezve node shanduko.
#[derive(Debug)]
pub struct Update<'a> {
pub utreexo: &'a mut Utreexo,
// ProofStep Ρ
ΡΠ°Π½ΠΈΡ "ΡΠΎΡΠ΅Π΄Π°" ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
pub updated: HashMap<Hash, ProofStep>,
}
Kuti uwedzere chinhu kubhatiri, unoda:
- Gadzira mutsara wematengu emidzi zvinhu
new_roots
uye isa iyo iripo midzi zvinhu ipapo, imwe kune yega bhaketi:
kodhi
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);
}
- Wedzera zvinhu zvichawedzerwa (array
insertions
) kungoro yekutanganew_roots[0]
:
kodhi
new_roots[0].extend_from_slice(insertions);
- Unganidza zvinhu zvakawedzerwa kubhasiki rekutanga nezvimwe zvese:
- Pangoro dzese dzine zvinhu zvinopfuura chimwe:
- Tora zvinhu zviviri kubva kumagumo ebhasiketi, verenga mubereki wavo, bvisa zvese zviri zviviri
- Wedzera mubereki akaverengerwa kungoro inotevera
- Pangoro dzese dzine zvinhu zvinopfuura chimwe:
kodhi
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 });
}
}
- Fambisa midzi kubva kumabhini kuenda kune inoguma accumulator array
kodhi
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]);
}
}
Kugadzira humbowo hwezvinhu zvakawedzerwa
Uchapupu hwekuiswa kwesero mubhatiri (Proof
) ichashanda seMerkle Path, ine cheni ProofStep
. Kana nzira yacho isina kwainoenda, ipapo humbowo hahuna kururama.
/// ΠΠ΄ΠΈΠ½ΠΈΡΠ½ΡΠΉ ΡΠ°Π³ Π½Π° ΠΏΡΡΠΈ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² Π΄Π΅ΡΠ΅Π²Π΅ ΠΠ΅ΡΠΊΠ»Π°.
#[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,
}
Kushandisa ruzivo rwakawanikwa pakutanga paunenge uchiwedzera chinhu (chimiro Update
), unogona kugadzira humbowo hwekuti chinhu chawedzerwa kubhatiri. Kuti tiite izvi, tinopfuura nepatafura yekuchinja kwakaitwa uye towedzera nhanho imwe neimwe munzira yaMerkle, iyo inozoshanda sehumbowo:
kodhi
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
}
}
Nzira yekugadzira humbowo
Kuongorora humbowo hwechinhu
Kutarisa humbowo hwekusanganisirwa kwechinhu kunowira pasi pakutevera nzira yeMerkle kudzamara yatungamira kune iripo mudzi chinhu:
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
}
}
Zvinoonekwa:
Maitiro ekutarisa humbowo hweA
Kubvisa zvinhu
Kuti ubvise sero kubva mubhatiri, unofanirwa kupa humbowo hunoshanda hwekuti sero riripo. Uchishandisa iyo data kubva kune humbowo, zvinokwanisika kuverenga mitsva midzi yeaccumulator iyo humbowo hwakapihwa huchave husiri hwechokwadi.
Iyo algorithm iri seinotevera:
- Sekuwedzera, isu tinoronga seti yemabhasikiti asina chinhu anoenderana nemiti yeMerkle ine hurefu hwakaenzana nesimba remaviri kubva kubhasiketi index.
- Isu tinoisa zvinhu kubva pamatanho enzira yeMerkle mumabhasikiti; indekisi yebhasiketi yakaenzana nenhamba yedanho razvino
- Isu tinobvisa iyo midzi chinhu iyo nzira kubva kune humbowo inotungamira
- Sekuwedzera, isu tinoverenga midzi mitsva nekubatanidza zvinhu kubva mumabhasikiti ari maviri maviri uye kufambisa mhedzisiro yemubatanidzwa kune inotevera dengu.
kodhi
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;
}
}
Maitiro ekubvisa chinhu "A":
Kubatanidzwa mune network iripo
Uchishandisa iyo yakarongwa accumulator, node dzinogona kudzivirira kushandisa DB kuchengetedza maUTXO ese achiri kukwanisa kushandura UTXO-set. Zvisinei, dambudziko rekushanda nehumbowo rinomuka.
Ngatishevedze iyo validator node inoshandisa iyo UTXO accumulator compact (compact-state node), uye iyo validator isina accumulator iri zadzisa (node ββyakazara). Kuvapo kwemakirasi maviri emanodhi kunogadzira dambudziko rekuvabatanidza mune imwechete network, sezvo compact node inoda humbowo hwekuvapo kweUTXOs, iyo inoshandiswa mukutengeserana, nepo node yakazara isingaite. Kana ese mambure node zvikasadaro panguva imwe chete uye nenzira yakarongeka chinja kushandisa Utreexo, ipapo compact nodes achasara kumashure uye havazokwanisi kushanda paBitcoin network.
Kugadzirisa dambudziko rekubatanidza compact node mune network, zvinokurudzirwa kuunza imwe kirasi yemanodhi - mabhiriji. Bhiriji node inzvimbo yakakwana inochengetawo Utreexo bhatiri uye simba-pachiratidzo che Π²ΡΠ΅Ρ UTXO kubva kuUTXO-set. Mabhiriji anoverenga hashes matsva uye anovandudza accumulator uye humbowo sezvo mabhuroko matsva ekutengeserana anosvika. Kuchengetedza uye kugadzirisa iyo accumulator uye humbowo hauisi yakawedzera computational mutoro pane dzakadaro node. Mabhiriji anobayira dhisiki nzvimbo: inoda kuchengeta zvinhu zvakarongeka hashes, zvichienzaniswa ne hashes ye compact node, uko n isimba reiyo UTXO set.
Network architecture
Mabhiriji anoita kuti zvikwanisike kuwedzera zvishoma nezvishoma compact node kune network pasina kushandura software yemanodhi aripo. Manodhi akazara anoshanda sekare, achigovera matransaction nemabhuroko pakati pavo. Bridge node izere node dzinowedzera kuchengetedza Utreexo bhatiri data uye seti yekusanganisirwa humbowo hwe Π²ΡΠ΅Ρ UTXO ikozvino. Iyo bhiriji node haizvishambadzire sekudaro, ichinyepedzera kunge izere node kune ese akazara node uye compact node kune ese akabatana. Kunyangwe mabhiriji achibatanidza manetwork ese pamwechete, anotoda chete kuabatanidza munzira imwe: kubva kune aripo akazara node kuenda kune compact node. Izvi zvinogoneka nekuti mafomati ekutengeserana haadi kuchinjwa, uye humbowo hweUTXO hwema compact node hunogona kuraswa, saka chero compact node inogonawo kutepfenyura kutengeserana kune vese vanotora network pasina kutora chikamu kwebhiriji node.
mhedziso
Takatarisa bhatiri reUtreexo uye takashandisa prototype yayo muRust. Isu takatarisa kune network architecture iyo inobvumira kubatanidzwa kwebhatiri-based node. Kubatsira kwe compact catches hukuru hwe data yakachengetwa, iyo inoenderana nelogarithmically pane simba reseti yeUTXOs, iyo inoderedza zvikuru zvinodiwa zve disk space uye kuchengetedza kushanda kwenode dzakadaro. Chakashata ndiyo yekuwedzera node traffic yekutumira humbowo, asi humbowo nzira dzekuunganidza (apo humbowo humwe hunoratidza kuvepo kwezvinhu zvakati wandei) uye caching inogona kubatsira kuchengetedza traffic mukati memiganhu inogamuchirwa.
nezvakanyorwa:
GitHub yeUtreexo prototype muRust Thaddeus Dryja -Utreexo: ane simba hash-based accumulator yakagadziridzwa yeBitcoin UTXO set Mifananidzo ine animated kubva kuchinyorwa
Source: www.habr.com