Įvadas į išmaniąsias sutartis

Šiame straipsnyje apžvelgsime, kas yra išmaniosios sutartys, kas tai yra, susipažinsime su skirtingomis išmaniųjų sutarčių platformomis, jų ypatybėmis, taip pat aptarsime, kaip jos veikia ir kokius privalumus gali duoti. Ši medžiaga bus labai naudinga skaitytojams, kurie nėra gerai susipažinę su išmaniųjų sutarčių tema, bet nori priartėti prie jos supratimo.

Įprasta sutartis vs. protinga sutartis

Prieš gilindamiesi į detales, paimkime pavyzdį, kaip skiriasi įprasta sutartis, kuri nurodoma popieriuje, ir išmanioji sutartis, kuri pateikiama skaitmeniniu būdu.

Įvadas į išmaniąsias sutartis

Kaip tai veikė prieš išmaniųjų sutarčių atsiradimą? Įsivaizduokite grupę žmonių, kurie nori nustatyti tam tikras vertybių paskirstymo taisykles ir sąlygas, taip pat tam tikrą mechanizmą, garantuojantį šio paskirstymo įgyvendinimą pagal pateiktas taisykles ir sąlygas. Tada jie susirinkdavo, surašydavo popierių, ant kurio surašydavo savo tapatybės duomenis, sąlygas, susijusias vertybes, nurodydavo datas ir pasirašydavo. Šią sutartį taip pat patvirtino patikima šalis, pavyzdžiui, notaras. Be to, šie žmonės su savo popierine tokios sutarties kopija nuėjo įvairiomis kryptimis ir pradėjo atlikti kai kuriuos veiksmus, kurie galėjo neatitikti pačios sutarties, tai yra, jie padarė vieną dalyką, bet popieriuje buvo patvirtinta, kad jie turi ką nors padaryti. visiškai kitoks. Ir kaip išsisukti iš šios situacijos? Tiesą sakant, vienas iš grupės narių turi paimti šį dokumentą, paimti tam tikrus įrodymus, pateikti juos teismui ir pasiekti, kad sutartis ir faktiniai veiksmai atitiktų. Gana dažnai sunku pasiekti sąžiningą šios sutarties vykdymą, o tai sukelia nemalonių pasekmių.

Ką galima pasakyti apie išmaniąsias sutartis? Juose derinama ir galimybė surašyti sutarties sąlygas, ir griežto jų įgyvendinimo mechanizmas. Jeigu sąlygos buvo nustatytos ir atitinkamas sandoris ar prašymas pasirašytas, tai tą prašymą ar sandorį priėmus, nebegalima keisti sąlygų ar daryti įtakos jų įgyvendinimui.

Yra vienas tikrintuvas arba visas tinklas, taip pat duomenų bazė, kurioje saugomos visos išmaniosios sutartys, kurios buvo pateiktos vykdyti griežta chronologine tvarka. Taip pat svarbu, kad šioje duomenų bazėje būtų visos išmaniosios sutarties vykdymo pradžios sąlygos. Be to, ji turi atsižvelgti į pačią vertę, kurios paskirstymas aprašytas sutartyje. Jei tai taikoma tam tikrai skaitmeninei valiutai, ši duomenų bazė turėtų į tai atsižvelgti.

Kitaip tariant, išmaniųjų sutarčių tikrintojai turi turėti prieigą prie visų duomenų, kuriais veikia išmanioji sutartis. Pavyzdžiui, viena duomenų bazė turėtų būti naudojama vienu metu skaitmeninėms valiutoms, vartotojų likučiams, vartotojų operacijoms ir laiko žymoms apskaityti. Tada išmaniojoje sutartyje sąlyga gali būti vartotojo likutis tam tikra valiuta, tam tikro laiko atėjimas arba faktas, kad tam tikra operacija buvo atlikta, bet nieko daugiau.

Išmaniosios sutarties apibrėžimas

Apskritai pačią terminiją sukūrė mokslininkas Nickas Szabo ir pirmą kartą ji buvo panaudota 1994 m., o 1997 m. buvo dokumentuota straipsnyje, kuriame aprašoma pati protingų sutarčių idėja.

Išmaniosios sutartys reiškia, kad atliekamas tam tikras vertės paskirstymo automatizavimas, kuris gali priklausyti tik nuo tų sąlygų, kurios yra iš anksto nustatytos. Paprasčiausia forma tai atrodo kaip sutartis su griežtai apibrėžtomis sąlygomis, kurią pasirašo tam tikros šalys.

Išmaniosios sutartys yra sukurtos siekiant sumažinti pasitikėjimą trečiosiomis šalimis. Kartais sprendimų priėmimo centras, nuo kurio viskas priklauso, yra visiškai pašalintas. Be to, tokias sutartis lengviau patikrinti. Tai yra kai kurių tokios sistemos projektavimo ypatybių pasekmė, tačiau dažniausiai išmaniąja sutartimi suprantame decentralizuotą aplinką ir funkcijų, kurios leidžia bet kam analizuoti duomenų bazę ir atlikti pilną sutarčių vykdymo auditą, buvimą. Taip užtikrinama apsauga nuo atgaline data pakeitimų, dėl kurių pasikeistų pačios sutarties vykdymas. Daugumos procesų skaitmeninimas kuriant ir paleidžiant išmaniąją sutartį dažnai supaprastina jų įgyvendinimo technologijas ir išlaidas.

Paprastas pavyzdys – Escrow paslauga

Pažiūrėkime į labai paprastą pavyzdį. Tai padės jums geriau suprasti išmaniųjų sutarčių funkcionalumą ir geriau suprasti, kokiais atvejais jomis reikėtų naudotis.

Įvadas į išmaniąsias sutartis

