Ievads viedos līgumos

Šajā rakstā apskatīsim, kas ir viedie līgumi, kas tie ir, iepazīsimies ar dažādām viedo līgumu platformām, to iespējām, kā arī apspriedīsim, kā tie darbojas un kādas priekšrocības tie var sniegt. Šis materiāls lieti noderēs lasītājiem, kuri viedo līgumu tēmu nepārzina, bet vēlas pietuvoties tās izpratnei.

Обычный контракт vs. смарт-контракт

Pirms iedziļināmies detaļās, ņemsim piemēru par atšķirībām starp parastu līgumu, kas ir norādīts uz papīra, un viedo līgumu, kas tiek attēlots digitāli.

Ievads viedos līgumos

Kā tas darbojās pirms viedo līgumu parādīšanās? Iedomājieties cilvēku grupu, kas vēlas noteikt noteiktus vērtību sadales noteikumus un nosacījumus, kā arī noteiktu mehānismu, lai garantētu šīs sadales īstenošanu atbilstoši dotajiem noteikumiem un nosacījumiem. Tad viņi sapulcējās, sastādīja papīru, uz kura pierakstīja savus identifikācijas datus, noteikumus, iesaistītās vērtības, datēja un parakstīja. Arī šo līgumu apstiprināja uzticama persona, piemēram, notārs. Tālāk šie cilvēki ar savu šāda līguma papīra eksemplāru devās dažādos virzienos un sāka veikt kādas darbības, kas varēja neatbilst pašam līgumam, proti, darīja vienu lietu, bet uz papīra tika apliecināts, ka kaut kas jādara. pavisam citādāks. Un kā izkļūt no šīs situācijas? Faktiski vienam no grupas dalībniekiem ir jāpaņem šis papīrs, jāpaņem daži pierādījumi, jāiesniedz tie tiesā un jāpanāk atbilstība līgumam un faktiskajām darbībām. Diezgan bieži ir grūti panākt godīgu šī līguma izpildi, kas rada nepatīkamas sekas.

Ko var teikt par viedajiem līgumiem? Tie apvieno gan līguma nosacījumu rakstīšanas iespēju, gan to stingras īstenošanas mehānismu. Ja nosacījumi ir izvirzīti un attiecīgais darījums vai pieprasījums ir parakstīts, tad, kad šis pieprasījums vai darījums ir akceptēts, nosacījumus mainīt vai ietekmēt to izpildi vairs nav iespējams.

Ir viens validators vai viss tīkls, kā arī datu bāze, kurā tiek glabāti visi izpildei iesniegtie viedie līgumi stingrā hronoloģiskā secībā. Svarīgi ir arī tas, ka šajā datubāzē ir jāiekļauj visi viedā līguma izpildes nosacījumi. Turklāt tai ir jāņem vērā pati vērtība, kuras sadalījums ir aprakstīts līgumā. Ja tas attiecas uz kādu digitālo valūtu, tad šajā datu bāzē tas ir jāņem vērā.

Citiem vārdiem sakot, viedajiem līgumu pārbaudītājiem ir jābūt piekļuvei visiem datiem, ar kuriem darbojas viedais līgums. Piemēram, ir jāizmanto viena datu bāze, lai vienlaikus uzskaitītu digitālās valūtas, lietotāju atlikumus, lietotāju darījumus un laika zīmogus. Tad viedā līgumā nosacījums var būt lietotāja atlikums noteiktā valūtā, noteikta laika pienākšana vai fakts, ka konkrēts darījums ir veikts, bet nekas vairāk.

Viedā līguma definīcija

Kopumā pašu terminoloģiju izstrādāja pētnieks Niks Szabo, un tā pirmo reizi tika izmantota 1994. gadā, un tika dokumentēta 1997. gadā rakstā, kurā aprakstīta pati viedo līgumu ideja.

Viedie līgumi nozīmē, ka tiek veikta zināma vērtības sadales automatizācija, kas var būt atkarīga tikai no iepriekš noteiktiem nosacījumiem. Vienkāršākajā formā tas izskatās pēc līguma ar stingri noteiktiem noteikumiem, ko paraksta noteiktas puses.

Viedie līgumi ir izstrādāti, lai samazinātu uzticēšanos trešajām pusēm. Dažreiz lēmumu pieņemšanas centrs, no kura viss ir atkarīgs, tiek pilnībā izslēgts. Turklāt šādus līgumus ir vieglāk pārbaudīt. Tas ir sekas dažām šādas sistēmas dizaina iezīmēm, taču visbiežāk ar viedo līgumu saprotam decentralizētu vidi un funkciju klātbūtni, kas ļauj ikvienam analizēt datu bāzi un veikt pilnu līgumu izpildes auditu. Tas nodrošina aizsardzību pret datu izmaiņām ar atpakaļejošu spēku, kas radītu izmaiņas paša līguma izpildē. Vairuma procesu digitalizācija, veidojot un uzsākot viedo līgumu, bieži vien vienkāršo to ieviešanas tehnoloģiju un izmaksas.

Vienkāršs piemērs - Darījuma pakalpojums

Apskatīsim ļoti vienkāršu piemēru. Tas palīdzēs jums tuvāk izprast viedo līgumu funkcionalitāti, kā arī labāk saprast, kādos gadījumos tie būtu jāizmanto.

Ievads viedos līgumos

