Visa cilvÄces vÄsture ir nepÄrtraukts process, lai atbrÄ«votos no Ä·ÄdÄm un radÄ«tu jaunas, vÄl stiprÄkas. (AnonÄ«ms autors)
AnalizÄjot daudzus blokÄ·Ädes projektus (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin u.c.), es saprotu, ka no tehniskÄ viedokļa tie visi ir veidoti uz vieniem un tiem paÅ”iem principiem. BlokÄ·Ädes atgÄdina mÄjas, kurÄm, neskatoties uz visu dizainu, dekoru un nolÅ«ku dažÄdÄ«bu, ir pamati, sienas, jumts, logi, durvis, kas savÄ starpÄ ir savienotas noteiktos veidos. Un, ja jÅ«s saprotat Äku projektÄÅ”anas pamatprincipus un zinÄt izmantoto materiÄlu Ä«paŔības, tad varat noteikt konkrÄtas mÄjas paredzÄto mÄrÄ·i. Å obrÄ«d ar blokÄ·Ädi ir izveidojusies tÄda situÄcija, ka visi par to ir dzirdÄjuÅ”i, taÄu reti kurÅ” saprot arhitektÅ«ru un darbÄ«bas principus. TÄpÄc rodas pÄrpratums par to, kÄpÄc un kÄ ir jÄga izmantot blokÄ·Ädes tehnoloÄ£ijas.
Å ajÄ rakstÄ mÄs analizÄsim Ä«paŔības un principus, kas ir kopÄ«gi visÄm blokÄ·ÄdÄm. TÄlÄk apskatÄ«sim problÄmas, kuras var atrisinÄt, izmantojot blokÄ·Ädi, un, lai nostiprinÄtu materiÄlu, izveidosim nelielu, bet Ä«stu blokÄ·Ädi mÅ«su virtuÄlajÄ vietnÄ!
TÄtad, atcerÄsimies, kÄdas problÄmas blokÄ·Äde sÄkotnÄji atrisinÄja.
Esmu pÄrliecinÄts, ka daudzi teiks par izkliedÄtu, decentralizÄtu, publisku un nemainÄ«gu datubÄzi. Bet kÄpÄc tas viss bija vajadzÄ«gs?
Es gribÄtu sÄkt apgÅ«t jebkuru tehnoloÄ£iju, izlasot standartus, jo uz tiem ir balstÄ«ti visi raksti un grÄmatas par pÄtÄmo tÄmu. Bet paÅ”laik nav blokÄ·Ädes standartu; ISO ir tikai izveidojis komitejas to attÄ«stÄ«bai. PaÅ”laik katram publiskajam blokÄ·Ädes projektam ir savs baltÄs grÄmatas dokuments, kas bÅ«tÄ«bÄ ir tehniskÄ specifikÄcija. Pirmais publiski zinÄmais blokÄ·Ädes projekts ir Bitcoin tÄ«kls. Dodieties uz tÄ«kla oficiÄlo vietni un izskatu kur tas viss sÄkÄs.
Blockchain izaicinÄjums
TÄtad uzdevums, ko blokÄ·Äde atrisinÄja Bitcoin pionieru tÄ«klÄ, ir veikt uzticamu digitÄlo aktÄ«vu (aktÄ«vu) Ä«paÅ”umtiesÄ«bu nodoÅ”anu neuzticamÄ vidÄ bez starpniekiem. PiemÄram, Bitcoin tÄ«klÄ digitÄlais aktÄ«vs ir bitcoin digitÄlÄs monÄtas. Un visi Bitcoin un citu blokÄ·Äžu tehniskie risinÄjumi ir saistÄ«ti ar Ŕīs problÄmas risinÄÅ”anu.
ProblÄmas, kuras atrisina blokÄ·Äde
PieÅemsim, ka noteikta finanÅ”u organizÄcija saka, ka tÄ ir izveidojusi tÄ«klu visÄ pasaulÄ, ar kura palÄ«dzÄ«bu ir iespÄjams pÄrskaitÄ«t naudu jebkurai personai. Vai tu viÅai ticÄsi? Ja Ŕī organizÄcija ir Visa vai MasterCard, visticamÄk, jÅ«s tam ticÄsit, bet ja, nosacÄ«ti runÄjot, AnonymousWorldMoney, visticamÄk, nÄ. KÄpÄc? Bet tÄpÄc, ka mÄs ļoti labi zinÄm, kÄ izdalÄ«tÄs sistÄmas veido privÄtie uzÅÄmumi, kÄdiem nolÅ«kiem un pie kÄ tas var novest. SÄ«kÄk aplÅ«kosim Å”Ädu sistÄmu problÄmas un to, kÄ tÄs var atrisinÄt, izmantojot blokÄ·Ädes tehnoloÄ£ijas.
PieÅemsim, ka nosacÄ«tajÄ AnonymousWorldMoney ir serveri ar datu bÄzÄm, un ir labi, ja tie ir vairÄki dažÄdos datu centros. SÅ«tÄ«tÄjam pÄrskaitot naudu, tiek reÄ£istrÄts darÄ«jums, kas tiek replicÄts uz visiem serveriem, un nauda nonÄk pie saÅÄmÄja.
IdeÄlÄ pasaulÄ Å”Ä« shÄma darbojas lieliski, bet mÅ«sÄjÄ rodas Å”Ädas problÄmas:
DalÄ«bnieku identificÄÅ”anas problÄma, no vienas puses, un nepiecieÅ”amÄ«ba pÄc darÄ«jumu anonimitÄtes, no otras puses. Tie. jÄpÄrskaita nauda konkrÄtam saÅÄmÄjam un tÄ, lai neviens, izÅemot darÄ«juma dalÄ«bniekus, par Å”o darÄ«jumu nezinÄtu. BankÄm ir kontu numuri un bankas kartes, kas piesaistÄ«tas konkrÄtai fiziskai vai juridiskai personai, un bankas noslÄpums aizsargÄ darÄ«jumu informÄciju. Un kurÅ” garantÄ, ka nosacÄ«tÄ AnonymousWorldMoney neizmanto personas datus un darÄ«jumu informÄciju saviem mÄrÄ·iem?
KÄ pÄrliecinÄties, ka saÅÄmÄjs saÅÄma tieÅ”i tÄdu summu, kÄda viÅam tika pÄrskaitÄ«ta? RelatÄ«vi runÄjot, sÅ«tÄ«tÄjs pÄrskaitÄ«ja 100 USD, un saÅÄmÄjs saÅÄma 10 USD. SÅ«tÄ«tÄjs ierodas AnonymousWorldMoney birojÄ ar savu kvÄ«ti, un ierÄdnis parÄda savu versiju, kur rakstÄ«ts, ka sÅ«tÄ«tÄjs pÄrskaitÄ«jis tikai 10 USD.
Neuzticamas vides problÄma, piemÄram, krÄpniecÄ«ba, ko sauc par dubultiem tÄriÅiem. NegodÄ«gs dalÄ«bnieks var iztÄrÄt savu atlikumu vairÄkas reizes, lÄ«dz maksÄjums tiek pÄrsÅ«tÄ«ts uz visiem serveriem. CAP teorÄma, protams, neviens neatcÄla, un vienoÅ”anÄs galu galÄ tiks panÄkta, bet kÄds nesaÅems naudu par sniegtajiem pakalpojumiem vai precÄm. TÄpÄc, ja nav pilnÄ«gas uzticÄ«bas maksÄjumu organizÄcijai vai darÄ«jumu dalÄ«bniekiem, tad ir jÄveido tÄ«kls, kas balstÄ«ts nevis uz uzticÄÅ”anos, bet gan uz kriptogrÄfiju.
NosacÄ«ti AnonymousWorldMoney ir ierobežots skaits serveru, kas var kļūt nepieejami netÄ«Å”i vai ļaunprÄtÄ«ga nolÅ«ka dÄļ.
AnonymousWorldMoney iekasÄs savu taustÄmo komisiju.
Kontroles iespÄja. Bitcoin darbÄ«bas laikÄ izrÄdÄ«jÄs, ka cilvÄki vÄlas ne tikai pÄrskaitÄ«t viens otram monÄtas, bet arÄ« pÄrbaudÄ«t dažÄdus darÄ«juma nosacÄ«jumus, programmÄt darba scenÄrijus, automÄtiski veikt darbÄ«bas atkarÄ«bÄ no apstÄkļiem utt.
KÄ blokÄ·Äde atrisina Ŕīs problÄmas
DalÄ«bnieku identifikÄcija tiek veikta, izmantojot atslÄgu pÄri: privÄto un publisko, un digitÄlÄ paraksta algoritms unikÄli identificÄ sÅ«tÄ«tÄju un saÅÄmÄju, atstÄjot viÅu identitÄti anonÄ«mu.
DarÄ«jumi tiek apkopoti blokos, bloka hash tiek aprÄÄ·inÄts un ierakstÄ«ts nÄkamajÄ blokÄ. Å Ä« jaucÄju ierakstÄ«Å”anas secÄ«ba blokos pieŔķir blokÄ·Ädes tehnoloÄ£ijai savu nosaukumu, kÄ arÄ« padara neiespÄjamu nemanÄmi mainÄ«t/dzÄst blokus vai atseviŔķus darÄ«jumus no blokiem. TÄdÄjÄdi, ja darÄ«jums ir iekļauts blokÄ·ÄdÄ, varat bÅ«t droÅ”s, ka tÄ dati paliks nemainÄ«gi.
DivkÄrÅ”u tÄriÅu krÄpÅ”ana tiek novÄrsta, panÄkot tÄ«kla vienprÄtÄ«bu par to, kuri dati uzskatÄmi par derÄ«giem un kuri jÄizmet. Bitcoin tÄ«klÄ vienprÄtÄ«ba tiek panÄkta ar darba pierÄdÄ«jumu (PoW).
TÄ«kla uzticamÄ«ba tiek panÄkta ar to, ka blokÄ·Äde ir publiska, kur katrs dalÄ«bnieks var palaist savu mezglu, saÅemt pilnu blokÄ·Ädes kopiju un turklÄt patstÄvÄ«gi sÄkt pÄrbaudÄ«t darÄ«jumu pareizÄ«bu. JÄpiebilst, ka mÅ«sdienu blokÄ·Ädes dod iespÄju veidot ne tikai publiskas (atvÄrtas), bet arÄ« privÄtas (slÄgtas) blokÄ·Ädes, kÄ arÄ« izmantot kombinÄtÄs shÄmas.
BlokÄ·Äde pilnÄ«bÄ neatbrÄ«vosies no komisijÄm, jo... jÄmaksÄ cilvÄkiem, kas atbalsta tÄ«klu, bet blokÄ·ÄdÄ komisijas nepiecieÅ”amÄ«ba ir pierÄdÄ«ta tik pÄrliecinoÅ”i, ka par tÄs nepiecieÅ”amÄ«bu nav Å”aubu.
MÅ«sdienu blokÄ·Ädes spÄj ieviest biznesa loÄ£iku, ko blokÄ·ÄdÄ sauc par viedajiem lÄ«gumiem. Viedo lÄ«gumu loÄ£ika tiek realizÄta dažÄdÄs augsta lÄ«meÅa valodÄs.
Katrs dalÄ«bnieks var palaist savu mezglu ar pilnu blokÄ·Ädes kopiju (pilnu mezglu). Tiek izsaukti pilni mezgli, kas var ierakstÄ«t darÄ«jumus blokÄ·ÄdÄ vienprÄtÄ«bas mezgli (liecinieks) vai kalnraÄi (kalnracis). Tiek izsaukti pilni mezgli, kas pÄrbauda tikai darÄ«jumu pareizÄ«bu audita mezgli (audits). Vieglie klienti (vieglie klienti) nesaglabÄ pilnas blokÄ·Ädes kopijas, bet mijiedarbojas ar tÄ«klu, izmantojot pilnus mezglus.
LielÄkÄ daļa lietotÄju darÄ«jumu veikÅ”anai izmanto vieglos klientus vai tÄ«mekļa makus. Visi mezgli ir savienoti viens ar otru. Izmantojot Å”o elementu kopu, tÄ«kla arhitektÅ«ra kļūst stabilÄka:
Darījuma dzīves cikls
Apskatīsim darījuma dzīves ciklu un sadalīsim to pa gabalam:
Blockchain tehnoloģijas
PakavÄsimies sÄ«kÄk pie tehniskajiem risinÄjumiem un to savstarpÄjÄm saistÄ«bÄm.
IdentifikÄcija
Katram blokÄ·Ädes darÄ«jumam ir jÄbÅ«t digitÄli parakstÄ«tam. TÄpÄc, lai pabeigtu darÄ«jumu, katram dalÄ«bniekam ir jÄbÅ«t atslÄgu pÄrim: privÄtais / publiskais. DažkÄrt atslÄgu pÄri sauc par maku, jo atslÄgas ir unikÄli saistÄ«tas ar dalÄ«bnieka unikÄlo digitÄlo adresi un bilanci. PatiesÄ«bÄ atslÄgas un adreses ir tikai ciparu virknes dažÄdÄs numuru sistÄmÄs. AtslÄgu un maku adreÅ”u piemÄri:
Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V
Lai izveidotu digitÄlo parakstu blokÄ·ÄdÄs, tiek izmantots algoritms, kura pamatÄ ir eliptiskÄs lÄ«knes: EliptiskÄs lÄ«knes digitÄlÄ paraksta algoritms (ECDSA). Lai tas darbotos, privÄtÄ atslÄga (256 bitu numurs) parasti tiek Åemta nejauÅ”i. AtslÄgu opciju skaits ir 2 lÄ«dz 256, tÄpÄc mÄs varam runÄt par praktisko neiespÄjamÄ«bu saskaÅot privÄto atslÄgu vÄrtÄ«bas.
PÄc tam publisko atslÄgu iegÅ«st no privÄtÄs, reizinot tÄs vÄrtÄ«bu ar punkta koordinÄtÄm, kas atrodas uz eliptiskÄs lÄ«knes, iegÅ«stot jauna punkta koordinÄtas tajÄ paÅ”Ä lÄ«knÄ. Å Ä« darbÄ«ba nodroÅ”ina, ka iegÅ«stat atslÄgu pÄri, kas ir piemÄrots transakciju ciparparakstÄ«Å”anai. Visbeidzot, maka adrese ir unikÄli atvasinÄta no publiskÄs atslÄgas.
PrivÄtajai atslÄgai ir jÄbÅ«t stingri konfidenciÄlai un jÄglabÄ droŔībÄ. PubliskÄ atslÄga ir zinÄma visiem. Ja tiek pazaudÄta privÄtÄ atslÄga, piekļuvi Ä«paÅ”umam (monÄtÄm) nevarÄs atjaunot un nauda tiks zaudÄta uz visiem laikiem. TÄpÄc uzdevums droÅ”i glabÄt privÄtÄs atslÄgas ir ÄrkÄrtÄ«gi bÅ«tisks, jo Å Ä« nav banka, kur jÅ«s vienmÄr varat ierasties ar savu pasi un atjaunot kontu. Ir vesela nozare tÄ saukto auksto kriptomaku ražoÅ”anai, lÄ«dzÄ«gi kÄ zibatmiÅas diskiem:
vai arÄ« varat izmantot uzticamÄkas metodes, piemÄram, uz marÄ·ieriem uzspiežot privÄtÄs atslÄgas vÄrtÄ«bu:
Darījumi
SÄ«kÄka informÄcija par darÄ«juma struktÅ«ru ir atrodama rakstÄ Bitcoin Ä«sumÄ ā DarÄ«jums. Mums ir svarÄ«gi saprast, ka katram darÄ«jumam ir vismaz Å”Ädi dati:
PÄc tam darÄ«jums tiek parakstÄ«ts ar privÄto atslÄgu un izsÅ«tÄ«ts (skatÄ«t sÄ«kÄku informÄciju par protokola darbÄ«bu Bitcoin Ä«sumÄ-Protokols) visiem blokÄ·Ädes mezgliem, kas pÄrbauda darÄ«jumu derÄ«gumu. DarÄ«juma pÄrbaudes algoritms nav triviÄls un ietver divi desmiti soļu.
Darījumu bloki
PÄc darÄ«jumu derÄ«guma pÄrbaudes mezgli no tiem veido blokus. Papildus transakcijÄm blokÄ tiek ierakstÄ«ts iepriekÅ”ÄjÄ bloka jaucÄjvÄrds un skaitlis (Nonce counter), un paÅ”reizÄjÄ bloka jaucÄjvÄrtÄ«ba tiek aprÄÄ·inÄta, izmantojot SHA-256 algoritmu. Jauktam ir jÄbÅ«t noteiktiem sarežģītÄ«bas nosacÄ«jumiem. PiemÄram, Bitcoin tÄ«klÄ sajaukÅ”anas grÅ«tÄ«bas pakÄpe tiek automÄtiski mainÄ«ta ik pÄc 2 nedÄļÄm atkarÄ«bÄ no tÄ«kla jaudas, lai bloks tiktu Ä£enerÄts aptuveni reizi 10 minÅ«tÄs. SarežģītÄ«bu nosaka Å”Äds nosacÄ«jums: atrastajam hash ir jÄbÅ«t mazÄkam par iepriekÅ” noteiktu skaitli. Ja Å”is nosacÄ«jums nav izpildÄ«ts, Nonce tiek pievienots 1, un jaucÄjkrÄna aprÄÄ·inÄÅ”anas darbs tiek atkÄrtots. Lai atlasÄ«tu jaucÄjkodu, tiek izmantots lauks Nonce, jo Å ie ir vienÄ«gie dati blokÄ, ko var mainÄ«t; pÄrÄjiem ir jÄpaliek nemainÄ«giem. DerÄ«gam jaucÄjam ir jÄbÅ«t noteiktam skaitam sÄkuma nulles, piemÄram, vienai no reÄlajÄm jauktÄm:
VeiksmÄ«ga jaucÄjkoda atraÅ”ana ir pierÄdÄ«jums par paveikto darbu (Proof-of-Work, PoW) Bitcoin vai Ethereum tÄ«kliem. HaÅ”u atraÅ”anas procesu sauc par ieguvi, lÄ«dzÄ«gi kÄ zelta ieguvi. Nosaukums diezgan precÄ«zi definÄ procesa bÅ«tÄ«bu, jo ir vienkÄrÅ”a opciju meklÄÅ”ana, un, ja kÄds atrod piemÄrotu hash, tad tÄ patieÅ”Äm ir veiksme. Tas ir tÄpat kÄ atrast Ä«stu zelta tÄ«rradni tonnÄs atkritumiežu. Bloka atlÄ«dzÄ«ba tagad ir 12.5 BTC, un, reizinot to ar paÅ”reizÄjo Bitcoin likmi 3900 $, jÅ«s saÅemsiet vairÄk nekÄ kilogramu tÄ«ra zelta. Ir par ko cÄ«nÄ«ties!
PÄc veiksmÄ«gas hash atraÅ”anas bloks un pats atrastais hash tiek ierakstÄ«ts blokÄ·ÄdÄ kÄ nÄkamais bloks. SÄ«kÄka informÄcija par bloku struktÅ«ru ir atrodama rakstÄ Bitcoin Ä«sumÄ-Blockchain, un zemÄk ir vienkÄrÅ”ota diagramma:
BlokÄ·Äde sÄkas ar bloku, kuram vÄl nav iepriekÅ”ÄjÄ bloka jaucÄjkoda. BlokÄ·ÄdÄ ir tikai viens Å”Äds bloks, un tam ir savs nosaukums Genesis bloks. PÄrÄjiem blokiem ir tÄda pati struktÅ«ra un tie atŔķiras tikai ar darÄ«jumu skaitu. ReÄlos darÄ«jumus un blokus, kas paÅ”laik tiek veidoti Bitcoin vai Ethereum, var apskatÄ«t BloÄ·Ät pÄrlÅ«ku.
Bloku lielums Bitcoin ir ierobežots lÄ«dz 1 MB, un ar minimÄlo informÄcijas apjomu darÄ«jumÄ aptuveni 200 baiti, maksimÄlais darÄ«jumu skaits blokÄ var bÅ«t aptuveni 6000. No Å”ejienes, starp citu, seko Bitcoin veiktspÄja, par kuru visi smejas: bloks tiek Ä£enerÄts aptuveni reizi 10 minÅ«tÄs * 60 sekundes = 600 sekundes, kas nodroÅ”ina formÄlu veiktspÄju aptuveni 10 TPS. Lai gan patiesÄ«bÄ tas nav produktivitÄte, bet gan apzinÄti ieviests darba algoritms. ProgrammÄ Ethereum konkurencei viÅi vienkÄrÅ”i padarÄ«ja bloka Ä£enerÄÅ”anas laiku 15 sekundes. un produktivitÄte formÄli pieauga. TÄpÄc blokÄ·ÄdÄs, kas izmanto PoW kÄ vienprÄtÄ«bu, nav jÄgas salÄ«dzinÄt veiktspÄju vispÄr, jo tas ir tieÅ”i atkarÄ«gs no keÅ”atmiÅas aprÄÄ·ina sarežģītÄ«bas, ko var pieŔķirt jebkurai vÄrtÄ«bai.
DakŔas
Kas notiek, ja, piemÄram, vairÄki mezgli atrada jaucÄjfunkcijas, kas atbilst sarežģītÄ«bas nosacÄ«jumiem, bet ir atŔķirÄ«gas pÄc vÄrtÄ«bas (citiem vÄrdiem sakot, tika panÄkta atŔķirÄ«ga vienprÄtÄ«ba) un ierakstÄ«ja blokus blokÄ·ÄdÄ? ApskatÄ«sim, kÄ blokÄ·Äde aizsargÄ pret Å”o situÄciju. Å ajÄ gadÄ«jumÄ notiek tÄ sauktÄ dakÅ”a, un blokÄ·Ädei ir divas Ä·Ädes versijas:
Kas notiek tÄlÄk? TÄlÄk daļa tÄ«kla sÄk strÄdÄt blokÄ N+2 no vienas Ä·Ädes, bet daļa no citas:
Viens no Å”iem blokiem tiks atrasts agrÄk un nosÅ«tÄ«ts uz blokÄ·Ädi, un pÄc tam saskaÅÄ ar noteikumiem blokÄ·Ädei bÅ«s jÄpÄrslÄdzas uz garÄku Ä·Ädi un jÄatceļ visi darÄ«jumi no alternatÄ«vÄ bloka:
TajÄ paÅ”Ä laikÄ var rasties situÄcija, kad dalÄ«bnieka darÄ«jums bija tikai vienÄ no dakÅ”u blokiem, kas tika atcelts. TÄpÄc, lai bÅ«tu droÅ”s, ka vÄlamais darÄ«jums ir ierakstÄ«ts blokÄ·ÄdÄ, ir vispÄrÄ«gs ieteikums ā pirms uzticÄties darÄ«jumam, jÄpagaida, lÄ«dz blokÄ·ÄdÄ tiks pievienoti nÄkamie bloki. Ieteikumi, cik daudz bloku jÄgaida dažÄdÄm blokÄ·ÄdÄm, atŔķiras. PiemÄram, Bitcoin tÄ«klam minimÄlais ir 2 bloki, maksimÄlais ir 6.
TÄda pati aina ar blokdakÅ”Äm bÅ«s vÄrojama tÄ dÄvÄtÄ 51% uzbrukuma laikÄ ā tas ir tad, kad kalnraÄu grupa mÄÄ£ina izveidot alternatÄ«vu bloku Ä·Ädi, cenÅ”oties pÄrtraukt Ä·Ädi ar saviem krÄpnieciskajiem darÄ«jumiem. Lai gan paÅ”laik krÄpÅ”anas vietÄ izdevÄ«gÄk ir tÄrÄt savu spÄku godÄ«gai ieguvei.
VienprÄtÄ«ba
Lai ierakstÄ«tu bloku blokÄ·ÄdÄ, tÄ«klam ir jÄpanÄk vienprÄtÄ«ba. AtcerÄsimies uzdevumu panÄkt vienprÄtÄ«bu datorkomunikÄciju tÄ«klos. ProblÄma ir formulÄta kÄ bizantieÅ”u Ä£enerÄļu BFT (Bizantijas kļūdu tolerance). Izlaižot gleznaino Bizantijas armijas problÄmu aprakstu, problÄmu var formulÄt Å”Ädi: kÄ tÄ«kla mezgli var nonÄkt pie kopÄja rezultÄta, ja daži tÄ«kla mezgli var tos apzinÄti deformÄt. EsoÅ”ie BFT problÄmas risinÄÅ”anas algoritmi parÄda, ka tÄ«kls var darboties pareizi, ja tajÄ ir mazÄk nekÄ 1/3 krÄpnieku. KÄpÄc BFT konsenss nav piemÄrots Bitcoin tÄ«klam? KÄpÄc bija nepiecieÅ”ams izmantot PoW? Ir vairÄki iemesli:
BFT labi darbojas ar nelielu fiksÄtu mezglu komplektu, taÄu publiskÄ blokÄ·ÄdÄ mezglu skaits nav prognozÄjams un turklÄt mezglus var ieslÄgt un izslÄgt nejauÅ”i.
Ir nepiecieÅ”ams motivÄt cilvÄkus palaist blokÄ·Ädes mezglus. Lai to izdarÄ«tu, cilvÄkiem ir jÄsaÅem atalgojums. BFT formÄli nav par ko saÅemt atlÄ«dzÄ«bu, bet tas, par ko atlÄ«dzÄ«ba tiek pieŔķirta PoW, ikvienam ir skaidrs intuitÄ«vÄ lÄ«menÄ«: par elektrÄ«bu, ko procesors patÄrÄ bloka hash atraÅ”anas procesÄ.
Papildus PoW mÅ«sdienu blokÄ·ÄdÄs tiek izmantotas vairÄkas citas vienprÄtÄ«bas, piemÄram:
Nedaudz pakavÄsimies pie PoS vienprÄtÄ«bas, jo... TieÅ”i PoS un tÄ Å”Ä·irnes ir visizplatÄ«tÄkÄs privÄtajÄs blokÄ·ÄdÄs. KÄpÄc privÄti? No vienas puses, PoS Ä«paŔības ir labÄkas salÄ«dzinÄjumÄ ar PoW, jo Lai panÄktu vienprÄtÄ«bu, ir nepiecieÅ”ams mazÄk skaitļoÅ”anas resursu, kas nozÄ«mÄ, ka palielinÄs datu ierakstÄ«Å”anas Ätrums blokÄ·ÄdÄ. Bet no otras puses, PoS ir lielÄkas krÄpÅ”anas iespÄjas, tÄpÄc, lai to neitralizÄtu, ir jÄzina visi blokÄ·Ädes dalÄ«bnieki.
PoS konsenss balstÄs uz tÄda mezgla izvÄli, kas var ierakstÄ«t bloku ar transakcijÄm uz blokÄ·Ädi atkarÄ«bÄ no naudas lÄ«dzekļu apjoma kontÄ, pareizÄk sakot, nevis kontÄ, bet nodroÅ”inÄjumÄ, t.i. Jo vairÄk lÄ«dzekļu jums ir kÄ nodroÅ”inÄjums, jo lielÄka iespÄja, ka tÄ«kls izvÄlÄsies jÅ«su mezglu bloka rakstÄ«Å”anai. DepozÄ«ts netiks atgriezts, ja bloks ir nederÄ«gs. Tas nodroÅ”ina aizsardzÄ«bu pret krÄpÅ”anu. Ir Å”Ädas PoS variÄcijas:
DeleÄ£ÄtÄ PoS (DPoS) vienprÄtÄ«ba sadala dalÄ«bniekus ābalsotÄjosā un āvalidatorosā. MonÄtu turÄtÄji (balsoÅ”anas dalÄ«bnieki) deleÄ£Ä savas tiesÄ«bas pÄrbaudÄ«t un reÄ£istrÄt darÄ«jumus blokÄ·ÄdÄ citiem dalÄ«bniekiem. TÄdÄjÄdi vÄrtÄtÄji veic visu skaitļoÅ”anas darbu un par to saÅem atlÄ«dzÄ«bu, un balsotÄju klÄtbÅ«tne garantÄ vÄrtÄtÄju godÄ«gumu, jo tos var mainÄ«t jebkurÄ laikÄ.
LPoS (leased Proof-of-Stake) vienprÄtÄ«ba ļauj iznomÄt savus lÄ«dzekļus citiem mezgliem, lai tiem bÅ«tu lielÄka iespÄja apstiprinÄt blokus. Tas. JÅ«s varat saÅemt komisiju par darÄ«jumiem, nepiedaloties faktiskÄ darÄ«juma pÄrbaudÄ un bloku ieguvÄ.
Ir virkne citu konsensu, kas vÄl netiek plaÅ”i izmantoti, es tos Å”eit uzskaitÄ«Å”u tikai informÄcijai, un pÄrskatu par paÅ”iem vienprÄtÄ«bas algoritmiem var atrast, piemÄram, rakstÄ: VienprÄtÄ«bas algoritmi blokÄ·ÄdÄ.
PoET (pagÄjuÅ”Ä laika pierÄdÄ«jums)
PoC (kapacitÄtes apliecinÄjums)
PoB (iedeguma pierÄdÄ«jums)
PoWeight (svara pierÄdÄ«jums)
PoA (aktivitÄtes pierÄdÄ«jums) ā PoW + PoS
PoI (Proof-of-Importans)
BlokÄ·Äžu uzticamÄ«bas un izvietoÅ”anas modeļi
PubliskÄ blokÄ·Äde
StabilitÄte valsts vai cits vÄrds Neatļauta blokÄ·Äde Tas tiek panÄkts, ļaujot ikvienam izveidot savienojumu un skatÄ«t informÄciju vai pat izveidot savienojumu ar savu mezglu, un uzticÄÅ”anÄs tiek veidota, pamatojoties uz PoW vienprÄtÄ«bu.
PrivÄtÄ blokÄ·Äde
PrivÄts vai PrivÄta atļauta blokÄ·Äde. Å ajÄs blokÄ·ÄdÄs informÄcijai ir pieejama tikai noteikta dalÄ«bnieku grupa (organizÄcijas vai cilvÄki). Å Ädas blokÄ·Ädes veido organizÄcijas ar mÄrÄ·i palielinÄt kopÄjo ieguvumu vai efektivitÄti. To uzticamÄ«bu nodroÅ”ina dalÄ«bnieku kopÄ«gie mÄrÄ·i un PoS un BFT konsensa algoritmi.
Blockchain konsorcijs
Tur Konsorcijs vai Publiski atļauta blokÄ·Äde. TÄs ir blokÄ·Ädes, kurÄm ikviens var pieslÄgties, lai skatÄ«tu, bet dalÄ«bnieks var pievienot informÄciju vai savienot savu mezglu tikai ar citu dalÄ«bnieku atļauju. Å Ädas blokÄ·Ädes veido organizÄcijas, lai palielinÄtu klientu vai produktu patÄrÄtÄju vai visas sabiedrÄ«bas uzticÄ«bu. Å eit uzticamÄ«ba tiek panÄkta arÄ« ar uzticÄÅ”anos starp dalÄ«bniekiem un tiem paÅ”iem PoS un BFT konsensa algoritmiem.
Viedie līgumi
BlokÄ·Ädes, kas ieviestas pÄc Bitcoin, vienÄ vai otrÄ pakÄpÄ ir pievienojuÅ”as iespÄju izpildÄ«t viedos lÄ«gumus. BÅ«tÄ«bÄ viedais lÄ«gums ir darÄ«jums, kurÄ izpildei tiek ievietots programmas kods. Viedie lÄ«gumi Ethereum tÄ«klÄ tiek izpildÄ«ti EVM (Ethereum virtuÄlajÄ maŔīnÄ). Lai sÄktu viedÄ lÄ«guma izpildi, tas ir skaidri jÄpalaiž citÄ transakcijÄ vai arÄ« ir jÄbÅ«t izpildÄ«tiem izpildes priekÅ”nosacÄ«jumiem. ViedÄ lÄ«guma izpildes rezultÄti tiks ierakstÄ«ti arÄ« blokÄ·ÄdÄ. Datu saÅemÅ”ana Ärpus blokÄ·Ädes ir iespÄjama, taÄu ÄrkÄrtÄ«gi ierobežota.
KÄdu biznesa loÄ£iku var Ä«stenot, izmantojot viedo lÄ«gumu? PatiesÄ«bÄ nav daudz, piemÄram, apstÄkļu pÄrbaude, izmantojot datus no blokÄ·Ädes, digitÄlo aktÄ«vu Ä«paÅ”nieku maiÅa atkarÄ«bÄ no Å”iem apstÄkļiem, datu ierakstÄ«Å”ana pastÄvÄ«gÄ krÄtuvÄ blokÄ·Ädes ietvaros. LoÄ£ika tiek Ä«stenota Ä«paÅ”Ä augsta lÄ«meÅa valodÄ Solidity.
Klasisks piemÄrs funkcionalitÄtei, kas tiek ieviesta, izmantojot viedos lÄ«gumus, ir tokenu izsniegÅ”ana ICO. PiemÄram, es Ä«stenoju viedo lÄ«gumu, lai izsniegtu pieticÄ«gu 500 000 000 AlexToken. Autors saite programmÄ Etherscan ir
viedÄ lÄ«guma pirmkods Solidity valodÄ
pragma solidity ^0.4.23;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
**/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
**/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
**/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
**/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
**/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
**/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
**/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
**/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20Basic interface
* @dev Basic ERC20 interface
**/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
**/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
**/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
**/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
**/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
**/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
**/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
**/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
**/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
**/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
**/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/**
* @title Configurable
* @dev Configurable varriables of the contract
**/
contract Configurable {
uint256 public constant cap = 1000000000*10**18;
uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
uint256 public tokensSold = 0;
uint256 public constant tokenReserve = 500000000*10**18;
uint256 public remainingTokens = 0;
}
/**
* @title CrowdsaleToken
* @dev Contract to preform crowd sale with token
**/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
/**
* @dev enum of current crowd sale state
**/
enum Stages {
none,
icoStart,
icoEnd
}
Stages currentStage;
/**
* @dev constructor of CrowdsaleToken
**/
constructor() public {
currentStage = Stages.none;
balances[owner] = balances[owner].add(tokenReserve);
totalSupply_ = totalSupply_.add(tokenReserve);
remainingTokens = cap;
emit Transfer(address(this), owner, tokenReserve);
}
/**
* @dev fallback function to send ether to for Crowd sale
**/
function () public payable {
require(currentStage == Stages.icoStart);
require(msg.value > 0);
require(remainingTokens > 0);
uint256 weiAmount = msg.value; // Calculate tokens to sell
uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
uint256 returnWei = 0;
if(tokensSold.add(tokens) > cap){
uint256 newTokens = cap.sub(tokensSold);
uint256 newWei = newTokens.div(basePrice).mul(1 ether);
returnWei = weiAmount.sub(newWei);
weiAmount = newWei;
tokens = newTokens;
}
tokensSold = tokensSold.add(tokens); // Increment raised amount
remainingTokens = cap.sub(tokensSold);
if(returnWei > 0){
msg.sender.transfer(returnWei);
emit Transfer(address(this), msg.sender, returnWei);
}
balances[msg.sender] = balances[msg.sender].add(tokens);
emit Transfer(address(this), msg.sender, tokens);
totalSupply_ = totalSupply_.add(tokens);
owner.transfer(weiAmount);// Send money to owner
}
/**
* @dev startIco starts the public ICO
**/
function startIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
currentStage = Stages.icoStart;
}
/**
* @dev endIco closes down the ICO
**/
function endIco() internal {
currentStage = Stages.icoEnd;
// Transfer any remaining tokens
if(remainingTokens > 0)
balances[owner] = balances[owner].add(remainingTokens);
// transfer any remaining ETH balance in the contract to the owner
owner.transfer(address(this).balance);
}
/**
* @dev finalizeIco closes down the ICO and sets needed varriables
**/
function finalizeIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
endIco();
}
}
/**
* @title LavevelToken
* @dev Contract to create the Lavevel Token
**/
contract AlexToken is CrowdsaleToken {
string public constant name = "AlexToken";
string public constant symbol = "ALT";
uint32 public constant decimals = 18;
}
MÄs esam uzskaitÄ«juÅ”i tehnoloÄ£ijas, uz kurÄm tiek veidotas mÅ«sdienu blokÄ·Ädes, un kÄ tÄs ir savienotas viena ar otru. Tagad formulÄsim, kuras problÄmas var atrisinÄt, izmantojot blokÄ·Ädi, un kuri risinÄjumi labÄkajÄ gadÄ«jumÄ bÅ«s neefektÄ«vi. TÄtad blokÄ·Ädes izmantoÅ”ana nav nepiecieÅ”ama, ja:
DarÄ«jumi tiek veikti uzticamÄ vidÄ;
Starpnieku komisijas klÄtbÅ«tne nepasliktina dalÄ«bnieku dzÄ«vi;
DalÄ«bniekiem nav Ä«paÅ”uma, ko var attÄlot kÄ digitÄlos aktÄ«vus;
DigitÄlajos aktÄ«vos nav izplatÄ«Å”anas, t.i. vÄrtÄ«ba pieder vai piegÄdÄ tikai viens dalÄ«bnieks.
KÄda ir blokÄ·Ädes nÄkotne? Tagad mÄs varam tikai spekulÄt par iespÄjamiem blokÄ·Ädes tehnoloÄ£iju attÄ«stÄ«bas veidiem:
Blockchain kļūs par tÄdu paÅ”u izplatÄ«tu datu bÄzes tehnoloÄ£iju kÄ, piemÄram, SQL vai NoSQL, lai atrisinÄtu savu specifisko problÄmu loku;
Blockchain kļūs par plaÅ”i izplatÄ«tu protokolu, tÄpat kÄ HTTP ir paredzÄts internetam;
Blockchain kļūs par pamatu jaunai finanÅ”u un politiskajai sistÄmai uz planÄtas!
NÄkamajÄ daÄ¼Ä apskatÄ«sim, kÄdas blokÄ·Ädes Å”obrÄ«d pastÄv un kÄpÄc tÄs tiek izmantotas dažÄdÄs nozarÄs.