Ją taip pat galima įdiegti naudojant Bitcoin, nors šiuo metu Bitcoin dar vargu ar galima vadinti visaverte išmaniųjų sutarčių platforma. Taigi, turime pirkėją ir internetinę parduotuvę. Klientas nori nusipirkti monitorių iš šios parduotuvės. Paprasčiausiu atveju pirkėjas užpildo ir išsiunčia apmokėjimą, o internetinė parduotuvė jį priima, patvirtina, o tada išsiunčia prekes. Tačiau šioje situacijoje reikia didelio pasitikėjimo – pirkėjas turi pasitikėti internetine parduotuve už visą monitoriaus kainą. Kadangi internetinė parduotuvė pirkėjo akyse gali turėti menką reputaciją, kyla rizika, kad dėl kokių nors priežasčių, priėmusi apmokėjimą, parduotuvė atsisakys aptarnavimo ir prekių pirkėjui neišsiųs. Todėl pirkėjas užduoda klausimą (ir atitinkamai internetinė parduotuvė užduoda šį klausimą), ką šiuo atveju galima pritaikyti, kad tokia rizika būtų kuo mažesnė ir tokie sandoriai būtų patikimesni.

Bitcoin atveju galima leisti pirkėjui ir pardavėjui savarankiškai pasirinkti tarpininką. Yra daug žmonių, kurie dalyvauja sprendžiant ginčytinus klausimus. O mūsų dalyviai iš bendro tarpininkų sąrašo gali pasirinkti tą, kuriuo pasitikės. Kartu jie sukuria 2 iš 3 kelių parašų adresą, kuriame yra trys raktai, o norint išleisti monetas iš to adreso, reikia dviejų parašų su bet kuriais dviem raktais. Vienas raktas priklausys pirkėjui, antras – internetinei parduotuvei, trečias – tarpininkui. O tokiu kelių parašų adresu pirkėjas atsiųs sumą, reikalingą apmokėti už monitorių. Dabar, kai pardavėjas pamato, kad nuo jo priklausančiu kelių parašų adresu kuriam laikui užblokuoti pinigai, jis gali drąsiai atsiųsti monitorių paštu.

Toliau pirkėjas gauna siuntinį, apžiūri prekes ir priima sprendimą dėl galutinio pirkimo. Jis gali visiškai sutikti su teikiama paslauga ir savo raktu pasirašyti sandorį, kur pardavėjui perveda monetas iš kelių parašų adreso arba gali būti kažkuo nepatenkintas. Antruoju atveju jis susisiekia su tarpininku, kad sudarytų alternatyvų sandorį, pagal kurį tos monetos būtų paskirstytos kitaip.

Tarkime, monitorius atkeliavo šiek tiek subraižytas, o komplekte nebuvo kabelio prijungimui prie kompiuterio, nors internetinės parduotuvės svetainėje buvo rašoma, kad laidas turi būti komplekte. Tada pirkėjas surenka įrodymus, reikalingus tarpininkui įrodyti, kad šioje situacijoje jis buvo apgautas: padaro svetainės ekrano kopijas, nufotografuoja pašto kvitą, nufotografuoja monitoriaus įbrėžimus ir parodo, kad antspaudas buvo apgautas. nutrūko ir laidas buvo ištrauktas. Internetinė parduotuvė savo ruožtu surenka savo įrodymus ir perduoda juos tarpininkui.

Tarpininkas yra suinteresuotas vienu metu tenkinti ir pirkėjo pasipiktinimą, ir internetinės parduotuvės interesus (kodėl paaiškės vėliau). Tai yra sandoris, kurio metu monetos iš kelių parašų adreso bus išleistos tam tikra proporcija tarp pirkėjo, internetinės parduotuvės ir tarpininko, nes jis ima dalį sau kaip atlygį už savo darbą. Tarkime, 90% visos sumos atitenka pardavėjui, 5% – tarpininkui ir 5% kompensacija – pirkėjui. Tarpininkas pasirašo šią operaciją savo raktu, bet jo dar negalima pritaikyti, nes tam reikia dviejų parašų, bet vertas tik vienas. Ji siunčia tokį sandorį ir pirkėjui, ir pardavėjui. Jei bent vieną iš jų tenkina ši monetų perskirstymo parinktis, tada sandoris bus iš anksto pasirašytas ir paskirstytas tinklui. Jai patvirtinti pakanka, kad viena iš sandorio šalių sutiktų su tarpininko pasirinkimu.

Svarbu iš pradžių pasirinkti tarpininką, kad abu dalyviai juo pasitikėtų. Tokiu atveju jis veiks nepriklausomai nuo vienų ar kitų interesų ir objektyviai įvertins situaciją. Jei tarpininkas nesuteikia galimybės platinti monetas, kurios tenkintų bent vieną dalyvį, tuomet, kartu sutarę, tiek pirkėjas, tiek internetinė parduotuvė gali išsiųsti monetas nauju kelių parašų adresu, padėdami savo du parašus. Naujasis kelių parašų adresas bus sudarytas su kitu tarpininku, kuris gali būti kompetentingesnis šiuo klausimu ir pasiūlyti geresnę galimybę.

Pavyzdys su bendrabučiu ir šaldytuvu

Pažvelkime į sudėtingesnį pavyzdį, kuris aiškiau parodo išmaniosios sutarties galimybes.

Įvadas į išmaniąsias sutartis

Tarkime, yra trys vaikinai, kurie neseniai persikėlė į tą patį bendrabučio kambarį. Jie trys nori nusipirkti šaldytuvą savo kambariui, kurį galėtų naudoti kartu. Vienas jų pasisiūlė surinkti reikiamą sumą šaldytuvui įsigyti ir derėtis su pardavėju. Tačiau jiedu susitiko tik neseniai ir tarp jų nėra pakankamai pasitikėjimo. Akivaizdu, kad du iš jų rizikuoja duodami pinigus trečiajam. Be to, jie turi susitarti renkantis pardavėją.

