Ką turėtume sukurti blokų grandinę?

Visa žmonijos istorija – tai nenutrūkstamas grandinių atsikratymo ir naujų, dar stipresnių kūrimo procesas. (Anoniminis autorius)

Analizuodamas daugybę „blockchain“ projektų („Bitshares“, „Hyperledger“, „Exonum“, „Ethereum“, „Bitcoin“ ir kt.), suprantu, kad techniniu požiūriu jie visi sukurti remiantis tais pačiais principais. Blockchains primena namus, kurie, nepaisant visos dizaino, dekoro ir paskirties įvairovės, turi tam tikrais būdais tarpusavyje sujungtus pamatus, sienas, stogą, langus, duris. Ir jei jūs suprantate pagrindinius pastato projektavimo principus ir žinote naudojamų medžiagų savybes, galite nustatyti konkretaus namo paskirtį. Šiuo metu su blockchain susiklostė tokia situacija, kad apie ją girdėjo visi, tačiau mažai kas supranta architektūrą ir veikimo principus. Todėl kyla nesusipratimas, kodėl ir kaip prasminga naudoti blockchain technologijas.

Šiame straipsnyje išanalizuosime visoms blokų grandinėms būdingas savybes ir principus. Toliau pažvelkime į problemas, kurias galima išspręsti naudojant „blockchain“, o norėdami sustiprinti medžiagą, savo virtualioje svetainėje sukurkime mažą, bet tikrą „blockchain“!

Taigi, prisiminkime, kokias problemas iš pradžių išsprendė „blockchain“.

Esu tikras, kad daugelis pasakys apie paskirstytą, decentralizuotą, viešą ir nekintamą duomenų bazę. Bet kam viso to reikėjo?

Man labiau patinka pradėti mokytis bet kokios technologijos skaitydamas standartus, nes visi straipsniai ir knygos tiriama tema yra jais pagrįsti. Tačiau šiuo metu nėra blokų grandinės standartų; ISO tik sukūrė komitetai jų vystymuisi. Šiuo metu kiekvienas viešas blokų grandinės projektas turi savo baltąjį dokumentą, kuris iš esmės yra techninė specifikacija. Pirmasis viešai žinomas blockchain projektas yra Bitcoin tinklas. Eikite į oficialią tinklo svetainę ir žiūrėk kur viskas prasidėjo.

Blockchain iššūkis

Taigi užduotis, kurią blokų grandinė išsprendė Bitcoin pionierių tinkle, yra atlikti patikimą skaitmeninio turto (turto) nuosavybės teisės perdavimą nepatikimoje aplinkoje be tarpininkų. Pavyzdžiui, Bitcoin tinkle skaitmeninis turtas yra bitcoin skaitmeninės monetos. Ir visi techniniai Bitcoin ir kitų blokų grandinių sprendimai yra susiję su šios problemos sprendimu.

Problemos, kurias išsprendžia blokų grandinė

Tarkime, tam tikra finansinė organizacija sako, kad visame pasaulyje sukūrė tinklą, kurio pagalba galima pervesti pinigus bet kuriam asmeniui. Ar patikėsite ja? Jei ši organizacija yra „Visa“ arba „MasterCard“, greičiausiai tuo patikėsite, bet jei, santykinai tariant, „AnonymousWorldMoney“, greičiausiai nepatikėsite. Kodėl? Bet todėl, kad labai gerai žinome, kaip paskirstytas sistemas kuria privačios įmonės, kokiais tikslais ir ką tai gali lemti. Pažvelkime atidžiau į tokių sistemų problemas ir kaip jas galima išspręsti naudojant blockchain technologijas.

Tarkime, sąlyginiame AnonymousWorldMoney yra serveriai su duomenų bazėmis, ir gerai, jei jų yra keli skirtinguose duomenų centruose. Kai siuntėjas perveda pinigus, užregistruojama operacija, kuri atkartojama į visus serverius ir pinigai pasiekia gavėją.

Ką turėtume sukurti blokų grandinę?