To var ieviest arī izmantojot Bitcoin, lai gan šobrīd Bitcoin vēl diez vai var saukt par pilnvērtīgu viedo līgumu platformu. Tātad, mums ir daži pircēji un mums ir tiešsaistes veikals. Klients vēlas iegādāties monitoru šajā veikalā. Vienkāršākajā gadījumā pircējs aizpilda un nosūta maksājumu, un interneta veikals to pieņem, apstiprina un pēc tam nosūta preces. Taču šajā situācijā ir nepieciešama liela uzticēšanās – pircējam ir jāuzticas interneta veikalam par visu monitora izmaksu. Tā kā interneta veikalam pircēja acīs var būt zema reputācija, pastāv risks, ka kāda iemesla dēļ pēc maksājuma pieņemšanas veikals atteiksies no apkalpošanas un nenosūtīs preces pircējam. Tāpēc pircējs uzdod jautājumu (un attiecīgi arī interneta veikals uzdod šo jautājumu), ko šajā gadījumā var pielietot, lai šādus riskus samazinātu līdz minimumam un šādus darījumus padarītu uzticamākus.

Bitcoin gadījumā ir iespējams ļaut pircējam un pārdevējam neatkarīgi izvēlēties starpnieku. Ir daudz cilvēku, kas ir iesaistīti strīdīgu jautājumu risināšanā. Un mūsu dalībnieki no vispārējā starpnieku saraksta var izvēlēties to, kuram uzticēsies. Kopā viņi izveido 2 no 3 vairāku parakstu adresi, kurā ir trīs atslēgas, un ir nepieciešami divi paraksti ar jebkurām divām atslēgām, lai tērētu šīs adreses monētas. Viena atslēga piederēs pircējam, otrā – interneta veikalam, bet trešā – starpniekam. Un uz šādu vairāku parakstu adresi pircējs nosūtīs summu, kas nepieciešama, lai samaksātu par monitoru. Tagad, kad pārdevējs redz, ka no viņa atkarīgajā vairāku parakstu adresē kādu laiku ir bloķēta nauda, ​​viņš var droši nosūtīt monitoru pa pastu.

Tālāk pircējs saņem paku, apskata preces un pieņem lēmumu par galīgo pirkumu. Viņš var pilnībā piekrist sniegtajam pakalpojumam un parakstīt darījumu ar savu atslēgu, kurā pārskaita monētas no vairāku parakstu adreses pārdevējam, vai arī viņš var būt ar kaut ko neapmierināts. Otrajā gadījumā viņš sazinās ar starpnieku, lai izveidotu alternatīvu darījumu, kas šīs monētas sadalīs atšķirīgi.

Pieņemsim, ka monitors atnāca nedaudz saskrāpēts un komplektācijā nebija iekļauts vads savienošanai ar datoru, lai gan interneta veikala mājaslapā bija teikts, ka kabelim jābūt komplektā. Pēc tam pircējs savāc pierādījumus, kas nepieciešami, lai pierādītu starpniekam, ka viņš šajā situācijā ir maldināts: viņš uzņem vietnes ekrānuzņēmumus, nofotografē pasta kvīti, nofotografē monitora skrāpējumus un parāda, ka zīmogs ir bijis saplīsa un kabelis tika izvilkts. Savukārt interneta veikals savāc savus pierādījumus un nodod tos mediatoram.

Mediators ir ieinteresēts vienlaikus apmierināt gan pircēja sašutumu, gan interneta veikala intereses (kādēļ, kļūs skaidrs vēlāk). Tas ir darījums, kurā monētas no adreses ar vairākiem parakstiem tiks iztērētas noteiktā proporcijā starp pircēju, interneta veikalu un starpnieku, jo viņš daļu ņem sev kā atlīdzību par savu darbu. Pieņemsim, ka 90% no kopējās summas nonāk pārdevējam, 5% - starpniekam un 5% kompensācija pircējam. Mediators paraksta šo darījumu ar savu atslēgu, taču to vēl nevar pielietot, jo tam nepieciešami divi paraksti, bet tikai viens ir tā vērts. Tā nosūta šādu darījumu gan pircējam, gan pārdevējam. Ja vismaz viens no viņiem ir apmierināts ar šo monētu pārdalīšanas iespēju, darījums tiks iepriekš parakstīts un izplatīts tīklā. Lai to apstiprinātu, pietiek ar to, ka viena no darījuma pusēm piekrīt mediatora izvēlei.

Ir svarīgi sākotnēji izvēlēties starpnieku, lai abi dalībnieki viņam uzticētos. Šajā gadījumā viņš rīkosies neatkarīgi no viena vai otra interesēm un objektīvi novērtēs situāciju. Ja starpnieks nenodrošina tādu monētu izplatīšanas iespēju, kas apmierinās vismaz vienu dalībnieku, tad, kopīgi vienojoties, gan pircējs, gan interneta veikals var nosūtīt monētas uz jaunu vairāku parakstu adresi, liekot savus divus parakstus. Jaunā vairāku parakstu adrese tiks apkopota ar citu starpnieku, kurš var būt kompetentāks šajā jautājumā un nodrošināt labāku iespēju.

Piemērs ar kopmītni un ledusskapi

Apskatīsim sarežģītāku piemēru, kas skaidrāk parāda viedā līguma iespējas.

Ievads viedos līgumos

Pieņemsim, ka ir trīs puiši, kuri nesen ievācās tajā pašā kopmītnes istabā. Viņi trīs ir ieinteresēti iegādāties ledusskapi savai istabai, ko varētu izmantot kopā. Viens no viņiem brīvprātīgi pieteicās savākt nepieciešamo summu ledusskapja iegādei un sarunās ar pārdevēju. Taču viņi viens otru satikuši pavisam nesen, un starp viņiem nav pietiekamas uzticības. Acīmredzot divi no viņiem riskē, iedodot naudu trešajam. Turklāt viņiem ir jāpanāk vienošanās pārdevēja izvēlē.