Jie gali naudotis deponavimo paslauga, tai yra pasirinkti tarpininką, kuris stebės sandorio vykdymą ir išspręs ginčytinus klausimus, jei tokių iškiltų. Tada, susitarę, surašo išmaniąją sutartį ir joje nustato tam tikras sąlygas.

Pirma sąlyga – prieš tam tikrą laiką, tarkime, per savaitę, atitinkama išmaniosios sutarties sąskaita turi gauti tris mokėjimus iš tam tikrų adresų už tam tikrą sumą. Jei taip neatsitiks, išmanioji sutartis nustoja vykdyti ir grąžina monetas visiems dalyviams. Jei sąlyga įvykdoma, tada nustatomos pardavėjo ir tarpininko identifikatorių reikšmės ir tikrinama, ar visi dalyviai sutinka su pardavėjo ir tarpininko pasirinkimu. Kai bus įvykdytos visos sąlygos, lėšos bus pervedamos nurodytais adresais. Šis metodas gali apsaugoti dalyvius nuo sukčiavimo iš bet kurios pusės ir apskritai pašalina poreikį pasitikėti.

Šiame pavyzdyje matome patį principą, kad ši galimybė žingsnis po žingsnio nustatyti kiekvienos sąlygos įvykdymo parametrus leidžia sukurti bet kokio sudėtingumo ir įdėtų lygių gylio sistemas. Be to, išmaniojoje sutartyje pirmiausia galite apibrėžti pirmąją sąlygą ir tik ją įvykdžius galite nustatyti kitos sąlygos parametrus. Kitaip tariant, sąlyga yra formaliai parašyta, o jos parametrus galima nustatyti jau jos veikimo metu.

Išmaniųjų sutarčių klasifikacija

Klasifikavimui galite nustatyti skirtingas kriterijų grupes. Tačiau technologijų plėtros momentu keturi iš jų yra aktualūs.

Išmaniąsias sutartis galima atskirti pagal jų vykdymo aplinką, kuri gali būti centralizuota arba decentralizuota. Decentralizacijos atveju turime daug didesnį nepriklausomumą ir toleranciją gedimams vykdydami išmaniąsias sutartis.

Taip pat juos galima atskirti pagal sąlygų nustatymo ir vykdymo procesą: jie gali būti laisvai programuojami, riboti arba iš anksto apibrėžti, t.y. griežtai įvesti. Kai išmaniųjų sutarčių platformoje yra tik 4 konkrečios išmaniosios sutartys, jų parametrus galima nustatyti bet kokiu būdu. Atitinkamai juos nustatyti yra daug paprasčiau: iš sąrašo pasirenkame sutartį ir perduodame parametrus.

Pagal inicijavimo metodą yra automatizuotos išmaniosios sutartys, tai yra, susidarius tam tikroms sąlygoms, jos vykdomos savaime, ir yra sutarčių, kuriose sąlygos nurodytos, tačiau platforma automatiškai netikrina jų įvykdymo; tam jie reikia pradėti atskirai.

Be to, išmaniosios sutartys skiriasi savo privatumo lygiu. Jie gali būti visiškai atviri, iš dalies arba visiškai konfidencialūs. Pastaroji reiškia, kad trečiųjų šalių stebėtojai nemato išmaniųjų sutarčių sąlygų. Tačiau privatumo tema yra labai plati, todėl geriau ją nagrinėti atskirai nuo dabartinio straipsnio.

Toliau atidžiau pažvelgsime į pirmuosius tris kriterijus, kad suprastume dabartinę temą.

Išmaniosios sutartys pagal vykdymo laiką

Įvadas į išmaniąsias sutartis

Remiantis vykdymo aplinka, skiriamos centralizuotos ir decentralizuotos išmaniųjų sutarčių platformos. Centralizuotų skaitmeninių sutarčių atveju naudojama viena paslauga, kai yra tik vienas tikrintuvas ir gali būti atsarginių kopijų kūrimo ir atkūrimo paslauga, kuri taip pat valdoma centralizuotai. Yra viena duomenų bazė, kurioje saugoma visa reikalinga informacija išmaniosios sutarties sąlygoms nustatyti ir paskirstyti vertę, į kurią atsižvelgiama būtent šioje paslaugų duomenų bazėje. Tokia centralizuota paslauga turi klientą, kuris su tam tikrais prašymais nustato sąlygas ir naudojasi tokiomis sutartimis. Dėl centralizuoto platformos pobūdžio autentifikavimo mechanizmai gali būti mažiau saugūs nei kriptovaliutų atveju.

Kaip pavyzdį galime paimti mobiliojo ryšio tiekėjus (skirtingus mobiliojo ryšio operatorius). Tarkime, tam tikras operatorius savo serveriuose centralizuotai registruoja srautą, kuris gali būti perduodamas įvairiais formatais, pavyzdžiui: balso skambučių, SMS perdavimo, mobiliojo interneto srauto ir pagal skirtingus standartus, taip pat registruoja įrašus. lėšų vartotojų likučiuose. Atitinkamai mobiliojo ryšio paslaugų teikėjas gali sudaryti suteiktų paslaugų apskaitos ir jų apmokėjimo sutartis skirtingomis sąlygomis. Tokiu atveju nesunku nustatyti tokias sąlygas kaip „nusiųskite SMS su tokiu ir tokiu kodu tokiu ir tokiu numeriu ir gausite tokias ir tokias srauto paskirstymo sąlygas“.

Galima pateikti dar vieną pavyzdį: tradiciniai bankai su išplėstu internetinės bankininkystės funkcionalumu ir labai paprastomis sutartimis, tokiomis kaip reguliarūs mokėjimai, automatinis gaunamų mokėjimų konvertavimas, automatinis palūkanų nuskaitymas į nurodytą sąskaitą ir kt.