Idealiame pasaulyje ši schema veikia puikiai, tačiau pas mus iškyla šios problemos:

  1. Viena vertus, dalyvių identifikavimo problema ir, kita vertus, sandorių anonimiškumo poreikis. Tie. reikia pervesti pinigus konkrečiam gavėjui ir taip, kad apie šią operaciją niekas nežinotų, išskyrus operacijos dalyvius. Bankai turi sąskaitų numerius ir banko korteles, susietas su konkrečiu fiziniu ar juridiniu asmeniu, o banko paslaptis apsaugo operacijų informaciją. O kas garantuoja, kad sąlyginis AnonymousWorldMoney nenaudos asmens duomenų ir sandorių informacijos savo tikslams?
  2. Kaip įsitikinti, kad gavėjas gavo būtent tokią sumą, kuri jam buvo pervesta? Santykinai kalbant, siuntėjas pervedė 100 USD, o gavėjas gavo 10 USD. Siuntėjas ateina į AnonymousWorldMoney biurą su savo kvitu, o tarnautojas parodo savo versiją, kur parašyta, kad siuntėjas pervedė tik 10 USD.
  3. Nepatikimos aplinkos problema, pavyzdžiui, sukčiavimas, vadinamas dvigubomis išlaidomis. Nesąžiningas dalyvis gali kelis kartus išleisti savo likutį, kol mokėjimas bus perkeltas į visus serverius. BŽŪP teorema, žinoma, niekas neatšaukė, ir susitarimas galiausiai bus pasiektas, tačiau kažkas negaus pinigų už suteiktas paslaugas ar prekes. Todėl, jei nėra visiško pasitikėjimo mokėjimo organizacija ar operacijų dalyviais, reikia kurti tinklą, pagrįstą ne pasitikėjimu, o kriptografija.
  4. Sąlyginis AnonymousWorldMoney turi ribotą skaičių serverių, kurie gali tapti nepasiekiami netyčia arba dėl piktavališkų ketinimų.
  5. AnonymousWorldMoney paims apčiuopiamą komisinį atlyginimą.
  6. Galimybė valdyti. Veikiant „Bitcoin“ paaiškėjo, kad žmonės nori ne tik pervesti monetas vieni kitiems, bet ir patikrinti įvairias sandorio sąlygas, programuoti darbo scenarijus, automatiškai atlikti veiksmus priklausomai nuo sąlygų ir pan.

Kaip blokų grandinė išsprendžia šias problemas

  1. Dalyvių identifikavimas atliekamas naudojant porą raktų: privatų ir viešą, o skaitmeninio parašo algoritmas vienareikšmiškai identifikuoja siuntėją ir gavėją, paliekant jų tapatybes anonimiškas.
  2. Sandoriai surenkami į blokus, apskaičiuojama bloko maiša ir įrašoma į kitą bloką. Ši maišos įrašymo blokuose seka suteikia blokų grandinės technologijai pavadinimą, be to, neįmanoma nepastebimai pakeisti / ištrinti blokų ar atskirų operacijų iš blokų. Taigi, jei sandoris yra įtrauktas į blokų grandinę, galite būti tikri, kad jo duomenys išliks nepakitę.
  3. Dvigubo išlaidų sukčiavimo išvengiama, kai tinkle sutariama, kuriuos duomenis laikyti tinkamais, o kuriuos atmesti. Bitcoin tinkle sutarimas pasiekiamas darbo įrodymu (PoW).
  4. Tinklo patikimumas pasiekiamas dėl to, kad blokų grandinė yra vieša, kur kiekvienas dalyvis gali paleisti savo mazgą, gauti pilną blokų grandinės kopiją ir, be to, savarankiškai pradėti tikrinti operacijų teisingumą. Reikėtų pažymėti, kad šiuolaikinės blokų grandinės leidžia kurti ne tik viešas (atviras), bet ir privačias (uždaras) grandines, taip pat naudoti kombinuotas schemas.
  5. Blockchain visiškai neatsikratys komisinių, nes... Jūs turite mokėti žmonėms, kurie palaiko tinklą, tačiau "blockchain" komisinių poreikis yra įrodytas taip įtikinamai, kad nekyla abejonių dėl jo reikalingumo.
  6. Šiuolaikinės blokų grandinės turi galimybę įgyvendinti verslo logiką, kuri blokų grandinėje vadinama išmaniosiomis sutartimis. Išmaniųjų sutarčių logika įgyvendinama įvairiomis aukšto lygio kalbomis.