Viņi var izmantot darījuma pakalpojumu, tas ir, izvēlēties starpnieku, kurš uzraudzīs darījuma izpildi un atrisinās strīdīgus jautājumus, ja tādi radīsies. Pēc tam, vienojoties, viņi sastāda viedo līgumu un nosaka tajā noteiktus nosacījumus.

Pirmais nosacījums – pirms noteikta laika, teiksim vienas nedēļas laikā, atbilstošajam viedlīguma kontam jāsaņem trīs maksājumi no noteiktām adresēm par noteiktu summu. Ja tas nenotiek, viedais līgums pārstāj darboties un atdod monētas visiem dalībniekiem. Ja nosacījums ir izpildīts, tiek noteiktas pārdevēja un starpnieka identifikatoru vērtības un tiek pārbaudīts nosacījums, vai visi dalībnieki piekrīt pārdevēja un starpnieka izvēlei. Kad visi nosacījumi būs izpildīti, tad līdzekļi tiks pārskaitīti uz norādītajām adresēm. Šī pieeja var aizsargāt dalībniekus no krāpšanas no jebkuras puses un kopumā novērš nepieciešamību uzticēties.

Šajā piemērā redzams pats princips, ka šī iespēja soli pa solim iestatīt parametrus katra nosacījuma izpildei ļauj izveidot jebkuras sarežģītības un ligzdotu līmeņu dziļuma sistēmas. Turklāt viedlīgumā vispirms var definēt pirmo nosacījumu un tikai pēc tā izpildes iestatīt parametrus nākamajam nosacījumam. Citiem vārdiem sakot, nosacījums ir formāli uzrakstīts, un tā parametrus var iestatīt jau tā darbības laikā.

Viedo līgumu klasifikācija

Klasifikācijai varat iestatīt dažādas kritēriju grupas. Taču tehnoloģiju attīstības brīdī aktuālas ir četras no tām.

Viedos līgumus var atšķirt pēc to izpildes vides, kas var būt centralizēta vai decentralizēta. Decentralizācijas gadījumā mums ir daudz lielāka neatkarība un kļūdu tolerance, izpildot viedos līgumus.

Tos var atšķirt arī pēc nosacījumu iestatīšanas un izpildes procesa: tie var būt brīvi programmējami, ierobežoti vai iepriekš definēti, t.i., stingri drukāti. Ja viedo līgumu platformā ir tikai 4 konkrēti viedie līgumi, to parametrus var iestatīt jebkurā veidā. Attiecīgi to iestatīšana ir daudz vienkāršāka: mēs atlasām līgumu no saraksta un nododam parametrus.

Saskaņā ar iniciēšanas metodi ir automatizēti viedie līgumi, tas ir, iestājoties noteiktiem nosacījumiem, tie paši izpildās, un ir līgumi, kuros nosacījumi ir norādīti, bet platforma automātiski nepārbauda to izpildi; jāuzsāk atsevišķi.

Turklāt viedie līgumi atšķiras pēc to privātuma līmeņa. Tie var būt pilnīgi atklāti, daļēji vai pilnīgi konfidenciāli. Pēdējais nozīmē, ka trešo pušu novērotāji neredz viedo līgumu noteikumus. Tomēr privātuma tēma ir ļoti plaša, un labāk to aplūkot atsevišķi no pašreizējā raksta.

Tālāk sīkāk aplūkosim pirmos trīs kritērijus, lai ieviestu lielāku skaidrību aktuālās tēmas izpratnē.

Viedie līgumi pēc izpildlaika

Ievads viedos līgumos

Pamatojoties uz izpildes vidi, tiek nošķirtas centralizētas un decentralizētas viedo līgumu platformas. Centralizēto digitālo līgumu gadījumā tiek izmantots vienots pakalpojums, kur ir tikai viens pārbaudītājs un var būt rezerves un atkopšanas pakalpojums, kas arī tiek pārvaldīts centralizēti. Ir viena datu bāze, kas glabā visu nepieciešamo informāciju, lai noteiktu viedā līguma nosacījumus un sadalītu vērtību, kas tiek ņemta vērā tieši šajā pakalpojumu datu bāzē. Šādam centralizētam pakalpojumam ir klients, kurš izvirza nosacījumus ar noteiktiem pieprasījumiem un izmanto šādus līgumus. Platformas centralizētā rakstura dēļ autentifikācijas mehānismi var būt mazāk droši nekā kriptovalūtās.

Kā piemēru varam ņemt mobilo sakaru pakalpojumu sniedzējus (dažādi mobilo sakaru operatori). Pieņemsim, ka konkrēts operators savos serveros veic centralizētu trafika uzskaiti, ko var pārraidīt dažādos formātos, piemēram: balss zvanu, SMS pārraides, mobilā interneta trafika veidā un atbilstoši dažādiem standartiem, kā arī veic uzskaiti. naudas līdzekļi lietotāju atlikumos. Attiecīgi mobilo sakaru operators var sastādīt līgumus par sniegto pakalpojumu uzskaiti un to apmaksu ar dažādiem nosacījumiem. Šajā gadījumā ir viegli uzstādīt nosacījumus, piemēram, “nosūti SMS ar tādu un tādu kodu uz tādu un tādu numuru un saņemsi tādus un tādus satiksmes sadales nosacījumus”.

Var minēt vēl vienu piemēru: tradicionālās bankas ar paplašinātu internetbankas funkcionalitāti un ļoti vienkāršiem līgumiem, piemēram, regulāriem maksājumiem, automātisku ienākošo maksājumu konvertēšanu, automātisku procentu ieturēšanu noteiktā kontā utt.