Jei kalbame apie išmaniąsias sutartis su decentralizuota vykdymo aplinka, tai turime grupę tikrintojų. Idealiu atveju tikrintoju gali tapti bet kas. Dėl duomenų bazės sinchronizavimo protokolo ir konsensuso pasiekimo turime bendrą duomenų bazę, kurioje dabar bus saugomos visos operacijos su griežtai aprašytomis sutartimis, o ne kai kurios sąlyginės užklausos, kurių formatai dažnai keičiasi, o atviros specifikacijos nėra. Čia operacijose bus nurodymai vykdyti sutartį pagal griežtą specifikaciją. Ši specifikacija yra atvira, todėl patys platformos vartotojai gali patikrinti ir patvirtinti išmaniąsias sutartis. Čia matome, kad decentralizuotos platformos yra pranašesnės už centralizuotas nepriklausomumu ir atsparumu gedimams, tačiau jų dizainas ir priežiūra yra daug sudėtingesni.

Išmaniosios sutartys sąlygų nustatymo ir vykdymo būdu

Dabar atidžiau pažvelkime į tai, kaip išmaniosios sutartys gali skirtis tuo, kaip jos nustato ir atitinka sąlygas. Čia atkreipiame dėmesį į išmaniąsias sutartis, kurios yra atsitiktinai programuojamos ir baigtos Turing. Turingo išmanioji sutartis leidžia nustatyti beveik bet kokius algoritmus kaip sutarties vykdymo sąlygas: rašymo ciklus, kai kurias tikimybių skaičiavimo funkcijas ir panašiai – iki pat savo elektroninio parašo algoritmų. Šiuo atveju turime omenyje tikrai savavališką logikos rašymą.

Taip pat yra savavališkų išmaniųjų sutarčių, bet ne „Turing“ pilnų. Tai apima Bitcoin ir Litecoin su savo scenarijumi. Tai reiškia, kad galite naudoti tik tam tikras operacijas bet kokia tvarka, bet nebegalite rašyti kilpų ir savo algoritmų.

Be to, yra išmaniųjų sutarčių platformų, kurios įgyvendina iš anksto nustatytas išmaniąsias sutartis. Tai apima „Bitshares“ ir „Steemit“. „Bitshares“ turi daugybę išmaniųjų sutarčių, skirtų prekybai, sąskaitų valdymui, pačios platformos ir jos parametrų valdymui. „Steemit“ yra panaši platforma, tačiau ji nebėra orientuota į žetonų išleidimą ir prekybą, kaip „Bitshares“, o į tinklaraščių rašymą, t. y. ji saugo ir apdoroja turinį decentralizuotai.

Savavališkos Turingo užbaigtos sutartys apima „Ethereum“ platformą ir „RootStock“, kuri vis dar kuriama. Todėl toliau šiek tiek plačiau pakalbėsime apie Ethereum išmaniųjų sutarčių platformą.

Išmaniosios sutartys inicijavimo būdu

Pagal inicijavimo būdą išmaniąsias sutartis taip pat galima suskirstyti į bent dvi grupes: automatizuotas ir rankines (neautomatizuotas). Automatizuotieji pasižymi tuo, kad, esant visiems žinomiems parametrams ir sąlygoms, išmanioji sutartis yra visiškai vykdoma automatiškai, tai yra, nereikia siųsti jokių papildomų operacijų ir išleisti papildomą komisinį mokestį už kiekvieną paskesnį vykdymą. Pačioje platformoje yra visi duomenys, leidžiantys apskaičiuoti, kaip bus užbaigta išmanioji sutartis. Logika ten nėra savavališka, o iš anksto nustatyta ir visa tai nuspėjama. Tai yra, galite iš anksto įvertinti išmaniosios sutarties vykdymo sudėtingumą, naudoti tam tikrą nuolatinį komisinį mokestį, o visi jos įgyvendinimo procesai yra efektyvesni.

Išmaniųjų sutarčių, kurios yra laisvai programuojamos, vykdymas nėra automatizuotas. Norint inicijuoti tokią išmaniąją sutartį, praktiškai kiekviename žingsnyje reikia sukurti naują operaciją, kuri iškvies kitą vykdymo etapą arba kitą išmaniosios sutarties metodą, sumokės atitinkamą komisinį atlyginimą ir lauks, kol sandoris bus patvirtintas. Vykdymas gali baigtis sėkmingai arba ne, nes išmaniosios sutarties kodas yra savavališkas ir gali atsirasti nenuspėjamų momentų, tokių kaip amžina kilpa, kai kurių parametrų ir argumentų trūkumas, netvarkomos išimtys ir pan.

Ethereum sąskaitos

Ethereum paskyros tipai

Pažiūrėkime, kokių tipų paskyros gali būti Ethereum platformoje. Čia yra tik dviejų tipų paskyros ir nėra kitų galimybių. Pirmasis tipas vadinamas vartotojo abonementu, antrasis yra sutarties paskyra. Išsiaiškinkime, kuo jie skiriasi.

Vartotojo paskyra valdoma tik asmeniniu elektroninio parašo raktu. Sąskaitos savininkas sukuria savo elektroninio parašo raktų porą naudodamas ECDSA (elipsinės kreivės skaitmeninio parašo algoritmo) algoritmą. Tik šiuo raktu pasirašytos operacijos gali pakeisti šios paskyros būseną.