Toliau mes apsvarstysime šiuos sprendimus išsamiau.

Blockchain architektūra

Blockchain komponentai

Kiekvienas dalyvis gali paleisti savo mazgą su visa blokų grandinės kopija (visu mazgu). Iškviečiami visi mazgai, galintys įrašyti operacijas blokų grandinėje konsensuso mazgai (liudytojas) arba kalnakasiai (miner). Iškviečiami pilni mazgai, kurie tik tikrina operacijų teisingumą audito mazgai (auditas). Lengvi klientai (lengvi klientai) nesaugo visų blokų grandinės kopijų, bet sąveikauja su tinklu naudodami pilnus mazgus.
Dauguma vartotojų sandoriams atlikti naudoja paprastus klientus arba internetines pinigines. Visi mazgai yra sujungti vienas su kitu. Naudojant šį elementų rinkinį, tinklo architektūra tampa stabilesnė:

Ką turėtume sukurti blokų grandinę?

Sandorio gyvavimo ciklas

Pažvelkime į operacijos gyvavimo ciklą ir suskirstykime jį po gabalėlį:

Ką turėtume sukurti blokų grandinę?

Blockchain technologijos

Išsamiau pakalbėkime apie techninius sprendimus ir jų tarpusavio ryšius.

Identifikavimas

Kiekviena „blockchain“ operacija turi būti pasirašyta skaitmeniniu būdu. Todėl, kad užbaigtų operaciją, kiekvienas dalyvis turi turėti raktų porą: privatus / viešas. Kartais raktų pora vadinama pinigine, nes raktai yra unikaliai susieti su unikaliu dalyvio skaitmeniniu adresu ir balansu. Iš tikrųjų raktai ir adresai yra tik skaičių eilutės skirtingose ​​skaičių sistemose. Raktų ir piniginės adresų pavyzdžiai:

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

Norint sukurti skaitmeninį parašą blokų grandinėse, naudojamas elipsinėmis kreivėmis pagrįstas algoritmas: Elipsinės kreivės skaitmeninio parašo algoritmas (ECDSA). Kad jis veiktų, privatus raktas (256 bitų skaičius) paprastai paimamas atsitiktinai. Raktų parinkčių skaičius yra nuo 2 iki 256, todėl galime kalbėti apie praktinę privačių raktų reikšmių suderinimo neįmanoma.

Tada viešasis raktas gaunamas iš privataus rakto, padauginus jo reikšmę iš taško, esančio elipsinėje kreivėje, koordinačių, todėl toje pačioje kreivėje gaunamos naujo taško koordinatės. Šis veiksmas užtikrina, kad gausite raktų porą, tinkamą skaitmeniniam pasirašymui. Galiausiai piniginės adresas yra unikaliai išvestas iš viešojo rakto.

Yra daug straipsnių su išsamia informacija apie blokų grandinėje naudojamą kriptografiją, pavyzdžiui: Bitcoin trumpai – kriptografija

Privatus raktas turi būti griežtai konfidencialus ir saugomas. Viešasis raktas yra žinomas visiems. Praradus privatųjį raktą, prieiga prie turto (monetų) negali būti atkurta ir pinigai bus prarasti amžiams. Todėl užduotis saugiai saugoti privačius raktus yra itin aktuali, nes Tai ne bankas, į kurį visada galite ateiti su pasu ir atkurti sąskaitą. Yra visa pramonė, gaminanti vadinamąsias šaltąsias kriptovaliutos pinigines, panašias į „flash drives“:

Ką turėtume sukurti blokų grandinę?

arba galite naudoti patikimesnius metodus, pavyzdžiui, privataus rakto reikšmę žymėdami žetonuose:

Ką turėtume sukurti blokų grandinę?

Sandoriai

Daugiau informacijos apie sandorio struktūrą rasite straipsnyje Trumpai tariant, Bitcoin – Sandoris. Mums svarbu suprasti, kad kiekviena operacija turi bent šiuos duomenis:

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

Tada operacija pasirašoma privačiu raktu ir išsiunčiama (žr. išsamią informaciją apie protokolo veikimą Trumpas Bitcoin protokolas) į visus blokų grandinės mazgus, kurie tikrina operacijų galiojimą. Operacijų tikrinimo algoritmas nėra trivialus ir apima dvi dešimtys žingsnių.

Sandorių blokai

Patikrinus operacijų galiojimą, mazgai formuoja iš jų blokus. Be operacijų, į bloką įrašoma ankstesnio bloko maiša ir skaičius (Nonce counter), o dabartinio bloko maiša apskaičiuojama naudojant SHA-256 algoritmą. Maišos turi būti nustatytos sudėtingumo sąlygos. Pavyzdžiui, Bitcoin tinkle maišos sudėtingumas automatiškai keičiamas kas 2 savaites, priklausomai nuo tinklo galios, kad blokas būtų generuojamas maždaug kartą per 10 minučių. Sudėtingumas nustatomas pagal šią sąlygą: rasta maiša turi būti mažesnė už iš anksto nustatytą skaičių. Jei ši sąlyga neįvykdyta, tada prie Nonce pridedamas 1, o maišos skaičiavimo darbas kartojamas. Norint pasirinkti maišą, naudojamas laukas Nonce, nes Tai vieninteliai duomenys bloke, kuriuos galima keisti, o kiti turi likti nepakitę. Tinkama maiša turi turėti tam tikrą skaičių priekinių nulių, pvz., vieną iš tikrųjų maišų:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Sėkmingas maišos radimas yra atlikto darbo įrodymas (Proof-of-Work, PoW) Bitcoin arba Ethereum tinkluose. Maišos paieškos procesas vadinamas kasyba, panašiai kaip aukso kasyba. Pavadinimas gana tiksliai nusako proceso esmę, nes yra paprasta parinkčių paieška, ir jei kas nors randa tinkamą maišą, tai tikrai yra sėkmė. Tai tarsi tikro aukso grynuolio radimas tonose atliekų. Bloko atlygis dabar yra 12.5 BTC ir padauginę jį iš dabartinės Bitcoin kurso 3900 USD, gausite daugiau nei kilogramą gryno aukso. Yra už ką kovoti!

Sėkmingai suradus maišą, blokas ir pati rasta maiša įrašomi į blokų grandinę kaip kitas blokas. Daugiau informacijos apie blokų struktūrą rasite straipsnyje Trumpai tariant, „Bitcoin“ – „Blockchain“., o žemiau yra supaprastinta diagrama:

Ką turėtume sukurti blokų grandinę?

Blockchain prasideda bloku, kuris dar neturi ankstesnio bloko maišos. „Blockchain“ yra tik vienas toks blokas ir turi savo pavadinimą „Genesis block“. Likę blokai turi tą pačią struktūrą ir skiriasi tik operacijų skaičiumi. Tikras operacijas ir blokus, šiuo metu kuriamus Bitcoin arba Ethereum, galima peržiūrėti Blokuoti „Explorer“.