Ja mēs runājam par viedajiem līgumiem ar decentralizētu izpildes vidi, tad mums ir apstiprinātāju grupa. Ideālā gadījumā ikviens var kļūt par vērtētāju. Pateicoties datu bāzes sinhronizācijas protokolam un vienprātības panākšanai, mums ir kāda kopīga datu bāze, kurā tagad tiks glabāti visi darījumi ar stingri aprakstītiem līgumiem, nevis daži nosacījuma vaicājumi, kuru formāti bieži mainās un nav atvērtas specifikācijas. Šeit darījumos būs norādījumi par līguma izpildi saskaņā ar stingru specifikāciju. Šī specifikācija ir atvērta, un tāpēc platformas lietotāji paši var pārbaudīt un apstiprināt viedos līgumus. Šeit mēs redzam, ka decentralizētās platformas ir pārākas par centralizētajām neatkarības un kļūdu tolerances ziņā, taču to dizains un apkope ir daudz sarežģītāka.

Viedi līgumi pēc nosacījumu noteikšanas un izpildes metodes

Tagad apskatīsim sīkāk, kā viedie līgumi var atšķirties atkarībā no tā, kā tie nosaka un izpilda nosacījumus. Šeit mēs pievēršam uzmanību viedajiem līgumiem, kas ir nejauši programmējami un Tjūringa pabeigti. Tjūringa pabeigtais viedais līgums ļauj iestatīt gandrīz jebkurus algoritmus kā līguma izpildes nosacījumus: rakstīšanas ciklus, dažas funkcijas varbūtību aprēķināšanai un tamlīdzīgi - līdz pat jūsu elektroniskā paraksta algoritmiem. Šajā gadījumā mēs domājam patiesi patvaļīgu loģikas rakstīšanu.

Ir arī patvaļīgi viedie līgumi, bet ne Tjūringa pabeigtie līgumi. Tas ietver Bitcoin un Litecoin ar savu skriptu. Tas nozīmē, ka jūs varat izmantot tikai noteiktas darbības jebkurā secībā, bet jūs vairs nevarat rakstīt cilpas un savus algoritmus.

Turklāt ir viedo līgumu platformas, kas ievieš iepriekš definētus viedos līgumus. Tajos ietilpst Bitshares un Steemit. Bitshares piedāvā virkni viedo līgumu tirdzniecībai, konta pārvaldībai, pašas platformas un tās parametru pārvaldībai. Steemit ir līdzīga platforma, taču tā vairs nav vērsta uz tokenu izdošanu un tirdzniecību, piemēram, Bitshares, bet gan uz emuāru veidošanu, t.i., tā uzglabā un apstrādā saturu decentralizēti.

Patvaļīgi noslēgtie Tjūringa līgumi ietver Ethereum platformu un RootStock, kas joprojām ir izstrādes stadijā. Tāpēc tālāk mēs nedaudz sīkāk aplūkosim viedo līgumu platformu Ethereum.

Viedie līgumi pēc iniciēšanas metodes

Pamatojoties uz iniciēšanas metodi, viedos līgumus var iedalīt arī vismaz divās grupās: automatizētajos un manuālajos (nav automatizētos). Automatizētajiem ir raksturīgs tas, ka, ņemot vērā visus zināmos parametrus un nosacījumus, viedais līgums tiek pilnībā izpildīts automātiski, tas ir, nav nepieciešams sūtīt papildu darījumus un tērēt papildu komisijas maksu par katru nākamo izpildi. Pašai platformai ir visi dati, lai aprēķinātu, kā tiks pabeigts viedais līgums. Loģika tur nav patvaļīga, bet gan iepriekš noteikta, un tas viss ir paredzams. Tas ir, jūs varat iepriekš novērtēt viedā līguma izpildes sarežģītību, izmantot par to kaut kādu pastāvīgu komisiju, un visi tā īstenošanas procesi ir efektīvāki.

Viedajiem līgumiem, kas ir brīvi programmēti, izpilde nav automatizēta. Lai uzsāktu šādu viedo līgumu, praktiski katrā solī ir jāizveido jauns darījums, kas izsauks nākamo izpildes posmu vai nākamo viedā līguma metodi, samaksās atbilstošu komisiju un gaidīs darījuma apstiprināšanu. Izpilde var beigties veiksmīgi vai nē, jo viedā līguma kods ir patvaļīgs un var parādīties daži neparedzami momenti, piemēram, mūžīgā cilpa, dažu parametru un argumentu trūkums, neapstrādāti izņēmumi utt.

Ethereum konti

Ethereum kontu veidi

Apskatīsim, kāda veida konti var būt Ethereum platformā. Šeit ir tikai divu veidu konti, un nav citu iespēju. Pirmais veids tiek saukts par lietotāja kontu, otrais ir līguma konts. Noskaidrosim, kā tie atšķiras.

Lietotāja kontu kontrolē tikai elektroniskā paraksta personiskā atslēga. Konta īpašnieks ģenerē savu atslēgu pāri elektroniskajam parakstam, izmantojot ECDSA (eliptiskās līknes digitālā paraksta algoritmu) algoritmu. Tikai ar šo atslēgu parakstīti darījumi var mainīt šī konta stāvokli.

Viedā līguma kontam tiek nodrošināta atsevišķa loģika. To var kontrolēt tikai ar iepriekš definētu programmatūras kodu, kas pilnībā nosaka viedā līguma darbību: kā tas konkrētos apstākļos pārvaldīs savas monētas, pēc kura lietotāja iniciatīvas un ar kādiem papildu nosacījumiem šīs monētas tiks izplatītas. Ja izstrādātāji programmas kodā dažus punktus nav paredzējuši, var rasties problēmas. Piemēram, viedais līgums var saņemt noteiktu stāvokli, kurā tas nepieņem turpmākas izpildes ierosināšanu no neviena lietotāja. Šajā gadījumā monētas faktiski tiks iesaldētas, jo viedais līgums neparedz iziešanu no šī stāvokļa.