Išmaniosios sutarties paskyrai numatyta atskira logika. Jį galima valdyti tik iš anksto nustatytu programiniu kodu, kuris visiškai nulemia išmaniosios sutarties elgesį: kaip ji tam tikromis aplinkybėmis tvarkys savo monetas, kurio vartotojo iniciatyva ir kokiomis papildomomis sąlygomis šios monetos bus platinamos. Jei kai kurių punktų kūrėjai nenumatė programos kode, gali kilti problemų. Pavyzdžiui, išmanioji sutartis gali gauti tam tikrą būseną, kurioje ji nepriima tolesnio vykdymo inicijavimo iš bet kurio vartotojo. Tokiu atveju monetos iš tikrųjų bus užšaldytos, nes išmanioji sutartis nenumato išėjimo iš šios būsenos.

Kaip sukuriamos paskyros Ethereum

Vartotojo abonemento atveju savininkas savarankiškai sukuria raktų porą naudodamas ECDSA. Svarbu pažymėti, kad Ethereum elektroniniams parašams naudoja lygiai tą patį algoritmą ir lygiai tokią pat elipsinę kreivę kaip ir Bitcoin, tačiau adresas apskaičiuojamas kiek kitaip. Čia dvigubos maišos rezultatas nebenaudojamas, kaip Bitcoin, tačiau vienkartinė maiša suteikiama su Keccak funkcija, kurios ilgis yra 256 bitai. Mažiausiai reikšmingi bitai yra iškirpti iš gautos reikšmės, ty mažiausiai reikšmingi 160 išvesties maišos vertės bitų. Dėl to mes gauname adresą Ethereum. Tiesą sakant, tai užima 20 baitų.

Atkreipkite dėmesį, kad sąskaitos identifikatorius Ethereum yra užkoduotas šešioliktaine forma netaikant kontrolinės sumos, kitaip nei Bitcoin ir daugelyje kitų sistemų, kur adresas užkoduotas bazinėje 58 skaičių sistemoje, pridedant kontrolinę sumą. Tai reiškia, kad Ethereum dirbdami su paskyros identifikatoriais turite būti atsargūs: net viena klaida identifikatoriuje garantuoja monetų praradimą.

Yra svarbi ypatybė ir tai, kad vartotojo abonementas bendrosios duomenų bazės lygiu sukuriamas tuo metu, kai jis priima pirmąjį įeinantį mokėjimą.

Kuriant išmaniosios sutarties paskyrą taikomas visiškai kitoks požiūris. Iš pradžių vienas iš vartotojų parašo išmaniosios sutarties šaltinio kodą, po kurio kodas perduodamas per specialų Ethereum platformai skirtą kompiliatorių, gaunant baitinį kodą savo Ethereum virtualiai mašinai. Gautas baito kodas įdedamas į specialų operacijos lauką. Jis patvirtinamas iniciatoriaus paskyros vardu. Tada ši operacija perduodama visame tinkle ir įdedamas išmaniosios sutarties kodas. Komisinis mokestis už sandorį ir atitinkamai už sutarties vykdymą nurašomas iš iniciatoriaus sąskaitos likučio.

Kiekviena išmanioji sutartis būtinai turi savo (šios sutarties) konstruktorių. Jis gali būti tuščias arba turėti turinį. Įvykdžius konstruktorių, sukuriamas išmaniosios sutarties paskyros identifikatorius, kuriuo naudojantis galima siųsti monetas, iškviesti tam tikrus išmaniosios sutarties būdus ir pan.

Ethereum sandorio struktūra

Kad būtų aiškiau, pradėsime nagrinėti Ethereum operacijos struktūrą ir pavyzdį išmaniosios sutarties kodą.

Įvadas į išmaniąsias sutartis

Ethereum sandorį sudaro keli laukai. Pirmasis iš jų, nonce, yra tam tikras operacijos eilės numeris, susijęs su pačia sąskaita, kuri ją platina ir yra jos autorė. Tai būtina norint atskirti dvigubus sandorius, tai yra, kad būtų išvengta atvejo, kai ta pati operacija priimama du kartus. Naudojant identifikatorių, kiekviena operacija turi unikalią maišos reikšmę.

Toliau ateina toks laukas kaip dujų kaina. Tai nurodo kainą, už kurią Ethereum bazinė valiuta konvertuojama į dujas, kuriomis atsiskaitoma už išmaniosios sutarties vykdymą ir virtualios mašinos resurso paskirstymą. Ką tai reiškia?

„Bitcoin“ mokesčiai mokami tiesiogiai iš bazinės valiutos – paties „Bitcoin“. Tai įmanoma dėl paprasto jų apskaičiavimo mechanizmo: mokame griežtai už operacijoje esančių duomenų kiekį. „Ethereum“ situacija yra sudėtingesnė, nes labai sunku pasikliauti operacijų duomenų kiekiu. Čia taip pat sandoryje gali būti programos kodas, kuris bus vykdomas virtualioje mašinoje, o kiekviena virtualiosios mašinos operacija gali būti skirtingo sudėtingumo. Taip pat yra operacijų, kurios paskirsto atmintį kintamiesiems. Jie turės savo sudėtingumą, nuo kurio priklausys apmokėjimas už kiekvieną operaciją.

Kiekvienos operacijos kaina dujų ekvivalentu bus pastovi. Jis įvedamas specialiai tam, kad būtų galima nustatyti pastovias kiekvienos operacijos išlaidas. Priklausomai nuo tinklo apkrovos, keisis dujų kaina, tai yra koeficientas, pagal kurį bazinė valiuta bus konvertuojama į šį pagalbinį vienetą komisiniams mokėti.