„Bitcoin“ blokų dydis ribojamas iki 1 MB, o minimalus informacijos kiekis sandoryje yra apie 200 baitų, maksimalus operacijų skaičius bloke gali būti apie 6000. Iš čia, beje, seka Bitcoin našumas, iš kurio visi juokiasi: blokas generuojamas maždaug kartą per 10 minučių * 60 sekundžių = 600 sekundžių, o tai suteikia formalų apie 10 TPS našumą. Nors iš tikrųjų tai ne produktyvumas, o sąmoningai įgyvendintas darbo algoritmas. Ethereum, norėdami konkuruoti, bloko generavimo laikas buvo 15 sekundžių. ir produktyvumas oficialiai išaugo. Todėl blokų grandinėse, kuriose PoW naudojamas kaip sutarimas, nėra prasmės lyginti našumo, nes tai tiesiogiai priklauso nuo talpyklos skaičiavimo sudėtingumo, kurį galima priskirti bet kuriai reikšmei.

Šakės

Kas atsitiks, jei, pavyzdžiui, keli mazgai aptiktų maišos, kurios atitinka sudėtingumo sąlygas, bet yra skirtingos vertės (kitaip tariant, priėjo prie skirtingų sutarimų) ir parašė blokus į blokų grandinę? Pažiūrėkime, kaip blokų grandinė apsaugo nuo šios situacijos. Tokiu atveju atsiranda vadinamoji šakutė, o blokų grandinė turi dvi grandinės versijas:

Ką turėtume sukurti blokų grandinę?

Kas bus toliau? Tada dalis tinklo pradeda dirbti N+2 bloke iš vienos grandinės, o dalis iš kitos:

Ką turėtume sukurti blokų grandinę?

Vienas iš šių blokų bus rastas anksčiau ir išsiųstas į blokų grandinę, o tada pagal taisykles blockchain turės pereiti prie ilgesnės grandinės ir atšaukti visas operacijas iš alternatyvaus bloko:

Ką turėtume sukurti blokų grandinę?

Tuo pačiu metu gali susidaryti situacija, kai dalyvio sandoris buvo tik viename iš šakių blokų, kuris buvo atšauktas. Todėl norint įsitikinti, kad norima transakcija yra įrašyta į blokų grandinę, yra bendra rekomendacija – prieš pasitikėdami sandoriu, turėtumėte palaukti, kol į blockchain bus įtraukti keli kiti blokai. Rekomendacijos, kiek blokų reikia laukti skirtingų blokų grandinių, skiriasi. Pavyzdžiui, Bitcoin tinkle minimalus yra 2 blokai, didžiausias - 6.

Tas pats vaizdas su blokinėmis šakėmis bus stebimas per vadinamąją 51% ataką – tai tada, kai kalnakasių grupė bando užauginti alternatyvią blokų grandinę, siekdama nutraukti grandinę savo nesąžiningais sandoriais. Nors šiuo metu, užuot sukčiavęs, pelningiau savo jėgą išleisti sąžiningai kasybai.

Sutarimas

Norint įrašyti bloką blokų grandinėje, tinklas turi pasiekti sutarimą. Prisiminkime užduotį pasiekti sutarimą kompiuterinių ryšių tinkluose. Problema suformuluota kaip Bizantijos generolų BFT (Bizantijos tolerancija gedimams). Praleidus vaizdingą Bizantijos armijos problemų aprašymą, problemą galima suformuluoti taip: kaip tinklo mazgai gali pasiekti bendrą rezultatą, jei kai kurie tinklo mazgai gali juos sąmoningai iškraipyti. Esami BFT problemos sprendimo algoritmai rodo, kad tinklas gali tinkamai veikti, jei sukčių yra mažiau nei 1/3. Kodėl BFT konsensusas nebuvo pritaikytas Bitcoin tinklui? Kodėl reikėjo naudoti PoW? Yra keletas priežasčių:

  • BFT gerai veikia su nedideliu fiksuotu mazgų rinkiniu, tačiau viešoje blokų grandinėje mazgų skaičius yra nenuspėjamas, be to, mazgus galima įjungti ir išjungti atsitiktinai.
  • Būtina motyvuoti žmones paleisti blokų grandinės mazgus. Norėdami tai padaryti, žmonės turi būti apdovanoti. BFT formaliai nėra už ką gauti atlygio, bet už ką atlygis PoW, visiems aišku intuityviu lygmeniu: už procesoriaus sunaudotą elektros energiją ieškant bloko maišos.