Kā Ethereum tiek izveidoti konti

Lietotāja konta gadījumā īpašnieks neatkarīgi ģenerē atslēgu pāri, izmantojot ECDSA. Svarīgi atzīmēt, ka Ethereum elektroniskajiem parakstiem izmanto tieši tādu pašu algoritmu un tieši tādu pašu eliptisku līkni kā Bitcoin, taču adrese tiek aprēķināta nedaudz savādāk. Šeit dubultās jaukšanas rezultāts vairs netiek izmantots, kā Bitcoin, bet vienreizēja jaukšana tiek nodrošināta ar Keccak funkciju 256 bitu garumā. No iegūtās vērtības tiek nogriezti vismazāk nozīmīgie biti, proti, vismazāk nozīmīgie 160 biti no izejas jaucējvērtības. Rezultātā mēs iegūstam adresi Ethereum. Faktiski tas aizņem 20 baitus.

Lūdzu, ņemiet vērā, ka Ethereum konta identifikators ir kodēts hex formātā, nepiemērojot kontrolsummu, atšķirībā no Bitcoin un daudzām citām sistēmām, kur adrese tiek kodēta bāzes 58 skaitļu sistēmā, pievienojot kontrolsummu. Tas nozīmē, ka, strādājot ar konta identifikatoriem Ethereum, jums jābūt uzmanīgiem: pat viena kļūda identifikatorā garantēs monētu zudumu.

Ir svarīga iezīme, un tā ir tāda, ka lietotāja konts vispārējā datu bāzes līmenī tiek izveidots brīdī, kad viņš pieņem pirmo ienākošo maksājumu.

Viedā līguma konta izveidei tiek izmantota pavisam cita pieeja. Sākotnēji viens no lietotājiem raksta viedā līguma avota kodu, pēc tam kods tiek nodots caur Ethereum platformai speciālu kompilatoru, iegūstot baitkodu savai Ethereum virtuālajai mašīnai. Iegūtais baitkods tiek ievietots īpašā darījuma laukā. Tas ir sertificēts iniciatora konta vārdā. Pēc tam šis darījums tiek izplatīts visā tīklā un ievieto viedā līguma kodu. Komisija par darījumu un attiecīgi par līguma izpildi tiek izņemta no iniciatora konta atlikuma.

Katrā viedajā līgumā obligāti ir savs (šī līguma) konstruktors. Tas var būt tukšs vai saturs. Pēc konstruktora izpildes tiek izveidots viedā līguma konta identifikators, ar kuru var nosūtīt monētas, izsaukt noteiktas viedā līguma metodes utt.

Ethereum darījumu struktūra

Lai padarītu to skaidrāku, mēs sāksim aplūkot Ethereum darījuma struktūru un viedā līguma koda piemēru.

Ievads viedos līgumos

Ethereum darījums sastāv no vairākiem laukiem. Pirmais no tiem, nonce, ir noteikts darījuma sērijas numurs attiecībā pret pašu kontu, kas to izplata un ir tā autors. Tas nepieciešams, lai atšķirtu dubultos darījumus, tas ir, lai izslēgtu gadījumu, kad viens un tas pats darījums tiek akceptēts divas reizes. Izmantojot identifikatoru, katram darījumam ir unikāla jaucējvērtība.

Tālāk nāk lauks, piemēram gāzes cena. Tas norāda cenu, par kādu Ethereum bāzes valūta tiek konvertēta gāzē, kas tiek izmantota, lai samaksātu par viedā līguma izpildi un virtuālās mašīnas resursa piešķiršanu. Ko tas nozīmē?

Bitcoin maksas tiek maksātas tieši ar bāzes valūtu — pašu Bitcoin. Tas ir iespējams, pateicoties vienkāršam to aprēķināšanas mehānismam: mēs maksājam stingri par darījumā ietverto datu apjomu. Ethereum situācija ir sarežģītāka, jo ir ļoti grūti paļauties uz darījumu datu apjomu. Šeit darījums var saturēt arī programmas kodu, kas tiks izpildīts virtuālajā mašīnā, un katrai virtuālās mašīnas darbībai var būt atšķirīga sarežģītība. Ir arī darbības, kas piešķir atmiņu mainīgajiem lielumiem. Tiem būs sava sarežģītība, no kuras būs atkarīgs maksājums par katru operāciju.

Katras darbības izmaksas gāzes ekvivalentā būs nemainīgas. Tas tiek ieviests īpaši, lai noteiktu katras darbības pastāvīgās izmaksas. Atkarībā no tīkla slodzes mainīsies gāzes cena, tas ir, koeficients, pēc kura bāzes valūta tiks konvertēta šajā palīgvienībā komisijas apmaksai.

Ir vēl viena darījuma iezīme Ethereum: baitu kods, ko tas satur izpildei virtuālajā mašīnā, tiks izpildīts, līdz tas tiks pabeigts ar kādu rezultātu (veiksmi vai neveiksmi) vai līdz izbeidzas noteikts monētu daudzums, kas piešķirts, lai samaksātu komisijas maksu. . Lai izvairītos no situācijas, kad kādas kļūdas gadījumā visas monētas no sūtītāja konta tika iztērētas komisijā (piemēram, virtuālajā mašīnā sācies kaut kāds mūžīgais cikls), eksistē šāds lauks - iedarbināt gāzi (bieži saukts par gāzes limitu) - tas nosaka maksimālo monētu daudzumu, ko sūtītājs ir gatavs tērēt, lai pabeigtu noteiktu darījumu.