Yra dar viena operacijos „Ethereum“ ypatybė: jame esantis baitų kodas, skirtas vykdyti virtualioje mašinoje, bus vykdomas tol, kol bus baigtas koks nors rezultatas (sėkmė ar nesėkmė) arba kol baigsis tam tikras monetų, skirtų komisiniams sumokėti. . Siekiant išvengti situacijos, kai įvykus kokiai nors klaidai visos monetos iš siuntėjo sąskaitos buvo išleistos komisiniams (pavyzdžiui, virtualioje mašinoje prasidėjo kažkoks amžinas ciklas), yra toks laukas: paleisti dujas (dažnai vadinamas dujų limitu) – jis nustato didžiausią monetų sumą, kurią siuntėjas nori išleisti tam, kad užbaigtų tam tikrą operaciją.

Kitas laukas vadinamas paskirties adresas. Tai apima monetų gavėjo adresą arba konkrečios išmaniosios sutarties, kurios metodai bus iškviesti, adresą. Po jo ateina laukas kainas, kur įvedamas monetų, kurios siunčiamos paskirties adresu, kiekis.

Toliau yra įdomi sritis, vadinama duomenys, kur telpa visa konstrukcija. Tai ne atskiras laukas, o visa struktūra, kurioje apibrėžiamas virtualios mašinos kodas. Čia galite patalpinti savavališkus duomenis – tam yra atskiros taisyklės.

Ir paskutinis laukas vadinamas parašas. Jame vienu metu yra ir šios operacijos autoriaus elektroninis parašas, ir viešasis raktas, kuriuo šis parašas bus tikrinamas. Iš viešojo rakto galite gauti šios operacijos siuntėjo paskyros identifikatorių, ty unikaliai identifikuoti siuntėjo paskyrą pačioje sistemoje. Išsiaiškinome pagrindinį dalyką apie sandorio struktūrą.

Solidity išmaniosios sutarties kodo pavyzdys

Dabar atidžiau pažvelkime į paprasčiausią išmaniąją sutartį naudodami pavyzdį.

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

Aukščiau pateiktas supaprastintas šaltinio kodas, kuriame galima laikyti vartotojų monetas ir grąžinti jas pareikalavus.

Taigi, yra Banko išmanioji sutartis, kuri atlieka šias funkcijas: kaupia monetas savo likute, tai yra, kai operacija patvirtinama ir tokia išmanioji sutartis yra sukuriama nauja sąskaita, kurios likute gali būti monetų; ji prisimena vartotojus ir monetų paskirstymą tarp jų; turi kelis likučių valdymo būdus, tai yra, galima papildyti, išimti ir patikrinti vartotojo likutį.

Peržiūrėkime kiekvieną šaltinio kodo eilutę. Ši sutartis turi pastovius laukus. Vienas iš jų, su tipo adresu, vadinamas savininku. Čia sutartis prisimena vartotojo, sukūrusio šią išmaniąją sutartį, adresą. Be to, yra dinamiška struktūra, kuri palaiko korespondenciją tarp vartotojų adresų ir likučių.

Po to seka banko metodas – jis turi tą patį pavadinimą kaip ir sutartis. Atitinkamai, tai yra jo konstruktorius. Čia savininko kintamajam priskiriamas asmens, įtraukusio šią išmaniąją sutartį į tinklą, adresas. Tai vienintelis dalykas, kuris vyksta šiame konstruktoriuje. Tai yra, msg šiuo atveju yra būtent tie duomenys, kurie buvo perkelti į virtualią mašiną kartu su operacija, kurioje yra visas šios sutarties kodas. Atitinkamai, msg.sender yra šios operacijos, kurioje yra šis kodas, autorius. Jis bus išmaniosios sutarties savininkas.

Indėlio metodas leidžia per operaciją pervesti tam tikrą skaičių monetų į sutarties sąskaitą. Tokiu atveju išmanioji sutartis, gavusi šias monetas, jas palieka savo balanse, tačiau likučių struktūroje įrašo, kas tiksliai buvo šių monetų siuntėjas, kad sužinotų, kam jos priklauso.

Kitas būdas vadinamas išėmimu ir tam reikia vieno parametro – monetų kiekio, kurį kažkas nori atsiimti iš šio banko. Taip patikrinama, ar vartotojo, kuris iškviečia šį metodą, likutyje yra pakankamai monetų jas išsiųsti. Jei jų yra pakankamai, tada pati išmanioji sutartis grąžina skambinančiajam tokį skaičių monetų.

Toliau pateikiamas vartotojo esamo balanso patikrinimo metodas. Kas paskambins šiuo metodu, bus naudojamas šiam likučiui išmaniojoje sutartyje atkurti. Verta paminėti, kad šio metodo modifikatorius yra vaizdas. Tai reiškia, kad pats metodas jokiu būdu nekeičia savo klasės kintamųjų ir iš tikrųjų yra tik skaitymo metodas. Šiam metodui iškviesti atskira operacija nesukuriama, nemokamas mokestis, o visi skaičiavimai atliekami lokaliai, po kurių vartotojas gauna rezultatą.

Nužudymo metodas reikalingas norint sunaikinti išmaniosios sutarties būseną. Ir čia yra papildomas patikrinimas, ar skambinantysis šiuo būdu yra šios sutarties savininkas. Jei taip, tada sutartis savaime sunaikinama, o naikinimo funkcija paima vieną parametrą – sąskaitos identifikatorių, į kurį sutartis atsiųs visas jos likute likusias monetas. Tokiu atveju likusios monetos automatiškai nukeliaus sutarties savininko adresu.

Kaip veikia visas mazgas Ethereum tinkle?

Pažiūrėkime schematiškai, kaip Ethereum platformoje vykdomos tokios išmaniosios sutartys ir kaip veikia viso tinklo mazgas.

Įvadas į išmaniąsias sutartis

Visas Ethereum tinklo mazgas turi turėti bent keturis modulius.
Pirmasis, kaip ir bet kuris decentralizuotas protokolas, yra P2P tinklo modulis – tinklo ryšio ir darbo su kitais mazgais modulis, kuriame keičiamasi blokais, transakcijomis ir informacija apie kitus mazgus. Tai tradicinis komponentas visoms decentralizuotoms kriptovaliutoms.

