Mida peaksime plokiahela üles ehitama?

Kogu inimkonna ajalugu on pidev ahelatest vabanemise ja uute, veelgi tugevamate loomise protsess. (Anonüümne autor)

Analüüsides arvukaid plokiahela projekte (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin jne), saan aru, et tehnilisest küljest on need kõik üles ehitatud samadel põhimõtetel. Plokiahelad meenutavad maju, millel on vaatamata kõigele erinevale disainile, sisekujundusele ja otstarvetele vundament, seinad, katus, aknad, uksed, mis on omavahel teatud viisil ühendatud. Ja kui mõistate hoone projekteerimise põhiprintsiipe ja teate kasutatud materjalide omadusi, saate määrata konkreetse maja sihtotstarbe. Praegu on plokiahelaga tekkinud olukord, et kõik on sellest kuulnud, kuid vähesed inimesed mõistavad arhitektuuri ja toimimispõhimõtteid. Seetõttu tekib arusaamatus, miks ja kuidas on plokiahela tehnoloogiaid mõttekas kasutada.

Selles artiklis analüüsime kõikidele plokiahelatele ühiseid omadusi ja põhimõtteid. Järgmisena vaatame üle probleemid, mida saab plokiahela abil lahendada ning materjali tugevdamiseks ehitame oma virtuaalsaidile väikese, kuid tõelise plokiahela!

Niisiis, meenutagem, millised probleemid plokiahel algselt lahendas.

Olen kindel, et paljud ütlevad hajutatud, detsentraliseeritud, avaliku ja muutumatu andmebaasi kohta. Aga milleks seda kõike vaja oli?

Eelistan alustada mis tahes tehnoloogia õppimist standardite lugemisest, kuna kõik uuritavat teemat käsitlevad artiklid ja raamatud põhinevad neil. Kuid praegu pole plokiahela standardeid; ISO on ainult loonud komiteed nende arendamiseks. Praegu on igal avalikul plokiahela projektil oma valge paberi dokument, mis on sisuliselt tehniline spetsifikatsioon. Esimene avalikult tuntud plokiahela projekt on Bitcoini võrk. Minge võrgu ametlikule veebisaidile ja vaata kust see kõik alguse sai.

Plokiahela väljakutse

Niisiis, ülesanne, mille plokiahel Bitcoini pioneerivõrgustikus lahendas, on digitaalsete varade (varade) omandiõiguse usaldusväärne üleandmine mitteusaldusväärses keskkonnas ilma vahendajateta. Näiteks Bitcoini võrgus on digitaalseks varaks bitcoini digitaalsed mündid. Ja kõik Bitcoini ja teiste plokiahelate tehnilised lahendused taanduvad selle probleemi lahendamisele.

Probleemid, mida plokiahel lahendab

Oletame, et teatud finantsorganisatsioon ütleb, et on üle maailma üles ehitanud võrgustiku, mille abil on võimalik raha üle kanda ükskõik millisele inimesele. Kas sa usud teda? Kui see organisatsioon on Visa või MasterCard, siis tõenäoliselt usute seda, aga kui suhteliselt, AnonymousWorldMoney, siis tõenäoliselt mitte. Miks? Aga sellepärast, et me teame väga hästi, kuidas erafirmad hajutatud süsteeme teevad, mis eesmärkidel ja milleni see võib viia. Vaatame lähemalt, millised on selliste süsteemide probleemid ja kuidas neid plokiahela tehnoloogiaid kasutades lahendada.

Oletame, et tingimuslikus AnonymousWorldMoneys on andmebaasidega servereid ja on hea, kui neid on erinevates andmekeskustes mitu. Kui saatja kannab raha üle, registreeritakse tehing, mis kopeeritakse kõikidesse serveritesse ja raha jõuab adressaadini.

Mida peaksime plokiahela üles ehitama?