Nākamais lauks tiek izsaukts adresāta adrese. Tas ietver monētu saņēmēja adresi vai konkrēta viedā līguma adresi, kura metodes tiks izsauktas. Pēc tam nāk lauks vērtība, kur tiek ievadīts uz galamērķa adresi nosūtīto monētu daudzums.

Nākamais ir interesants lauks ar nosaukumu dati, kur iederas visa struktūra. Tas nav atsevišķs lauks, bet gan vesela struktūra, kurā ir definēts virtuālās mašīnas kods. Šeit varat ievietot patvaļīgus datus - tam ir atsevišķi noteikumi.

Un pēdējais lauks tiek saukts paraksts. Tajā vienlaikus ir gan šī darījuma autora elektroniskais paraksts, gan publiskā atslēga, ar kuru šis paraksts tiks pārbaudīts. No publiskās atslēgas var iegūt šī darījuma sūtītāja konta identifikatoru, tas ir, unikāli identificēt sūtītāja kontu pašā sistēmā. Uzzinājām galveno par darījuma struktūru.

Solidity viedā līguma koda piemērs

Tagad apskatīsim vienkāršāko viedo līgumu tuvāk, izmantojot piemēru.

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

Augšpusē ir vienkāršots pirmkods, kas var glabāt lietotāju monētas un atdot tās pēc pieprasījuma.

Tātad, ir Bankas viedais līgums, kas veic šādas funkcijas: savā bilancē uzkrāj monētas, tas ir, kad darījums ir apstiprināts un šāds viedlīgums tiek ievietots, tiek izveidots jauns konts, kura bilancē var būt monētas; tas atceras lietotājus un monētu sadalījumu starp tiem; ir vairākas metodes atlikumu pārvaldīšanai, tas ir, ir iespējams papildināt, izņemt un pārbaudīt lietotāja atlikumu.

Izskatīsim katru avota koda rindiņu. Šim līgumam ir nemainīgi lauki. Viens no tiem ar tipa adresi tiek saukts par īpašnieku. Šeit līgums atceras tā lietotāja adresi, kurš izveidoja šo viedo līgumu. Turklāt ir dinamiska struktūra, kas uztur atbilstību starp lietotāju adresēm un atlikumiem.

Tam seko Bankas metode – tai ir tāds pats nosaukums kā līgumam. Attiecīgi šis ir tā konstruktors. Šeit īpašnieka mainīgajam tiek piešķirta tās personas adrese, kura ievietoja šo viedo līgumu tīklā. Tas ir vienīgais, kas notiek šajā konstruktorā. Tas nozīmē, ka īsziņa šajā gadījumā ir tieši tie dati, kas tika pārsūtīti uz virtuālo mašīnu kopā ar darījumu, kas satur visu šī līguma kodu. Attiecīgi msg.sender ir šī darījuma autors, kas mitina šo kodu. Viņš būs viedā līguma īpašnieks.

Depozīta metode ļauj ar darījumu pārskaitīt noteiktu skaitu monētu uz līguma kontu. Šajā gadījumā viedais līgums, saņemot šīs monētas, atstāj tās savā bilancē, bet atlikumu struktūrā ieraksta, kurš tieši bijis šo monētu sūtītājs, lai zinātu, kam tās pieder.

Nākamo metodi sauc par izņemšanu un tas aizņem vienu parametru - monētu daudzumu, ko kāds vēlas izņemt no šīs bankas. Tas pārbauda, ​​vai lietotājam, kurš izsauc šo metodi, ir pietiekami daudz monētu, lai tās nosūtītu. Ja to ir pietiekami daudz, tad pats viedais līgums šo monētu skaitu atdod zvanītājam.

Tālāk seko metode lietotāja pašreizējā bilances pārbaudei. Ikviens, kurš izsauc šo metodi, tiks izmantots šī bilances izgūšanai viedajā līgumā. Ir vērts atzīmēt, ka šīs metodes modifikators ir skats. Tas nozīmē, ka pati metode nekādā veidā nemaina savas klases mainīgos un faktiski ir tikai lasīšanas metode. Šīs metodes izsaukšanai netiek izveidots atsevišķs darījums, netiek maksāta maksa, un visi aprēķini tiek veikti lokāli, pēc tam lietotājs saņem rezultātu.

Nogalināšanas metode ir nepieciešama, lai iznīcinātu viedā līguma stāvokli. Un šeit ir papildu pārbaude, vai šīs metodes izsaucējs ir šī līguma īpašnieks. Ja tā, tad līgums pašiznīcinās, un iznīcināšanas funkcija ņem vienu parametru - konta identifikatoru, uz kuru līgums nosūtīs visas savā bilancē atlikušās monētas. Šajā gadījumā atlikušās monētas automātiski nonāks līguma īpašnieka adresē.

Kā Ethereum tīklā darbojas pilns mezgls?

Apskatīsim shematiski, kā Ethereum platformā tiek izpildīti šādi viedie līgumi un kā darbojas pilna tīkla mezgls.

Ievads viedos līgumos

Pilnam Ethereum tīkla mezglam jābūt vismaz četriem moduļiem.
Pirmais, tāpat kā jebkuram decentralizētajam protokolam, ir P2P tīkla modulis - modulis tīkla savienojumam un darbam ar citiem mezgliem, kur notiek bloku, transakciju un informācijas apmaiņa par citiem mezgliem. Tas ir tradicionāls komponents visām decentralizētajām kriptovalūtām.

Tālāk mums ir modulis blokķēdes datu glabāšanai, apstrādei, prioritārās filiāles izvēlei, bloku pievienošanai, bloku atsaistīšanai, šo bloku apstiprināšanai utt.