Toliau turime modulį blokų grandinės duomenų saugojimui, apdorojimui, prioritetinės šakos pasirinkimui, blokų pridėjimui, blokų atsiejimui, šių blokų patvirtinimui ir kt.

Trečiasis modulis vadinamas EVM (Ethereum virtual machine) – tai virtuali mašina, kuri gauna baitinį kodą iš Ethereum operacijų. Šis modulis paima esamą konkrečios paskyros būseną ir keičia jos būseną, remdamasis gautu baito kodu. Virtualios mašinos versija kiekviename tinklo mazge turi būti vienoda. Skaičiavimai, atliekami kiekviename Ethereum mazge, yra visiškai vienodi, tačiau jie vyksta asinchroniškai: kažkas patikrina ir priima šią operaciją anksčiau, tai yra, vykdo visą joje esantį kodą, o kažkas vėliau. Atitinkamai, kai sukuriama transakcija, ji paskirstoma tinklui, mazgai ją priima, o tikrinimo metu taip pat, kaip Bitcoin Script vykdomas Bitcoin, čia vykdomas virtualios mašinos baito kodas.

Operacija laikoma patikrinta, jei buvo įvykdytas visas joje esantis kodas, sugeneruota nauja tam tikros paskyros būsena ir išsaugoma tol, kol bus aišku, ar ši operacija buvo pritaikyta, ar ne. Jei taikomas sandoris, ši būsena laikoma ne tik baigta, bet ir dabartine. Yra duomenų bazė, kurioje saugoma kiekvieno tinklo mazgo kiekvienos paskyros būsena. Dėl to, kad visi skaičiavimai atliekami vienodai ir blokų grandinės būsena yra ta pati, duomenų bazė, kurioje yra visų paskyrų būsenos, taip pat bus vienoda kiekvienam mazgui.

Išmaniųjų sutarčių mitai ir apribojimai

Kalbant apie apribojimus, taikomus išmaniosioms sutarčių platformoms, panašioms į Ethereum, galima paminėti šiuos dalykus:

  • kodo vykdymas;
  • paskirstyti atmintį;
  • „blockchain“ duomenys;
  • siųsti mokėjimus;
  • sudaryti naują sutartį;
  • skambinti kitoms sutartims.

Pažvelkime į apribojimus, kurie taikomi virtualiai mašinai, ir atitinkamai išsklaidykime kai kuriuos mitus apie išmaniąsias sutartis. Virtualioje mašinoje, kuri gali būti ne tik Ethereum, bet ir panašiose platformose, galima atlikti tikrai savavališkas logines operacijas, tai yra parašyti kodą ir jis ten bus vykdomas, galima papildomai skirti atminties. Tačiau mokestis mokamas atskirai už kiekvieną operaciją ir už kiekvieną papildomą skiriamą atminties vienetą.

Toliau virtuali mašina gali nuskaityti duomenis iš blokų grandinės duomenų bazės, kad šiuos duomenis panaudotų kaip trigerį vykdyti vieną ar kitą išmaniosios sutarties logiką. Virtuali mašina gali kurti ir siųsti operacijas, gali kurti naujas sutartis ir iškviesti kitų tinkle jau paskelbtų išmaniųjų sutarčių būdus: esamas, prieinamas ir pan.

Labiausiai paplitęs mitas yra tai, kad Ethereum išmaniosios sutartys savo sąlygomis gali naudoti informaciją iš bet kurio interneto šaltinio. Tiesa ta, kad virtuali mašina negali nusiųsti tinklo užklausos į kažkokį išorinį informacijos šaltinį internete, tai yra, neįmanoma parašyti išmaniosios sutarties, kuri paskirstytų vertę tarp vartotojų, priklausomai, tarkime, koks oras lauke. ar kas laimėjo kokį nors čempionatą, ar pagal tai, koks dar incidentas įvyko išoriniame pasaulyje, nes informacijos apie šiuos incidentus tiesiog nėra pačios platformos duomenų bazėje. Tai yra, blokų grandinėje apie tai nieko nėra. Jei jis nerodomas, virtualioji mašina negali naudoti šių duomenų kaip aktyviklių.

Ethereum trūkumai

Išvardinkime pagrindinius. Pirmasis trūkumas yra tas, kad yra tam tikrų sunkumų kuriant, kuriant ir išbandant išmaniąsias sutartis „Ethereum“ („Ethereum“ išmaniosioms sutartims rašyti naudoja „Solidity“ kalbą). Iš tiesų, praktika rodo, kad labai didelis procentas visų klaidų priklauso žmogiškajam faktoriui. Tai iš tikrųjų galioja jau parašytoms „Ethereum“ išmaniosioms sutartims, kurios yra vidutinio ar didesnio sudėtingumo. Jei paprastose išmaniosiose sutartyse klaidos tikimybė yra maža, tai sudėtingose ​​išmaniosiose sutartyse labai dažnai pasitaiko klaidų, dėl kurių pavagiamos lėšos, jos įšaldomos, netikėtai sunaikinamos išmaniosios sutartys ir pan. Daug tokių atvejų jau yra žinomas.

Antras trūkumas – pati virtuali mašina nėra tobula, nes ją taip pat rašo žmonės. Jis gali vykdyti savavališkas komandas, ir čia slypi pažeidžiamumas: tam tikru būdu galima sukonfigūruoti daugybę komandų, kurios sukels pasekmes, kurios buvo iš anksto nenumatytos. Tai labai sudėtinga sritis, tačiau jau yra keletas tyrimų, rodančių, kad šios pažeidžiamybės egzistuoja dabartinėje Ethereum tinklo versijoje ir dėl jų gali sugesti daugelis išmaniųjų sutarčių.