Ideaalses maailmas töötab see skeem suurepäraselt, kuid meil tekivad järgmised probleemid:

  1. Ühelt poolt osalejate tuvastamise probleem ja teiselt poolt vajadus tehingute anonüümsuse järele. Need. raha tuleb kanda konkreetsele saajale ja nii, et peale tehingus osalejate ei tea sellest tehingust keegi. Pankadel on kontonumbrid ja pangakaardid seotud konkreetse füüsilise või juriidilise isikuga ning pangasaladus kaitseb tehinguteavet. Ja kes garanteerib, et tingimuslik AnonymousWorldMoney ei kasuta isikuandmeid ja tehinguteavet oma eesmärkidel?
  2. Kuidas teha kindlaks, et saaja sai täpselt sama summa, mis talle üle kanti? Suhteliselt öeldes kandis saatja 100 dollarit ja saaja sai 10 dollarit. Saatja tuleb oma kviitungiga AnonymousWorldMoney kontorisse ja ametnik näitab oma versiooni, kus on kirjas, et saatja kandis üle vaid 10 dollarit.
  3. Ebausaldusväärse keskkonna probleem, näiteks pettus nimega topeltkulu. Korramatu osaleja võib oma saldot mitu korda kulutada, kuni makse kopeeritakse kõikidesse serveritesse. CAP teoreemMuidugi ei tühistanud keegi ja lõpuks jõutakse kokkuleppele, kuid keegi ei saa raha pakutavate teenuste või kaupade eest. Seega, kui puudub täielik usaldus makseorganisatsiooni või tehingutes osalejate vastu, on vaja ehitada võrgustik mitte usaldusel, vaid krüptograafial.
  4. Tingimuslikul AnonymousWorldMoney'l on piiratud arv servereid, mis võivad tahtmatult või pahatahtliku kavatsuse tõttu kättesaamatuks muutuda.
  5. AnonymousWorldMoney võtab oma käegakatsutava vahendustasu.
  6. Kontrollimise võimalus. Bitcoini töötamise käigus selgus, et inimesed soovivad mitte ainult üksteisele münte üle kanda, vaid ka kontrollida tehingu erinevaid tingimusi, programmeerida tööstsenaariume, sooritada automaatselt toiminguid sõltuvalt tingimustest jne.

Kuidas blockchain neid probleeme lahendab

  1. Osalejate tuvastamine toimub paari võtmega: privaatne ja avalik ning digitaalallkirja algoritm tuvastab unikaalselt saatja ja saaja, jättes nende identiteedi anonüümseks.
  2. Tehingud kogutakse plokkidesse, ploki räsi arvutatakse ja kirjutatakse järgmisse plokki. See plokkidena räside salvestamise jada annab plokiahela tehnoloogiale oma nime ja muudab võimatuks ka plokkide või üksikute tehingute märkamatu muutmise/kustutamise plokkidest. Seega, kui tehing on plokiahelasse kaasatud, võite olla kindel, et selle andmed jäävad muutumatuks.
  3. Topeltkulutuspettusi välditakse, kui saavutatakse võrgu konsensus, milliseid andmeid lugeda kehtivaks ja milliseid ära visata. Bitcoini võrgus saavutatakse konsensus töötõendi (PoW) abil.
  4. Võrgu usaldusväärsus saavutatakse sellega, et plokiahel on avalik, kus iga osaleja saab käivitada oma sõlme, saada plokiahela täieliku koopia ja pealegi hakata iseseisvalt tehingute õigsust kontrollima. Tuleb märkida, et kaasaegsed plokiahelad võimaldavad ehitada mitte ainult avalikke (avatud), vaid ka privaatseid (suletud) plokiahelaid, samuti kombineeritud skeemide kasutamist.
  5. Plokiahel ei vabane vahendustasudest täielikult, sest... pead maksma võrku toetavatele inimestele, kuid plokiahelas on vahendustasu vajadus nii veenvalt tõestatud, et selle vajalikkuses pole kahtlustki.
  6. Tänapäevastel plokiahelatel on võimalus rakendada äriloogikat, mida plokiahelas nimetatakse nutikateks lepinguteks. Nutikate lepingute loogikat rakendatakse erinevates kõrgetasemelistes keeltes.

Järgmisena käsitleme neid lahendusi üksikasjalikumalt.

Plokiahela arhitektuur

Plokiahela komponendid

Iga osaleja saab käivitada oma sõlme koos plokiahela täieliku koopiaga (täissõlm). Kutsutakse täissõlmed, mis suudavad plokiahelas tehinguid salvestada konsensussõlmed (tunnistaja) või kaevurid (kaevur). Kutsutakse välja täissõlmed, mis kontrollivad ainult tehingute õigsust auditi sõlmed (audit). Kerged kliendid (kerged kliendid) ei salvesta plokiahela täiskoopiaid, vaid suhtlevad võrguga täissõlmede abil.
Enamik kasutajaid kasutab tehingute tegemiseks kergeid kliente või veebirahakotte. Kõik sõlmed on omavahel ühendatud. Selle elementide komplektiga muutub võrguarhitektuur stabiilsemaks:

Mida peaksime plokiahela üles ehitama?

Tehingu elutsükkel

Vaatame tehingu elutsüklit ja jagame selle osade kaupa:

Mida peaksime plokiahela üles ehitama?

Plokiahela tehnoloogiad

Peatugem lähemalt tehnilistel lahendustel ja nende omavahelistel seostel.

Identifitseerimine

Iga plokiahela tehing peab olema digitaalselt allkirjastatud. Seetõttu peab igal osalejal tehingu sooritamiseks olema võtmepaar: privaatne / avalik. Mõnikord nimetatakse võtmepaari rahakotiks, sest võtmed on unikaalselt seotud osaleja unikaalse digitaalaadressi ja saldoga. Tegelikkuses on võtmed ja aadressid vaid numbrijadad erinevates numbrisüsteemides. Võtmete ja rahakoti aadresside näited:

Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Plokiahelates digitaalallkirja loomiseks kasutatakse elliptilistel kõveratel põhinevat algoritmi: Elliptic Curve Digital Signature Algorithm (ECDSA). Selle toimimiseks võetakse privaatvõti (256-bitine number) tavaliselt juhuslikult. Võtmevalikute arv on 2 kuni 256, seega võime rääkida privaatvõtmete väärtuste sobitamise praktilisest võimatusest.

Järgmisena saadakse avalik võti privaatsest võtmest, korrutades selle väärtuse elliptilisel kõveral asuva punkti koordinaatidega, mille tulemusena saadakse samal kõveral oleva uue punkti koordinaadid. See toiming tagab, et saate tehingute digitaalseks allkirjastamiseks sobiva võtmepaari. Lõpuks tuletatakse rahakoti aadress ainulaadselt avalikust võtmest.

Plokiahelas kasutatava krüptograafia kohta on palju artikleid, näiteks: Bitcoin lühidalt – krüptograafia

Privaatvõti peab olema rangelt konfidentsiaalne ja kaitstud. Avalik võti on kõigile teada. Kui privaatvõti kaob, ei saa juurdepääsu varale (müntidele) taastada ja raha läheb igaveseks kaotsi. Seetõttu on privaatvõtmete turvalise salvestamise ülesanne äärmiselt oluline, sest See ei ole pank, kuhu saab alati passiga tulla ja konto taastada. Nn külmade krüptorahakottide tootmiseks, mis on sarnased välkmäluseadmetega, on terve tööstusharu:

Mida peaksime plokiahela üles ehitama?

või võite kasutada usaldusväärsemaid meetodeid, näiteks privaatvõtme väärtuse tembeldades lubadele:

Mida peaksime plokiahela üles ehitama?

Tehingud

Lisateavet tehingu struktuuri kohta leiate artiklist Bitcoin lühidalt – tehing. Meie jaoks on oluline mõista, et igal tehingul on vähemalt järgmised andmed:

From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - цифровой адрес отправителя
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - цифровой адрес получателя
Value: 0.0001 - сумма транзакции
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - хэш транзакции

Järgmisena allkirjastatakse tehing privaatvõtmega ja saadetakse välja (vt protokolli toimimise üksikasju Bitcoin lühidalt - protokoll) kõigile plokiahela sõlmedele, mis kontrollivad tehingute kehtivust. Tehingu kontrollimise algoritm on mittetriviaalne ja sisaldab kaks tosinat sammu.

Tehinguplokid