Be PoW, yra keletas kitų sutarimų, kurie naudojami šiuolaikinėse blokų grandinėse, pavyzdžiui:

  • PoS (Proof-of-Stake) – blokų grandinėje Hyperledger
  • DPoS (Delegated Proof-of-Stake) – blokų grandinėje BitShares
  • BFT modifikacijos: SBFT (supaprastintas BFT) ir PBFT (praktinis BFT), pavyzdžiui, blokų grandinėje Exonum

Šiek tiek apsistokime ties sutarimu dėl PoS, nes... Būtent PoS ir jo atmainos yra labiausiai paplitusios privačiose blokų grandinėse. Kodėl privačiai? Viena vertus, PoS charakteristikos yra geresnės, palyginti su PoW, nes Norint pasiekti konsensusą, reikia mažiau skaičiavimo resursų, o tai reiškia, kad padidėja duomenų įrašymo į blokų grandinę greitis. Tačiau, kita vertus, PoS turi daugiau galimybių sukčiauti, todėl norint tai neutralizuoti, turi būti žinomi visi blockchain dalyviai.

PoS konsensusas grindžiamas mazgo, kuris gali įrašyti bloką su operacijomis į blockchain, pasirinkimą priklausomai nuo lėšų kiekio sąskaitoje, tiksliau, ne sąskaitoje, o užstate, t.y. Kuo daugiau lėšų turėsite užstatu, tuo didesnė tikimybė, kad tinklas pasirinks jūsų mazgą blokui įrašyti. Užstatas negrąžinamas, jei blokas negalioja. Tai užtikrina apsaugą nuo sukčiavimo. Yra šie PoS variantai:

  • Deleguotojo PoS (DPoS) konsensusas dalija dalyvius į „balsuotojus“ ir „validatorius“. Monetų turėtojai (balsavimo dalyviai) perduoda savo teisę tikrinti ir registruoti operacijas blokų grandinėje kitiems dalyviams. Taigi tikrintojai atlieka visą skaičiavimo darbą ir už tai gauna atlygį, o balsavimo dalyvių buvimas garantuoja tikrintojų sąžiningumą, nes juos galima bet kada pakeisti.
  • LPoS (Leased Proof-of-Stake) sutarimas leidžia išnuomoti savo lėšas kitiems mazgams, kad jie turėtų didesnę galimybę patvirtinti blokus. Tai. Galite gauti komisinį mokestį už operacijas nedalyvaudami faktiniame sandorio patikrinime ir blokų gavyboje.

Yra nemažai kitų konsensusų, kurie dar nėra plačiai naudojami, aš tiesiog juos išvardinsiu čia, kad gautų informaciją, o pačių konsensuso algoritmų apžvalgą galite rasti, pavyzdžiui, straipsnyje: Konsensuso algoritmai blokų grandinėje.

  • PoET (praėjusio laiko įrodymas)
  • PoC (pajėgumo įrodymas)
  • PoB (degimo įrodymas)
  • PoWeight (svorio įrodymas)
  • PoA (veiklos įrodymas) – PoW + PoS
  • PoI (svarbumo įrodymas)

Blockchainų patikimumo ir diegimo modeliai

Vieša blokų grandinė

Pastovumas Visuomenės ar kitu vardu Neleidžiama blokų grandinė Tai pasiekiama leidžiant bet kam prisijungti ir peržiūrėti informaciją ar net prijungti savo mazgą, o pasitikėjimas grindžiamas PoW konsensusu.

Privati ​​blokų grandinė

Privatus arba Privati ​​​​leistina blokų grandinė. Šiose blokų grandinėse tik tam tikra dalyvių grupė (organizacijų ar žmonių) turi prieigą prie informacijos. Tokias blokų grandines kuria organizacijos, siekdamos padidinti bendrą naudą ar efektyvumą. Jų patikimumą užtikrina bendri dalyvių tikslai bei PoS ir BFT konsensuso algoritmai.