Kitas didelis sunkumas, jį galima laikyti trūkumu. Tai slypi tame, kad praktiškai ar techniškai galite prieiti prie išvados, kad sudarius sutarties, kuri bus vykdoma virtualioje mašinoje, baito kodą, galite nustatyti tam tikrą konkrečią operacijų tvarką. Atliekant šias operacijas kartu, virtualioji mašina labai apkraus ir ją sulėtins neproporcingai nei mokestis, kuris buvo sumokėtas už šių operacijų atlikimą.

Anksčiau jau buvo Ethereum kūrimo laikotarpis, kai daugelis vaikinų, kurie išsamiai suprato virtualios mašinos veikimą, rado tokius pažeidžiamumus. Tiesą sakant, operacijos sumokėjo labai nedidelį mokestį, tačiau praktiškai pristabdė visą tinklą. Šias problemas labai sunku išspręsti, nes pirmiausia reikia jas nustatyti, antra, pakoreguoti šių operacijų atlikimo kainą ir, trečia, atlikti kietąją šakę, o tai reiškia visų tinklo mazgų atnaujinimą į naują versiją. programinės įrangos, o tada tuo pačiu metu suaktyvinkite šiuos pakeitimus.

Kalbant apie Ethereum, atlikta daug tyrimų, sukaupta daug praktinės patirties: tiek teigiamos, tiek neigiamos, tačiau vis dėlto išlieka sunkumų ir pažeidžiamumų, kuriuos vis tiek reikia kažkaip išspręsti.

Taigi, teminė straipsnio dalis baigta, pereikime prie gana dažnai kylančių klausimų.

DUK

— Jei visos esamos išmaniosios sutarties šalys nori pakeisti sąlygas, ar jos gali atšaukti šią išmaniąją sutartį naudodami multisig ir tada sukurti naują išmaniąją sutartį su atnaujintomis jos vykdymo sąlygomis?

Atsakymas čia bus dvejopas. Kodėl? Nes, viena vertus, išmanioji sutartis yra apibrėžiama vieną kartą ir joje nebelieka jokių pakeitimų, kita vertus, joje gali būti iš anksto parašyta logika, numatanti visiškai ar iš dalies pakeisti kai kurias sąlygas. Tai yra, jei norite ką nors pakeisti savo išmaniojoje sutartyje, tuomet turite nurodyti sąlygas, kuriomis galite šias sąlygas atnaujinti. Atitinkamai, tik taip apdairiai galima organizuoti sutarties pratęsimą. Tačiau ir čia galite susidurti su bėdomis: padaryti kokią nors klaidą ir gauti atitinkamą pažeidžiamumą. Todėl tokius dalykus reikia labai detaliai ir kruopščiai suprojektuoti bei išbandyti.

— Ką daryti, jei tarpininkas sudaro susitarimą su viena iš dalyvaujančių šalių: sąlyginio deponavimo ar išmaniosios sutarties? Ar išmaniojoje sutartyje reikalingas tarpininkas?

Išmaniojoje sutartyje tarpininko nereikia. Jo gali ir nebūti. Jei sąlyginio deponavimo atveju tarpininkas sudaro sąmokslą su viena iš šalių, tada taip, ši schema smarkiai praranda savo vertę. Todėl tarpininkai parenkami taip, kad jais pasitikėtų visos šiame procese dalyvaujančios šalys vienu metu. Atitinkamai, jūs tiesiog neperkelsite monetų į kelių parašų adresą su tarpininku, kuriuo nepasitikite.

— Ar įmanoma per vieną Ethereum operaciją perkelti daug skirtingų žetonų iš jūsų adreso į skirtingus tikslinius adresus, pavyzdžiui, mainų adresus, kuriuose prekiaujama šiais žetonais?

Tai geras klausimas ir susijęs su Ethereum sandorio modeliu ir kuo jis skiriasi nuo Bitcoin modelio. Ir skirtumas yra radikalus. Jei Ethereum sandorio modelyje jūs tiesiog pervedate monetas, tai jos perkeliamos tik iš vieno adreso į kitą, nekeičiama, tik jūsų nurodyta konkreti suma. Kitaip tariant, tai ne nepanaudotų išėjimų (UTXO) modelis, o sąskaitų ir atitinkamų likučių modelis. Teoriškai galima vienu sandoriu išsiųsti kelis skirtingus žetonus, jei parašysite gudrią išmaniąją sutartį, tačiau vis tiek turėsite atlikti daugybę operacijų, sudaryti sutartį, tada pervesti į ją žetonus ir monetas, o tada iškviesti atitinkamą metodą. . Tam reikia pastangų ir laiko, todėl praktiškai tai neveikia ir visi mokėjimai Ethereum atliekami atskiromis operacijomis.

— Vienas iš mitų apie Ethereum platformą yra tai, kad neįmanoma aprašyti sąlygų, kurios priklausys nuo išorinio interneto resurso duomenų, tai ką tada daryti?

Išeitis – pati išmanioji sutartis gali suteikti vieną ar kelis vadinamuosius patikimus orakulus, kurie renka duomenis apie išorinio pasaulio reikalų būklę ir specialiais metodais perduoda juos išmaniosioms sutartims. Pačioje sutartyje duomenys, gauti iš patikimų šalių, yra teisingi. Norėdami užtikrinti didesnį patikimumą, tiesiog pasirinkite didelę orakulų grupę ir sumažinkite jų slapto susitarimo riziką. Pačioje sutartyje gali būti neatsižvelgiama į orakulų duomenis, kurie prieštarauja daugumai.

Viena iš internetinio kurso „Blockchain“ paskaitų yra skirta šiai temai - „Įvadas į išmaniąsias sutartis".

Šaltinis: www.habr.com

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