Pärast tehingute kehtivuse kontrollimist moodustavad sõlmed neist plokid. Lisaks tehingutele kirjutatakse plokki eelmise ploki räsi ja number (Nonce counter) ning praeguse ploki räsi arvutatakse SHA-256 algoritmi abil. Räsil peavad olema kehtestatud keerukuse tingimused. Näiteks Bitcoini võrgus muudetakse räsi raskusastet automaatselt iga 2 nädala järel, sõltuvalt võrgu võimsusest, nii et plokk genereeritakse ligikaudu kord 10 minuti jooksul. Keerukuse määrab järgmine tingimus: leitud räsi peab olema väiksem kui etteantud arv. Kui see tingimus ei ole täidetud, lisatakse Nonce'ile 1 ja räsi arvutamise tööd korratakse. Räsi valimiseks kasutatakse välja Nonce, sest Need on ainsad andmed plokis, mida saab muuta, ülejäänud peavad jääma muutmata. Kehtival räsil peab olema teatud arv alguses olevaid nulle, näiteks üks tegelikest räsidest:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Edukas räsi leidmine on Bitcoini või Ethereumi võrkude jaoks tehtud töö tõend (Proof-of-Work, PoW). Räside leidmise protsessi nimetatakse sarnaselt kulla kaevandamisega kaevandamiseks. Nimi määratleb üsna täpselt protsessi olemuse, sest seal on lihtne valikute otsing ja kui keegi leiab sobiva räsi, siis on see tõesti õnn. See on nagu tõelise kullatüki leidmine tonni aheraine seest. Plokipreemia on nüüd 12.5 BTC ja kui korrutada see praeguse Bitcoini kursiga 3900 dollarit, saate rohkem kui kilogrammi puhast kulda. On, mille nimel võidelda!

Pärast räsi edukat leidmist kirjutatakse plokk ja leitud räsi ise järgmise plokina plokiahelasse. Lisateavet plokkide struktuuri kohta leiate artiklist Bitcoin lühidalt - Blockchainja allpool on lihtsustatud diagramm:

Mida peaksime plokiahela üles ehitama?

Plokiahel algab plokiga, millel ei ole veel eelmise ploki räsi. Plokiahelas on ainult üks selline plokk ja sellel on oma nimi Genesis block. Ülejäänud plokid on sama struktuuriga ja erinevad ainult tehingute arvu poolest. Praegu Bitcoinis või Ethereumis loodavaid reaalseid tehinguid ja plokke saab vaadata Blokeerige Explorer.

Bitcoini plokkide suurus on piiratud 1 MB-ga ja minimaalse teabehulgaga tehingus on umbes 200 baiti, võib maksimaalne tehingute arv plokis olla umbes 6000. Siit, muide, järgneb Bitcoini jõudlus, mille üle kõik naeravad: umbes kord 10 minuti jooksul genereeritakse plokk * 60 sekundit = 600 sekundit, mis annab formaalseks soorituseks umbes 10 TPS. Kuigi tegelikult pole see tootlikkus, vaid teadlikult rakendatud tööalgoritm. Ethereumis muutsid nad võistluse jaoks lihtsalt ploki genereerimise ajaks 15 sekundit. ja tootlikkus tõusis ametlikult hüppeliselt. Seetõttu pole plokiahelates, mis kasutavad PoW-d konsensusena, jõudlust üldse mõtet võrrelda, sest see sõltub otseselt vahemälu arvutamise keerukusest, mille saab omistada mis tahes väärtusele.

Kahvlid

Mis juhtub, kui näiteks mitu sõlme leiavad keerukuse tingimustele vastavad, kuid erineva väärtusega räsid (ehk siis jõudsid erinevatele konsensustele) ja kirjutasid plokiahelasse plokid? Vaatame, kuidas plokiahel selle olukorra eest kaitseb. Sel juhul tekib nn kahvel ja plokiahelal on kaks ahela versiooni:

Mida peaksime plokiahela üles ehitama?

Mis järgmisena juhtub? Järgmisena hakkab osa võrgust töötama plokis N+2 ühest ahelast ja osa teisest:

Mida peaksime plokiahela üles ehitama?

Üks neist plokkidest leitakse varem ja saadetakse plokiahelasse ning seejärel peab plokiahel reeglite kohaselt lülituma pikemale ahelale ja tühistama kõik alternatiivsest plokist tehtud tehingud:

Mida peaksime plokiahela üles ehitama?

Samal ajal võib tekkida olukord, kus osaleja tehing oli ainult ühes kahvliplokis, mis tühistati. Seetõttu, et olla kindel, et soovitud tehing plokiahelasse salvestatakse, on üldine soovitus – enne tehingu usaldamist tuleks oodata, kuni plokiahelasse lisatakse järgmised paar plokki. Soovitused selle kohta, kui palju plokke erinevate plokiahelate jaoks oodata, on erinevad. Näiteks Bitcoini võrgu jaoks on miinimum 2 plokki, maksimaalne on 6.

Sama pilt plokiharkidega on näha ka nn 51% rünnaku ajal – see on siis, kui grupp kaevureid üritab kasvatada alternatiivset plokkahelat, püüdes oma pettustehingutega ketti katkestada. Kuigi praegu on pettuse asemel tulusam kulutada oma jõudu ausale kaevandamisele.