Blockchain konsorciumas

Ten Konsorciumas arba Viešai leidžiama blokų grandinė. Tai yra blokų grandinės, prie kurių gali prisijungti bet kas, kad galėtų peržiūrėti, tačiau dalyvis gali pridėti informacijos arba prijungti savo mazgą tik gavęs kitų dalyvių leidimą. Tokias blokų grandines kuria organizacijos, siekdamos padidinti klientų ar produktų vartotojų ar visos visuomenės pasitikėjimą. Čia patikimumas taip pat pasiekiamas dėl dalyvių pasitikėjimo ir tų pačių PoS ir BFT konsensuso algoritmų.

Pažangios sutartys

Po Bitcoin įdiegtos blokų grandinės vienu ar kitu laipsniu pridėjo galimybę vykdyti išmaniąsias sutartis. Iš esmės išmanioji sutartis yra operacija, kurioje vykdomas programos kodas. Išmaniosios sutartys Ethereum tinkle vykdomos EVM (Ethereum virtualioji mašina). Norint pradėti vykdyti išmaniąją sutartį, ji turi būti aiškiai paleista kita operacija arba turi būti įvykdytos išankstinės sąlygos. Išmaniosios sutarties vykdymo rezultatai taip pat bus užfiksuoti blokų grandinėje. Duomenų gavimas iš blokų grandinės ribų yra įmanomas, tačiau labai ribotas.

Kokią verslo logiką galima įgyvendinti naudojant išmaniąją sutartį? Tiesą sakant, nėra daug, pavyzdžiui, tikrinant sąlygas naudojant duomenis iš blokų grandinės, keičiant skaitmeninio turto savininkus, atsižvelgiant į šias sąlygas, įrašant duomenis į nuolatinę saugyklą blokų grandinėje. Logika įgyvendinama specialia aukšto lygio kalba Solidity.

Klasikinis funkcionalumo, kuris įgyvendinamas naudojant išmaniąsias sutartis, pavyzdys yra ICO žetonų išdavimas. Pavyzdžiui, įgyvendinau išmaniąją sutartį, kad išleistu kuklų 500 000 000 AlexToken. Autorius nuoroda Etherscan yra

išmaniosios sutarties šaltinio kodas Solidity kalba

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

ir dvejetainis vaizdas, kaip mato tinklas

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Daugiau informacijos apie išmaniąsias sutartis rasite straipsnyje: Kas yra išmaniosios sutartys Ethereum.

išvada

Išvardijome technologijas, kuriomis remiantis kuriamos šiuolaikinės blokų grandinės ir kaip jos jungiamos viena su kita. Dabar suformuluokime, kurias problemas galima išspręsti naudojant „blockchain“, o kurie sprendimai geriausiu atveju bus neveiksmingi. Taigi, blokų grandinės naudojimas nėra būtinas, jei:

  • Sandoriai vykdomi patikimoje aplinkoje;
  • Tarpininkų komisijos buvimas nepablogina dalyvių gyvenimo;
  • Dalyviai neturi nuosavybės, kurią būtų galima pavaizduoti kaip skaitmeninį turtą;
  • Nėra platinimo skaitmeniniame turte, t.y. vertė priklauso arba tiekiama tik vienam dalyviui.

Kokia „blockchain“ ateitis? Dabar galime tik spėlioti apie galimus blokų grandinės technologijų plėtros būdus:

  • „Blockchain“ taps tokia pat įprasta duomenų bazių technologija, kaip, pavyzdžiui, SQL ar NoSQL, sprendžiant savo specifines problemas;
  • Blockchain taps plačiai paplitusiu protokolu, kaip ir HTTP yra skirtas internetui;
  • Blockchain taps naujos finansinės ir politinės sistemos planetoje pagrindu!

Kitoje dalyje apžvelgsime, kokios blokų grandinės šiuo metu egzistuoja ir kodėl jos naudojamos įvairiose pramonės šakose.

Tai tik pradžia!

Šaltinis: www.habr.com

Добавить комментарий