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 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 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. , 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.
Tālāk mēs šos risinājumus apsvērsim sīkāk.
Blockchain arhitektūra
Blockchain komponenti
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: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27VLai 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.
Ir daudz rakstu ar detalizētu informāciju par blokķēdē izmantoto kriptogrāfiju, piemēram:
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ā . Mums ir svarīgi saprast, ka katram darījumam ir vismaz šādi dati:
From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - цифровой адрес отправителя
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - цифровой адрес получателя
Value: 0.0001 - сумма транзакции
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - хэш транзакции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 ) visiem blokķēdes mezgliem, kas pārbauda darījumu derīgumu. Darījuma pārbaudes algoritms nav triviāls un ietver .
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:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91Veiksmī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ā , 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 .
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 (). 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:
- PoS (Proof-of-Stake) — blokķēdē
- DPoS (Delegated Proof-of-Stake) — blokķēdē
- BFT modifikācijas: SBFT (vienkāršotā BFT) un PBFT (praktiskā BFT), piemēram, blokķēdē
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ā: .
- 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 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;
}un bināro attēlojumu, kā to redz tīkls
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029Plašāku informāciju par viedajiem līgumiem var atrast rakstā: .
Secinājums
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.
Šis ir tikai sākums!
Avots: www.habr.com