Konsensus

Ploki plokiahelasse salvestamiseks peab võrk jõudma konsensusele. Meenutagem arvutisidevõrkudes konsensuse saavutamise ülesannet. Probleem on sõnastatud Bütsantsi kindralite BFT ülesandena (Bütsantsi rikketaluvus). Jättes välja Bütsantsi armee probleemide maalilise kirjelduse, saab probleemi sõnastada järgmiselt: kuidas saavad võrgusõlmed jõuda ühise tulemuseni, kui mõned võrgusõlmed võivad neid tahtlikult moonutada. Olemasolevad algoritmid BFT probleemi lahendamiseks näitavad, et võrk saab korralikult toimida, kui petturitest on vähem kui 1/3. Miks ei ole Bitcoini võrgus rakendatud BFT konsensust? Miks oli vaja PoW-d kasutada? Põhjuseid on mitu:

  • BFT töötab hästi väikese fikseeritud sõlmede komplektiga, kuid avalikus plokiahelas on sõlmede arv ettearvamatu ja pealegi saab sõlmi juhuslikult sisse ja välja lülitada.
  • Inimesi on vaja motiveerida käivitama plokiahela sõlmi. Selleks tuleb inimesi premeerida. BFT-s pole formaalselt millegi eest tasu saada, kuid see, mille eest tasu PoW-s on, on kõigile arusaadav intuitiivsel tasandil: protsessori poolt plokkräsi leidmise käigus kulutatud elektri eest.

Lisaks PoW-le on tänapäevastes plokiahelates kasutusel veel mitu konsensust, näiteks:

  • PoS (Proof-of-Stake) – plokiahelas Ülihaldaja
  • DPoS (Delegated Proof-of-Stake) – plokiahelas BitShares
  • BFT modifikatsioonid: SBFT (lihtsustatud BFT) ja PBFT (praktiline BFT), näiteks plokiahelas Exonum

Peatugem veidi PoS-i konsensusel, sest... Just PoS ja selle sordid on privaatsetes plokiahelates kõige levinumad. Miks privaatselt? Ühest küljest on PoS-i omadused PoW-ga võrreldes paremad, kuna Konsensuse saavutamiseks on vaja vähem arvutusressursse, mis tähendab, et andmete plokiahelasse kirjutamise kiirus suureneb. Kuid teisest küljest on PoS-il rohkem võimalusi pettusteks, nii et selle neutraliseerimiseks peavad olema teada kõik plokiahelas osalejad.

PoS konsensus põhineb sõlme valikul, mis suudab kirjutada ploki tehingutega plokiahelasse sõltuvalt kontol olevate rahaliste vahendite hulgast või õigemini mitte kontol, vaid tagatisel, s.t. Mida rohkem raha teil tagatiseks on, seda tõenäolisemalt valib võrk teie sõlme ploki kirjutamiseks. Tagatisraha ei tagastata, kui blokk on kehtetu. See tagab kaitse pettuse eest. PoS-il on järgmised variatsioonid:

  • Delegeeritud PoS-i (DPoS) konsensus jagab osalejad "hääletajateks" ja "validaatoriteks". Mündiomanikud (hääleõigusega osalejad) delegeerivad teistele osalejatele oma volitused plokiahelas tehingute kontrollimiseks ja registreerimiseks. Seega teevad validaatorid kogu arvutustöö ja saavad selle eest tasu ning hääletajate kohalolek garanteerib validaatorite aususe, sest neid saab igal ajal muuta.
  • LPoS-i (Leased Proof-of-Stake) konsensus võimaldab teil liisida oma raha teistele sõlmedele, et neil oleks parem võimalus plokke kinnitada. See. Tehingute eest saate vahendustasu ilma tegelikus tehingukontrollis ja plokkide kaevandamises osalemata.

On mitmeid teisi konsensuseid, mida veel laialdaselt ei kasutata, loetlen need siin lihtsalt teadmiseks ning ülevaate konsensusalgoritmidest endist leiab näiteks artiklist: Konsensusalgoritmid plokiahelas.

  • PoET (kulunud aja tõend)
  • PoC (mahutavuse tõendamine)
  • PoB (põlemistõend)
  • PoWeight (kaalutõend)
  • PoA (Proof-of-Activity) – PoW + PoS
  • PoI (olulisuse tõendamine)