Trešo moduli sauc par EVM (Ethereum virtuālā mašīna) - šī ir virtuālā mašīna, kas saņem baitkodu no Ethereum darījumiem. Šis modulis ņem konkrēta konta pašreizējo stāvokli un veic izmaiņas tā stāvoklī, pamatojoties uz saņemto baitu kodu. Virtuālās mašīnas versijai katrā tīkla mezglā ir jābūt vienādai. Aprēķini, kas notiek katrā Ethereum mezglā, ir tieši tādi paši, taču tie notiek asinhroni: kāds pārbauda un pieņem šo darījumu agrāk, tas ir, izpilda visu tajā ietverto kodu, bet kāds vēlāk. Attiecīgi, kad tiek izveidots darījums, tas tiek izplatīts tīklā, mezgli to pieņem, un verifikācijas brīdī, tāpat kā Bitcoin Script tiek izpildīts Bitcoin, šeit tiek izpildīts virtuālās mašīnas baitkods.

Darījums tiek uzskatīts par pārbaudītu, ja ir izpildīts viss tajā esošais kods, ir ģenerēts un saglabāts jauns noteikta konta stāvoklis, līdz ir skaidrs, vai šis darījums ir piemērots vai nē. Ja darījums tiek piemērots, tad šis stāvoklis tiek uzskatīts ne tikai par pabeigtu, bet arī par pašreizējo. Ir datu bāze, kurā tiek saglabāts katra konta stāvoklis katram tīkla mezglam. Sakarā ar to, ka visi aprēķini notiek vienādi un blokķēdes stāvoklis ir vienāds, arī datu bāze, kurā ir visu kontu stāvokļi, katram mezglam būs vienāda.

Viedo līgumu mīti un ierobežojumi

Attiecībā uz ierobežojumiem, kas pastāv viedajām līgumu platformām, kas ir līdzīgas Ethereum, var minēt sekojošo:

  • koda izpilde;
  • piešķirt atmiņu;
  • blokķēdes dati;
  • sūtīt maksājumus;
  • izveidot jaunu līgumu;
  • zvaniet citiem līgumiem.

Apskatīsim ierobežojumus, kas tiek uzlikti virtuālajai mašīnai, un attiecīgi kliedēsim dažus mītus par viedajiem līgumiem. Virtuālajā mašīnā, kas var būt ne tikai Ethereum, bet arī līdzīgās platformās, jūs varat veikt patiesi patvaļīgas loģiskas darbības, tas ir, rakstīt kodu un tas tiks izpildīts tur, jūs varat papildus piešķirt atmiņu. Tomēr maksa tiek maksāta atsevišķi par katru operāciju un par katru papildu piešķirto atmiņas vienību.

Tālāk virtuālā mašīna var nolasīt datus no blokķēdes datu bāzes, lai šos datus izmantotu kā trigeri vienas vai otras viedā līguma loģikas izpildei. Virtuālā mašīna var izveidot un nosūtīt transakcijas, tā var izveidot jaunus līgumus un izsaukt citu viedo līgumu metodes, kas jau ir publicētas tīklā: esošu, pieejamu utt.

Visizplatītākais mīts ir tāds, ka Ethereum viedie līgumi savos noteikumos var izmantot informāciju no jebkura interneta resursa. Patiesība ir tāda, ka virtuālā mašīna nevar nosūtīt tīkla pieprasījumu kādam ārējam informācijas resursam internetā, tas ir, nav iespējams uzrakstīt viedo līgumu, kas sadalīs vērtību starp lietotājiem atkarībā no, teiksim, kādi laikapstākļi ir ārā, vai kurš uzvarēja kādu čempionātu, vai pamatojoties uz to, kāds cits incidents noticis ārpasaulē, jo informācijas par šiem incidentiem vienkārši nav pašas platformas datu bāzē. Tas nozīmē, ka blokķēdē par to nekas nav minēts. Ja tas tur neparādās, virtuālā mašīna nevar izmantot šos datus kā aktivizētājus.

Ethereum trūkumi

Uzskaitīsim galvenos. Pirmais trūkums ir tas, ka Ethereum viedo līgumu izstrādē, izstrādē un testēšanā ir dažas grūtības (viedo līgumu rakstīšanai Ethereum izmanto valodu Solidity). Patiešām, prakse rāda, ka ļoti liela daļa no visām kļūdām pieder cilvēka faktoram. Tas faktiski attiecas uz jau rakstītiem Ethereum viedajiem līgumiem, kuriem ir vidēja vai augstāka sarežģītība. Ja vienkāršiem viedajiem līgumiem kļūdas iespējamība ir maza, tad sarežģītos viedos līgumos ļoti bieži ir kļūdas, kas noved pie naudas līdzekļu nozagšanas, to iesaldēšanas, viedo līgumu iznīcināšanas neparedzētā veidā utt. Daudzi šādi gadījumi jau ir zināms.

Otrs trūkums ir tāds, ka pati virtuālā mašīna nav ideāla, jo to raksta arī cilvēki. Tas var izpildīt patvaļīgas komandas, un tajā slēpjas ievainojamība: vairākas komandas var konfigurēt noteiktā veidā, kas novedīs pie iepriekš neparedzētām sekām. Šī ir ļoti sarežģīta joma, taču jau ir vairāki pētījumi, kas liecina, ka šīs ievainojamības pastāv pašreizējā Ethereum tīkla versijā un tās var izraisīt daudzu viedo līgumu neveiksmi.