Plokiahelate töökindlus ja juurutusmudelid

Avalik plokiahel

Stabiilsus avalik või mõni muu nimi Lubadeta plokiahel See saavutatakse, võimaldades kõigil ühendust luua ja teavet vaadata või isegi oma sõlme ühendada ning usaldus põhineb PoW konsensusel.

Privaatne plokiahel

Era- või Privaatne loaga plokiahel. Nendes plokiahelates on teabele juurdepääs ainult teatud osalejate rühmal (organisatsioonidel või inimestel). Selliseid plokiahelaid ehitavad organisatsioonid eesmärgiga suurendada üldist kasu või tõhusust. Nende töökindluse tagavad osalejate ühised eesmärgid ning PoS ja BFT konsensusalgoritmid.

Plokiahela konsortsium

Seal Konsortsium või Avalikult lubatud plokiahel. Need on plokiahelad, millega igaüks saab vaatamiseks ühenduse luua, kuid osaleja saab infot lisada või oma sõlme ühendada ainult teiste osalejate loal. Selliseid plokiahelaid ehitavad organisatsioonid selleks, et suurendada klientide või toodete tarbijate või ühiskonna kui terviku usaldust. Siin saavutatakse usaldusväärsus ka osalejate vahelise usalduse ja samade PoS ja BFT konsensusalgoritmide olemasoluga.

Tarkvaralepingud

Pärast Bitcoini juurutatud plokiahelad on ühel või teisel määral lisanud võimaluse täita nutikaid lepinguid. Sisuliselt on nutikas leping tehing, mille täitmiseks asetatakse programmikood. Nutikad lepingud Ethereumi võrgus täidetakse EVM-is (Ethereumi virtuaalmasin). Nutilepingu täitmise alustamiseks peab see olema selgesõnaliselt mõne teise tehinguga käivitatud või täidetud peavad olema täitmise eeldused. Nutilepingu täitmise tulemused salvestatakse ka plokiahelasse. Andmete vastuvõtmine väljastpoolt plokiahelat on võimalik, kuid äärmiselt piiratud.

Millist äriloogikat saab nutika lepingu abil rakendada? Tegelikult pole palju, näiteks tingimuste kontrollimine plokiahela andmete abil, digitaalsete varade omanike vahetamine nendest tingimustest olenevalt, andmete salvestamine plokiahela sees olevasse püsisalve. Loogikat rakendatakse spetsiaalses kõrgetasemelises keeles Solidity.

Klassikaline näide funktsionaalsusest, mida rakendatakse nutikate lepingute abil, on ICOde jaoks žetoonide väljastamine. Näiteks rakendasin nutika lepingu tagasihoidliku 500 000 000 AlexTokeni väljastamiseks. Kõrval link Etherscanis on

nutilepingu lähtekood Solidity keeles

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;
}

ja binaarne esitus sellisena, nagu võrk seda näeb

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Lisateavet nutikate lepingute kohta leiate artiklist: Mis on nutikad lepingud Ethereumis.

Järeldus

Oleme loetlenud tehnoloogiad, millele moodsad plokiahelad on üles ehitatud ja kuidas need on omavahel ühendatud. Nüüd sõnastame, milliseid probleeme saab plokiahela abil lahendada ja millised lahendused on parimal juhul ebaefektiivsed. Seega pole plokiahela kasutamine vajalik, kui:

  • Tehingud tehakse usaldusväärses keskkonnas;
  • Vahendajate komisjoni olemasolu ei halvenda osalejate elu;
  • Osalejatel ei ole vara, mida saaks esitada digitaalsete varadena;
  • Digivarades jaotus puudub, s.o. väärtus kuulub või tarnib ainult üks osaleja.

Mida toob plokiahela tulevik? Nüüd saame vaid spekuleerida võimalike viiside üle plokiahela tehnoloogiate arendamiseks:

  • Blockchainist saab oma spetsiifiliste probleemide lahendamiseks sama levinud andmebaasitehnoloogia nagu näiteks SQL või NoSQL;
  • Blockchainist saab laialt levinud protokoll, nagu HTTP on Interneti jaoks;
  • Plokiahelast saab planeedi uue finants- ja poliitilise süsteemi alus!

Järgmises osas vaatame, millised plokiahelad praegu eksisteerivad ja miks neid erinevates tööstusharudes kasutatakse.

See on alles algus!

Allikas: www.habr.com

Lisa kommentaar