Vēl viena liela grūtība, to var uzskatīt par trūkumu. Tas slēpjas faktā, ka praktiski vai tehniski var nonākt pie secinājuma, ka, sastādot baitu kodu līgumam, kas tiks izpildīts virtuālajā mašīnā, var noteikt kādu konkrētu darbību secību. Veicot šīs darbības kopā, tās ievērojami noslogos virtuālo mašīnu un palēninās to nesamērīgi salīdzinājumā ar maksu, kas tika samaksāta par šo darbību veikšanu.

Agrāk jau bija Ethereum izstrādes periods, kad daudzi puiši, kuri sīki saprata virtuālās mašīnas darbību, atrada šādas ievainojamības. Faktiski darījumi maksāja ļoti mazu maksu, bet praktiski bremzēja visu tīklu. Šīs problēmas ir ļoti grūti atrisināt, jo, pirmkārt, tās ir jānosaka, otrkārt, jāpielāgo šo darbību veikšanas cena un, treškārt, jāveic hard fork, kas nozīmē visu tīkla mezglu atjaunināšanu uz jaunu versiju. programmatūras un pēc tam vienlaicīga šo izmaiņu aktivizēšana.

Kas attiecas uz Ethereum, ir veikts daudz pētījumu, iegūta liela praktiskā pieredze: gan pozitīva, gan negatīva, bet tomēr joprojām ir grūtības un ievainojamības, ar kurām vēl kaut kā jātiek galā.

Tātad, raksta tematiskā daļa ir pabeigta, pāriesim pie jautājumiem, kas rodas diezgan bieži.

Biežāk uzdotie jautājumi

— Ja visas esošā viedā līguma puses vēlas mainīt noteikumus, vai tās var atcelt šo viedo līgumu, izmantojot multisig, un pēc tam izveidot jaunu viedo līgumu ar atjauninātiem tā izpildes noteikumiem?

Atbilde šeit būs divējāda. Kāpēc? Jo, no vienas puses, viedais līgums tiek definēts vienreiz un tas vairs neparedz nekādas izmaiņas, no otras puses, tam var būt iepriekš uzrakstīta loģika, kas paredz dažu nosacījumu pilnīgu vai daļēju maiņu. Tas ir, ja vēlaties kaut ko mainīt savā viedajā līgumā, tad jums ir jāparedz nosacījumi, saskaņā ar kuriem jūs varat atjaunināt šos nosacījumus. Attiecīgi tikai šādā apdomīgā veidā var organizēt līguma pārjaunošanu. Taču arī šeit var rasties nepatikšanas: pieļaut kādu kļūdu un iegūt atbilstošu ievainojamību. Tāpēc šādām lietām jābūt ļoti detalizētām un rūpīgi izstrādātām un pārbaudītām.

— Ko darīt, ja starpnieks noslēdz vienošanos ar kādu no iesaistītajām pusēm: darījuma vai viedo līgumu? Vai viedā līgumā ir nepieciešams starpnieks?

Viedā līgumā starpnieks nav nepieciešams. Tā var nebūt. Ja darījuma gadījumā starpnieks iesaistās sazvērestībā ar kādu no pusēm, tad jā, šī shēma tad krasi zaudē visu savu vērtību. Tāpēc mediatori tiek izvēlēti tā, lai viņiem vienlaikus uzticētos visas šajā procesā iesaistītās puses. Attiecīgi jūs vienkārši nepārsūtīsit monētas uz vairāku parakstu adresi ar starpnieku, kuram neuzticaties.

— Vai ar vienu Ethereum darījumu ir iespējams pārsūtīt daudz dažādu žetonu no jūsu adreses uz dažādām mērķa adresēm, piemēram, maiņas adresēm, kur šie marķieri tiek tirgoti?

Šis ir labs jautājums, un tas attiecas uz Ethereum darījumu modeli un to, kā tas atšķiras no Bitcoin modeļa. Un atšķirība ir radikāla. Ja Ethereum darījumu modelī jūs vienkārši pārskaitāt monētas, tad tās tiek pārsūtītas tikai no vienas adreses uz citu, bez izmaiņām, tikai jūsu norādītā konkrētā summa. Citiem vārdiem sakot, šis nav neizlietoto izlaides (UTXO) modelis, bet gan kontu un atbilstošo atlikumu modelis. Teorētiski ir iespējams vienā darījumā uzreiz nosūtīt vairākus dažādus žetonus, ja uzrakstīsi viltīgu viedo līgumu, bet tik un tā būs jāveic daudzi darījumi, jāizveido līgums, pēc tam pārskaita uz to žetonus un monētas un tad jāizsauc atbilstošā metode. . Tas prasa pūles un laiku, tāpēc praksē tas tā nedarbojas, un visi maksājumi Ethereum tiek veikti atsevišķos darījumos.

— Viens no mītiem par Ethereum platformu ir tāds, ka nav iespējams aprakstīt apstākļus, kas būs atkarīgi no ārēja interneta resursa datiem, ko tad darīt?

Risinājums ir tāds, ka pats viedais līgums var nodrošināt vienu vai vairākus tā sauktos uzticamos orākulus, kas savāc datus par lietu stāvokli ārpasaulē un ar īpašām metodēm nosūta tos viedajiem līgumiem. Pats līgums uzskata, ka dati, kas saņemti no uzticamām personām, ir patiesi. Lai nodrošinātu lielāku uzticamību, vienkārši izvēlieties lielu orākulu grupu un samaziniet to slepenās vienošanās risku. Pašā līgumā nedrīkst ņemt vērā orākulu datus, kas ir pretrunā vairākumam.

Viena no tiešsaistes kursa Blockchain lekcijām ir veltīta šai tēmai - “Ievads viedos līgumos".

Avots: www.habr.com

Pievieno komentāru