Sissejuhatus tarkvaralepingutesse

Selles artiklis kĂ€sitleme, mis on nutilepingud, milliseid tĂŒĂŒpe need on, tutvume erinevate nutilepingute platvormidega ja nende eripĂ€radega, samuti arutame, kuidas need toimivad ja milliseid eeliseid nad endas sisaldavad. See materjal on vĂ€ga kasulik lugejatele, kes ei ole veel piisavalt tuttavad nutilepingute teemaga, kuid soovivad sellega tutvuda.

Tavaleping vs. nutileping

Enne kui sĂŒveneme ĂŒksikasjadesse, vaatame nĂ€ite abil erinevusi tavalepingute, mis on paberil, ja nutilepingute, mis on digitaalsetes formatides, vahel.

Sissejuhatus tarkvaralepingutesse

Kuidas see toimis enne nutilepingute tulekut? Kujutage ette rĂŒhma inimesi, kes soovivad kehtestada teatud reeglid ja tingimused vÀÀrtuste jagamiseks, samuti kindlustada nende tĂ€itmist etteantud reeglite ja tingimuste alusel teatud mehhanismi abil. Siis kogunesid nad koos, koostasid dokumendi, kuhu mĂ€rkisid oma isikuandmed, tingimused, osalised vÀÀrtused, panid kuupĂ€eva ja allkirjastasid. Selle lepingu kinnitas ka usaldusvÀÀrne pool, nĂ€iteks notar. SeejĂ€rel lahkusid need inimesed eri suundades oma paberkoopia lepingust ja hakkasid tegema teatud toiminguid, mis ei vastanud lepingule, st nad tegid ĂŒht, samas kui paberil oli kinnitatud, et nad peaksid tegema tĂ€iesti midagi muud. Kuidas sellises olukorras edasi minna? Tegelikult pidi mĂ”ni grupi liige vĂ”tma selle paberi, koguma tĂ”endeid, minema kohut ja nĂ”udma lepingu ja tegelike toimingute vahelise vastavuse saavutamist. Üsna tihti on Ă”iglane lepingu tĂ€itmine keeruline, mis toob kaasa ebameeldivaid tagajĂ€rgi.

Mida saame siis nutilepingute kohta öelda? Need ĂŒhendavad endas nii lepingu tingimuste kirjutamise vĂ”imaluse kui ka nende ranget tĂ€itmise mehhanismi. Kui tingimused on kehtestatud ja vastav tehing vĂ”i taotlus on allkirjastatud, siis pĂ€rast selle taotluse vĂ”i tehingu aktsepteerimist ei ole enam vĂ”imalik tingimusi muuta ega mĂ”jutada nende tĂ€itmist.

Üks vĂ”i mitmeid valideerijaid ja andmebaas, mis salvestab kĂ”ik nutilepingud, mis on tĂ€itmiseks esitatud, peavad olema olemas rangelt kronoloogilises jĂ€rjekorras. Samuti on oluline, et see andmebaas sisaldaks kĂ”iki tingimusi, mis on nutilepingu tĂ€itmise kĂ€ivitamiseks vajalikud. Lisaks peab see sisaldama seda vÀÀrtust, mille jaotamine on lepingus kirjas. Kui see puudutab mĂ”nda digitaalselt valuutat, siis peab see andmebaas seda arvesse vĂ”tma.

TeisisĂ”nu, nutilepingute valideerijatel peab olema juurdepÀÀs kĂ”igile andmetele, millega nutileping opereerib. NĂ€iteks peaks ĂŒks andmebaas arvestama samaaegselt digitaalseid valuutasid, kasutajate saldo, kasutajate tehingute ja ajatempleid. Siis vĂ”ib nutilepingus tingimusena olla nĂ€iteks kasutaja saldo konkreetses valuutas, mingi aja saabumine vĂ”i teatud tehingu teostamine, kuid mitte rohkem.

Nutilepingu mÀÀratlemine

Tegelikult tuli terminoloogia vÀlja uurijalt Nick Szabo ning seda rakendati esmakordselt 1994. aastal, dokumenteeriti aga 1997. aastal artiklis, mis kirjeldab nutilepingute ideed.

Nutilepingud tÀhendavad, et toimub teatud vÀÀrtuse jaotuse automatiseerimine, mis sÔltub ainult eelnevalt seatud tingimustest. KÔige lihtsamal kujul nÀeb see vÀlja nagu leping rangelt mÀÀratud tingimustega, mille on allkirjastanud konkreetsed osalised.

Nutilepingud on mĂ”eldud kolmandate osapoolte usalduse minimeerimiseks. MĂ”nikord kĂ”rvaldatakse tĂ€iesti otsustusprotsess, millest kĂ”ik sĂ”ltub. Lisaks on selliste lepingute auditimine lihtsam. See tuleneb teatavatest sĂŒsteemi disainimise eripĂ€radest, kuid kĂ”ige sagedamini tĂ”lgendame nutilepingut kui detsentraliseeritud keskkonda ning olemasolu funktsioonide, mis vĂ”imaldavad igal soovijal andmebaasi analĂŒĂŒsida ja lepingute tĂ€itmist tĂ€ielikult auditeerida. Nii garanteeritakse kaitse tagasiulatuvate andmete muutmise eest, mis tooks kaasa muudatusi ise lepingus tĂ€itmisel. Enamiku protsesside digitaliseerimine nutilepingu loomise ja kĂ€ivitamise ajal lihtsustab sageli nende rakendamise tehnoloogiat ja kulusid.

Lihtne nĂ€ide — Escrow teenus

Vaatame vÀga lihtsalt nÀidet. See aitab paremaks mÔistmiseks aru saada nutilepingute funktsionaalsust ja millal neid on mÔistlik kasutada.

Sissejuhatus tarkvaralepingutesse

Seda saab rakendada ka kasutades Bitcoini, kuigi praegu on Bitcoinil raske öelda, et see on tĂ”eline platvorm nutilepingute jaoks. Nii et meil on teatud ostja ja veebipood. Ostja soovib osta selle poest monitori. KĂ”ige lihtsamal juhul tĂ€idab ostja makse ja saadab selle, samas kui veebipood aktsepteerib selle, kinnitab ja seejĂ€rel saadab kauba. Siiski on selle olukorra juures usaldus probleem — ostja peab usaldama veebipoodi kogu monitori maksumuses. Kuna veebipoel vĂ”ib ostja silmis olla madal maine, on risk, et mingil pĂ”hjusel pĂ€rast makse saamist keeldub pood teenindamisest ja ei saada ostjale kaupa. SeetĂ”ttu peab ostja kĂŒsima (vastavalt kĂŒsib ka veebipood), mida saaks sellisel juhul rakendada, et nende riske ĐŒĐžĐœĐžĐŒĐžĐ·ĐžŃ€ĐŸĐČать ja sellised tehingud usaldusvÀÀrsemaks muuta.

Bitcoiniga on vĂ”imalik anda ostjale ja mĂŒĂŒjale vĂ”imalus iseseisvalt valida vahendaja. On palju inimesi, kes tegelevad vaidluste lahendamisega. Ja meie osalejad saavad valida ĂŒldiselt usaldusvÀÀrsest vahendajate nimekirjast. Koos loovad nad multisignature aadressi 2 3-st, kus on kolm vĂ”tit ja kaks allkirja mistahes kahest vĂ”tmes, et kulutada seda aadressilt mĂŒnte. Üks vĂ”ti kuulub ostjale, teine veebipoele ja kolmas vahendajale. Ja sellele multisignature aadressile saadab ostja summa, mis on vajalik monitori tasumiseks. NĂŒĂŒd, kui mĂŒĂŒja nĂ€eb, et raha on mĂ”neks ajaks multisignature aadressil blokeeritud, mis sĂ”ltub temast, vĂ”ib ta julgelt saata monitori posti.

SeejĂ€rel uurib ostja pakki, vaatab kaupa ja otsustab lĂ”ppostu ĂŒle. Ta vĂ”ib olla tĂ€ielikult rahul pakutud teenusega ning allkirjastada tehingu oma vĂ”tmega, millega ta edastab mĂŒĂŒjale mĂŒnte multisignature aadressilt, vĂ”i ta vĂ”ib olla millegagi rahulolematu. Teisel juhul pöördub ta vahemehe poole, et koostada alternatiivne tehing, mis jagab mĂŒnte teisiti.

Oletame, et monitor on tiba kriimuline ja komplektis ei olnud kaabli, et arvutiga ĂŒhendada, kuigi internetipoe veebilehel oli öeldud, et see kaabel peab komplektis olema. Siis kogub ostja tĂ”endeid, mis on vajalikud, et tĂ”estada vahemeest, et teda on selles situatsioonis petetud: ta teeb ekraanipildid veebilehelt, pildistab postitusaadressi kviitungit, pildistab monitori kriimustusi ja nĂ€itab, et pitsat on avatud ning kaabel on vĂ€lja tĂ”mmatud. Internetipood omakorda kogub oma tĂ”endeid ja edastab need vahemeest.

Vahemik on huvitatud sellest, et rahuldada samal ajal nii ostja pahameelt kui ka internetipoe huve (hiljem selgub, miks). Ta koostab sellise tehingu, kus mĂŒnte multisignature aadressilt kulutatakse teatud osas ostja, internetipoe ja vahemehe vahel, kuna ta peab enda jaoks osa oma töö tasuks. Oletame, et 90% kogu summast lĂ€heb mĂŒĂŒjale, 5% vahemehe jaoks ja 5% ostja kompenseerimiseks. Selle tehingu allkirjastab vahemees oma vĂ”tmega, kuid see ei saa veel rakenduda, kuna selleks on vajalik kaks allkirja, praegu on vaid ĂŒks. Sellise tehingu saadab ta nii ostjale kui mĂŒĂŒjale. Kui vĂ€hemalt ĂŒks neist on rahul selle mĂŒntide ĂŒmberjaotamise variandiga, allkirjastatakse tehing ja levitatakse vĂ”rgus. Selle valideerimiseks piisab, et ĂŒks tehingu osalistest nĂ”ustub vahemehe pakutud variandiga.

Oluline on alguses valida vahendaja, kellele mĂ”lemad osalised usaldavad. Sel juhul tegutseb ta sĂ”ltumatult ĂŒhe vĂ”i teise huvidest ning hindab olukorda objektiivselt. Kui vahendaja ei paku sellist mĂŒntide jagamise varianti, mis rahuldaks vĂ€hemalt ĂŒhte osalist, saavad nii ostja kui ka internetipood, kokkuleppel, edastada mĂŒndid uuele multisignature aadressile, andes oma kaks allkirja. Uus multisignature aadress koostatakse teise vahendajaga, kes vĂ”ib-olla on kĂŒsimuses kompetentsem ja pakub parema variandi.

NĂ€ide ĂŒhiselamust ja kĂŒlmk kapist

Vaatame keerukamat nÀidet, mis nÀitab nutilepingute vÔimalusi selgemalt.

Sissejuhatus tarkvaralepingutesse

Oletame, et kolmel poisil, kes on hiljuti ĂŒhiselamusse kolinud, on huvi osta oma tuppa kĂŒlmkapp, millega nad koos kasutavad. Üks neist on vabatahtlikult nĂ”ustunud koguma vajaliku summa kĂŒlmiku ostmiseks ja asjaajamiseks mĂŒĂŒjaga. Siiski on nad ĂŒksteisega suhteliselt hiljuti tutvunud, seega usaldust ei ole. On selge, et kaks neist riskivad, andes kolmandale raha. Lisaks peavad nad mĂŒĂŒja valimise osas kokku leppima.

Nad saavad kasutada escrow teenust, st valida vahendaja, kes kontrollib tehingu teostamist ja lahendab vÔimalikke vaidlusi. Siis, kokkuleppel, koostavad nad nutilepingu ja mÀÀratlevad selles kindlad tingimused.

Esimene tingimus on see, et enne kindla aja möödumist, oletame ĂŒhe nĂ€dala jooksul, peavad mÀÀratud arvelduskontole saabuma kolm makset kindlatest aadressidest teatud summas. Kui seda ei juhtu, lĂ”petab nutileping oma tĂ€itmise ja tagastab mĂŒndid kĂ”igile osalejatele. Kui tingimus on tĂ€idetud, mÀÀratakse mĂŒĂŒja ja vahendaja tunnuseid ning kontrollitakse, et kĂ”ik osalejad on nĂ”us mĂŒĂŒja ja vahendaja valikuga. Kui kĂ”ik tingimused on tĂ€idetud, kantakse rahalised vahendid mÀÀratud aadressidele. Selline lĂ€henemine vĂ”ib osalejaid kaitsta pettuste eest kĂ”ikidest suundadest ja vĂ€listab ĂŒldiselt usaldamise vajaduse.

Me nĂ€eme selle nĂ€ite pĂ”hjal pĂ”himĂ”tet, et selline vĂ”imalus samm-sammult mÀÀrata parameetreid iga tingimuse tĂ€itmiseks vĂ”imaldab luua sĂŒsteeme, mille keerukus ja sĂŒgavuse tasemed on erinevad. Lisaks sellele saab nutilepingus kĂ”igepealt mÀÀrata esimese tingimuse ja alles pĂ€rast selle tĂ€itmist mÀÀrata jĂ€rgmise tingimuse parameetrid. TeisisĂ”nu, formaalselt on tingimus kirja pandud, kuid selle parameetrid vĂ”ivad olla mÀÀratud juba selle toimuval ajal.

Nutilepingute klassifitseerimine

Klassifitseerimiseks vÔib mÀÀrata erinevad kriteeriumide grupid. Kuid tehnoloogia arengu hetkel on asjakohased neli neist.

Nutilepinguid saab eristada tĂ€itmis keskkonna jĂ€rgi, mis vĂ”ib olla kas tsentraliseeritud vĂ”i detsentraliseeritud. Detsentraliseerimise puhul saame palju suurema sĂ”ltumatuse ja talitluspĂŒsivuse nutilepingute tĂ€itmisel.

Neid saab eristada ka tingimuste mÀÀramise ja tĂ€itmise protsessi jĂ€rgi: need vĂ”ivad olla vabalt programmeeritavad, piiratud vĂ”i eelnevalt mÀÀratud ehk rangelt tĂŒĂŒbitud. Kui nutilepingute platvormil on olemas ainult 4 kindlat nutilepingut, vĂ”ib nende parameetreid mÀÀrata vabalt. Seega on neid palju lihtsam mÀÀrata: valime nimekirjast lepingu ja edastame parameetrid.

In terms of initiation, there are automated smart contracts, meaning they execute automatically when certain conditions are met, and there are those contracts with defined conditions that the platform does not check automatically for compliance; they need to be initiated separately.

Moreover, smart contracts vary by the level of privacy. They can be fully open, partially open, or completely confidential. The latter means that third-party observers do not see the conditions of the smart contracts. However, the topic of privacy is quite broad and should be considered separately from the current article.

Below we will delve deeper into the first three criteria to provide more clarity on the current topic.

Smart contracts by execution environment

Sissejuhatus tarkvaralepingutesse

Smart contracts are distinguished by centralized and decentralized platforms. In the case of centralized digital contracts, a single service is used, where there is only one validator, and there may also be a backup and recovery service that is centrally managed. There is a single database that stores all the necessary information for setting the conditions of the smart contract and distributing the value recorded in that database. Such a centralized service has a client that sets conditions through specific requests and utilizes such contracts. Due to the centralized nature of the platform, authentication mechanisms may be less reliable than in cryptocurrencies.

For example, we can take mobile service providers (various mobile operators). Suppose a certain operator centrally tracks traffic on their servers, which can be transmitted in different formats, such as voice calls, SMS transmission, mobile internet traffic, and according to different standards, while also tracking user balance funds. Accordingly, the mobile service provider can formulate contracts for accounting provided services and their payments with various conditions. In this case, conditions can easily be set, such as 'send an SMS with a specific code to a particular number and receive certain traffic distribution conditions.'

VĂ”ite tuua veel ĂŒhe nĂ€ite: traditsioonilised pangad, millel on ulatuslikud internetipanganduse funktsioonid, ja vĂ€ga lihtsad lepingud, nagu regulaarsed maksed, sissetulevate maksete automaatne konverteerimine, protsentide automaatne ĂŒlekandmine mÀÀratud kontole jne.

Kui rÀÀkida nutilepingutest, millel on detsentraliseeritud tĂ€itmise keskkond, siis on meil rĂŒhm valideerijaid. Ideaalis vĂ”ib valideerijaks saada keegi, kes tahab. Andmebaasi sĂŒnkroniseerimise protokolli ja konsensuse saavutamise kaudu saame mingisuguse ĂŒhise andmebaasi, mis salvestab nĂŒĂŒd kĂ”iki tehinguid selgelt kirja pandud lepingute alusel, mitte mingeid tingimuslikke pĂ€ringuid, mille vormingud sageli muutuvad ja millel pole avatud spetsifikatsiooni. Siin sisaldavad tehingud juhiseid lepingute tĂ€itmiseks vastavalt rangetele spetsifikatsioonidele. See spetsifikatsioon on avatud ja seega saavad platvormi kasutajad lĂ€bi viia auditeid ja valideerida nutilepinguid. NĂ€eme, et detsentraliseeritud platvormid ĂŒletavad keskseid platvorme sĂ”ltumatuse ja tĂ”rketaluvuse poolest, kuid nende projekteerimine ja hooldamine on sel juhul palju keerulisem.

Nutilepingud tingimuste mÀÀramise ja tÀitmise meetodil

NĂŒĂŒd vaatame lĂ€hemalt, kuidas nutilepingud vĂ”ivad erineda tingimuste mÀÀramise ja tĂ€itmise meetodi poolest. Siin pöörame tĂ€helepanu nutilepingutele, mida saab vabalt programmeerida ja mis on Turingi tĂ€ielikud. Turingi tĂ€ielik nutileping vĂ”imaldab mÀÀrata praktiliselt mis tahes algoritme lepingutingimustena: kirjutada sildu, mingit tĂ”enĂ€osuse arvutamise funktsiooni ja nii edasi — kuni omaenda digitaalsete allkirjade algoritmideni. Sel juhul on tĂ”eliselt vaba loogika kirjutamine mĂ”eldud.

Erinevad ka vabalt kasutatavad nutilepingud, kuid mitte Turingi tĂ€ielikud. Siia kuuluvad Bitcoin ja Litecoin oma skriptiga. See tĂ€hendab, et ĂŒhte korraldada saab ainult teatud operatsioone, kuid sildu ja oma algoritme juba kirjutada ei saa.

Lisaks on olemas ka selliseid nutilepingute platvorme, mis rakendavad ette mÀÀratud nutilepinguid. Nendeks on nÀiteks Bitshares ja Steemit. Bitshares'il on terve rida nutilepinguid kaubanduse, konto haldamise, platvormi enda ja selle parameetrite haldamise jaoks. Steemit on sarnane platvorm, kuid on suunatud mitte tokenite vÀljastamisele ja kaubandusele, nagu Bitshares, vaid blogimisele, st see salvestab ja töötleb sisu detsentraliseeritud viisil.

Tavaliste tÀis Turingi lepingute hulka kuuluvad platvorm Ethereum ja RootStock, mis on veel arendusjÀrgus. SeetÔttu peatume jÀrgmiseks natuke pÔhjalikumalt nutilepingute platvormil Ethereum.

Nutilepingud sissetoomise viisi jÀrgi

Sissetoomise viisi jĂ€rgi saab nutilepingud jagada vĂ€hemalt kaheks rĂŒhmaks: automatiseeritud ja kĂ€sitsi (mitte automatiseeritud). Automatiseeritud puhul on iseloomulik, et kĂ”igi teadaolevate parameetrite ja tingimuste tĂ€itmisel tĂ€idetakse nutileping tĂ€ielikult automaatselt, st ei nĂ”ua tĂ€iendavate tehingute saatmist ja iga jĂ€rgnevate tĂ€itmiste puhul lisatasu kulutamist. Platvormil on kĂ”ik andmed, et arvutada, kuidas nutileping lĂ”ppeb. Loogika ei ole seal juhuslik, vaid ette mÀÀratud ja kĂ”ik see on etteennustatav. See tĂ€hendab, et on vĂ”imalik eelnevalt hinnata nutilepingu tĂ€itmise keerukust, kasutada sellele mingit konstantset tasu ja kĂ”ik protsessid tema tĂ€itmiseks toimuvad tĂ”husamal viisil.

Nutilepingutele, mida programmeeritakse juhuslikult, ei ole tĂ€itmine automatiseeritud. Sellise nutilepingu sissetoomiseks on iga sammu puhul vajalik luua uus tehing, mis kutsub esile jĂ€rgmise tĂ€itmisetapi vĂ”i jĂ€rgmise nutilepingu meetodi, tasuda vastav tasu ja oodata tehingu kinnitamist. TĂ€itmine vĂ”ib lĂ”ppeda edukalt vĂ”i mitte, kuna nutilepingu kood on juhuslik ning vĂ”ivad ilmneda ettearvamatused, nagu lĂ”putu tsĂŒkkel, teatud parameetrite ja argumentide puudumine, töötlemata erandid jne.

Kontod Ethereumis

Ethereum kontotĂŒĂŒbid

Vaatame, millised vĂ”ivad olla kontod Ethereum platvormil. Siin on ainult kaks tĂŒĂŒpi kontosid ja rohkem variante ei ole. Esimene tĂŒĂŒp nimetatakse kasutajakontoks, teine – lepingukontoks. Uurime, kuidas need erinevad.

Kasutajakontot juhib ainult isiklik allkirjakey. Konto omanik genereerib oma ECDSA (Elliptic Curve Digital Signature Algorithm) algoritmi abil allkirja jaoks vÔtmepaari. Selle konto olekut saavad muuta ainult selle vÔtmega allkirjastatud tehingud.

Lepingukonto jaoks on ette nĂ€htud eraldi loogika. Sedalaadi kontot saab juhtida ainult eelnevalt mÀÀratud programmikoodi abil, mis mÀÀratleb tĂ€ielikult lepingukonto kĂ€itumise: kuidas see oma mĂŒnte teatud olukordades kasutab, millise kasutaja algatusel ja milliste lisatingimuste tĂ€itmisel need mĂŒndid jagatakse. Kui mĂ”ningaid aspekte ei ole arendajad programmikoodis ette nĂ€inud, vĂ”ivad tekkida probleemid. NĂ€iteks vĂ”ib lepingukonto jĂ”uda teatud olekusse, kus ta ei aktsepteeri edasisi kĂ€ivitamisi ĂŒheltki kasutajalt. Sellisel juhul vĂ”ivad mĂŒndid tegelikult kĂŒlmuda, kuna lepingukonto ei ole selle olekust vĂ€ljapÀÀsu ette nĂ€inud.

Kuidas luuakse kontosid Ethereumis

Kasutajakonto puhul genereerib omanik iseseisvalt vĂ”tmepaari ECDSA jĂ€rgi. Oluline on mĂ€rkida, et Ethereum kasutab allkirjastamiseks tĂ€pselt sama algoritmi ja sama elliptilist kĂ”verat nagu Bitcoin, kuid aadress arvutatakse pisut teistsugusel viisil. Siin ei rakendata topelthashimist, nagu Bitcoini puhul, vaid kasutatakse Kecakk-funktsiooni ĂŒhekordset hashimist 256-bitise pikkusega. Saadud vÀÀrtusest lĂ”igatakse Ă€ra madalamad bitid, nimelt 160 kĂ”ige madalamat bitti hash-funktsiooni vĂ€ljundist. LĂ”puks saame Ethereum aadressi. Tegelikult hĂ”ivab see 20 baiti.

Pöörame tĂ€helepanu sellele, et Ethereum'i konto identifikaator kodeeritakse heksadesimaalses vormis ilma kontrollsummata, erinevalt Bitcoin'ist ja paljusid teisi sĂŒsteeme, kus aadress kodeeritakse 58-pĂ”hisesse numbrilisse sĂŒsteemi koos kontrollsumma lisamisega. See tĂ€hendab, et Ethereum'i konto identifikaatoritega tuleb olla ettevaatlik: isegi ĂŒks viga identifikaatoris toob kindlasti kaasa mĂŒntide kadumise.

On oluline, et kasutaja konto luuakse ĂŒldise andmebaasi tasemel just sel hetkel, kui ta aktsepteerib esimese sisse tuleva makse.

Nutilepingute konto loomise puhul rakendatakse tÀiesti teistsugust lÀhenemist. Alustuseks kirjutab mÔni kasutajatest nutilepingu lÀhtekoodi, seejÀrel kÀib kood spetsiaalse Ethereum'i platvormile mÔeldud kompilaatori kaudu, et saada oma Ethereum'i virtuaalmasina jaoks bytecode. Saadud bytecode paigutatakse spetsiaalsesse tehingu valdkonda. Tehing kinnitatakse algataja konto nimel. SeejÀrel levitatakse tehing vÔrgu kaudu ja paigutatakse nutilepingu kood. Tehingu teostamise tasu ning seega ka lepingu tÀitmise tasu lahutatakse algataja konto saldost.

Iga nutileping sisaldab tingimata oma konstruktorit (selle lepingu). See vĂ”ib olla tĂŒhi vĂ”i sisaldada sisu. PĂ€rast konstruktorite tĂ€itmist luuakse nutilepingu konto identifikaator, mida saab kasutada mĂŒntide saatmiseks, teatud nutilepingu meetodite kutsumiseks jne.

Ethereum'i tehingu struktuur

Selle selgemaks muutmiseks alustame Ethereum'i tehingu struktuuri ja nutilepingu koodi nÀite uurimist.

Sissejuhatus tarkvaralepingutesse

Ethereum'i tehing koosneb mitmest valdkonnast. Esimene neist, nonce, on mingisugune tehingu jÀrjestusnumber, mis on seotud konto, kes seda levitab ja on selle autor. See on vajalik tehingute duplikaatide eristamiseks, et vÀlistada olukord, kus sama tehingut aktsepteeritakse kaks korda. TÀnu identifikaatori rakendamisele on igal tehingul ainulaadne hash-vÀÀrtus.

SeejÀrel jÀrgneb selline vÀli nagu gas priceSiin nÀidatakse hinda, mille eest baasvaluuta Ethereum konverteeritakse gas'iks, millega tasutakse nutilepingute tÀitmise ja virtuaalse masina ressursi eraldamise eest. Mida see tÀhendab?

Bitcoini puhul makstakse teenustasusid otse baasaraha — ise Bitcoini. See on vĂ”imalik tĂ€nu lihtsale arvutuste mehhanismile: me maksame tĂ€pselt andmemahtu, mis sisaldub tehingus. Ethereumis on olukord keerulisem, kuna andmemahu pĂ”hjal tehingu hindamine on vĂ€ga keeruline. Tehing vĂ”ib sisaldada ka programmikoodi, mis kĂ€ivitatakse virtuaalses masinas, ja iga virtuaalse masina operatsioonil vĂ”ib olla erinev keerukus. Samuti on operatsioone, mis eraldavad mĂ€lu muutujatele. Nendel on oma keerukus, millest sĂ”ltub tasu iga operatsiooni eest.

Iga operatsiooni hind gas'i ekvivalentis on konstantne. See on spetsiaalselt sisse viidud selleks, et mÀÀrata iga operatsiooni konstantne hind. Vastavalt vÔrgu koormusele muutub gas'i hind, st korrutegur, mille alusel baasaraha konverteeritakse sellesse abielementi tasu maksmiseks.

On veel ĂŒks eripĂ€ra Ethereumis toimuval tehingul: bajtikood, mis see sisaldab virtuaalses masinas tĂ€itmiseks, kĂ€ivitatakse seni, kuni see ei lĂ”peta mingit tulemust (edu-ebaedu) vĂ”i kuni lĂ”peb teatud kogus mĂŒnte, mis on ette nĂ€htud tasu maksmiseks. Just selleks, et vĂ€ltida olukorda, kus saatja kontolt kulutatakse kĂ”ik mĂŒnte tasuks mingi vea tĂ”ttu (nĂ€iteks kui mingisugune lĂ”pmatu tsĂŒkkel kĂ€ivitus virtuaalses masinas), on olemas jĂ€rgmine vĂ€li — start gas (seda nimetatakse tihti gas limiidiks) — see mÀÀrab maksimaalse mĂŒntide arvu, mille saatja on valmis kulutama konkreetse tehingu tĂ€itmiseks.

JĂ€rgmine vĂ€li on nimetatud destination address. Siia kirjutatakse saadetavate mĂŒntide saaja aadress vĂ”i konkreetse nutilepinguga aadress, mille meetodeid kutsutakse. Selle jĂ€rel tuleb vĂ€li value, kuhu kirjutatakse saadetavate mĂŒntide summa destination address'ile.

Edasi asub huvitav vĂ€li nimega data, kuhu mahub terve struktuur. See ei ole eraldi vĂ€li, vaid terve struktuur, milles mÀÀratakse kood virtuaalse masina jaoks. Siia saab paigutada juhuslikke andmeid — selleks kehtivad erireeglid.

Ja viimast vĂ€li nimetatakse allkiri. See sisaldab samaaegselt autori elektroonilist allkirja selle tehingu kohta ning avalikku vĂ”tit, millega seda allkirja kontrollitakse. Avalikust vĂ”tme pĂ”hjal saab tuletada saatja konto identifikaatori, see tĂ€hendab, et saab unikaalselt tuvastada saatja konto sĂŒsteemis. Tehingustruktuuri osas oleme pĂ”hiasjad selgeks teinud.

NĂ€ide smartehingu koodist Soliditys

Vaadakem nĂŒĂŒd lĂ€hemalt kĂ”ige lihtsamat smartehingut nĂ€ite pĂ”hjal.

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

Ülal on toodud lihtsustatud lĂ€htekood, mis suudab hoida kasutajate mĂŒnte ja tagastada need nĂ”udmisel.

Nii on olemas smartehing Bank, mis tĂ€idab jĂ€rgmisi funktsioone: see kogub oma kontole mĂŒnte, st tehingu kinnitamisel ja sellise smartehingu paigutamisel luuakse uus konto, mis vĂ”ib hoida mĂŒnte oma kontol; see mĂ€letab kasutajaid ja mĂŒnte nende vahel; omab mitmeid meetodeid kontode haldamiseks, st on vĂ”imalik kontosid tĂ€iendada, vĂ€lja vĂ”tta ja kontrollida kasutaja bilanssi.

Vaadakem iga rida lĂ€htekoodis. Selles lepingus on konstantseid vĂ€lju. Üks neist, tĂŒĂŒbiga address, nimetatakse owner. Siia leping mĂ€letab kasutaja aadressi, kes selle smartehingu lĂ”i. Edasi on dĂŒnaamiline struktuur, mis salvestab vastavusi kasutajate aadresside ja bilansside vahel.

PĂ€rast seda jĂ€rgneb meetod Bank — see on nime poolest sama, mis leping. Vastavalt sellele on see tema konstruktor. Siin toimub muutuja owneri mÀÀramine selle isiku aadressile, kes selle smartehingu vĂ”rgus paigutas. See on ainus, mis toimub selles konstruktoris. Seega on msg antud juhul just need andmed, mis edastati virtuaalsele masinale koos tehinguga, mis sisaldas kogu selle lepingu koodi. Vastavalt sellele on msg.sender selle tehingu autor, mis paigutab selle koodi. Tema ongi smartehingu omanik.

Deposit meetod vĂ”imaldab tehingus teatud arvu mĂŒnte edastada lepingu kontole. Antud juhul, kui nutileping saab need mĂŒndid, hoiab ta need oma saldos, kuid saldos on kirjas, kes tĂ€pselt olid nende mĂŒntide saatjad, et teada, kelle omad need on.

JĂ€rgmine meetod nimetatakse withdraw ja see vĂ”tab ĂŒhe parameetri — summa mĂŒnte, mida keegi soovib sellest pangast vĂ€lja vĂ”tta. Siin kontrollitakse, kas kasutaja, kes kutsub esile selle meetodi, saldo on piisav, et neid saata. Kui piisavalt, siis nutileping tagastab kutse teinud isikule selle arvu mĂŒnte.

Edasi tuleb meetod, mis kontrollib kasutaja praegust saldo. See, kes kutsub esile selle meetodi, kasutatakse selle saldo saamiseks nutilepingus. Tasub mÀrkida, et selle meetodi modifikaator on view. See tÀhendab, et meetod ei muuda oma klassi muutujaid ning on tegelikult ainult lugemismeetod. Eraldi tehingut ei loodud selle meetodi kutseks, komisjonitasu ei maksta, ja kÔik arvutused teostatakse kohapeal, pÀrast mida kasutaja saab tulemuse.

Meetod kill on vajalik nutilepingute oleku hĂ€vitamiseks. Siin on lisaks kontroll, kas meetodi kutse tegija on selle lepingu omanik. Kui on, siis leping hĂ€vitatakse ja hĂ€vitamise funktsioon vĂ”tab ĂŒhe parameetri — konto identifitseerimise, kuhu leping saadab kĂ”ik mĂŒndid, mis jÀÀvad tema saldosse. Antud juhul lĂ€hevad ĂŒlejÀÀnud mĂŒnnid automaatselt lepingu omaniku aadressile.

Kuidas töötab Ethereum'i vÔrgu tÀis sÔlm?

Vaatame skeemiliselt, kuidas sellised nutilepingud töötavad Ethereum'i platvormil ja kuidas töötab vÔrgu tÀis sÔlm.

Sissejuhatus tarkvaralepingutesse

Ethereum'i vÔrgu tÀis sÔlm peab vÀhemalt omama nelja moodulit.
Esmane, nagu igasuguste detsentraliseeritud protokollide puhul, on P2P networking module — vĂ”rgu ĂŒhenduse moodul ja töötamine teiste sĂ”lmede, kus toimub plokkide, tehingute ja informatsiooni vahetus teiste sĂ”lmede kohta. See on traditsiooniline komponent kĂ”igi detsentraliseeritud krĂŒptovaluutade jaoks.

Edasi, meil on plokiahela andmete salvestamise, töötlemise, prioriteetselt haru valimise, plokkide tÀiendamise, plokkide eemaldamise, nende plokkide kontrollimise jne moodul.

Kolmas moodul kannab nime EVM (Ethereum virtuaalne masin) — see ongi virtuiaalmasin, mis aktsepteerib Ethereum'i tehingust saadud baitkoodi. See moodul vĂ”tab vastu teatud konto praeguse oleku ja teostab muudatusi selle olekus vastavalt saadud baitkoodile. Iga vĂ”rgu sĂ”lme virtuaalse masina versioon peab olema sama. Arvutused toimuvad iga Ethereum'i sĂ”lmes tĂ€iesti ĂŒhtlaselt, kuid need toimuvad asĂŒnkroonselt: keegi kontrollib ja aktsepteerib selle tehingu varem, see tĂ€hendab tĂ€idab kogu selles sisalduvat koodi, ja keegi hiljem. Seega, kui tehing luuakse, levitatakse see vĂ”rku, sĂ”lmed aktsepteerivad seda ja valideerimise hetkel toimub see sama moodi nagu Bitcoinis toimub Bitcoin Script'i tĂ€itmine, siin tĂ€idetakse virtuaalse masina baitkoodi.

Tehingut loetakse kehtivaks, kui kogu selles sisalduv kood on tĂ€idetud, on genereeritud uued muudatused teatud konto olekus ja need salvestatakse seni, kuni on selge, kas see tehing on rakendatud vĂ”i mitte. Kui tehing on rakendatud, siis seda olekut peetakse mitte ainult tĂ€idetuks, vaid ka aktuaalseks. On andmebaas, mis salvestab iga konto oleku iga vĂ”rgu sĂ”lme jaoks. Kuna kĂ”ik arvutused toimuvad ĂŒhtlaselt ja plokiahela olek on sama, on ka andmebaas, mis sisaldab kĂ”igi kontode olekuid, iga sĂ”lme jaoks sama.

MĂŒĂŒdid ja piirangud nutilepingutest

Mis puutub piirangutesse, mis kehtivad Ethereum'i sarnaste nutilepingute platvormide kohta, siis vÔib tuua jÀrgmised:

  • koodi tĂ€itmine;
  • mĂ€lu eraldamine;
  • plokiahela andmed;
  • maksete saatmine;
  • uue lepingu loomine;
  • muude lepingute kutsumine.

Vaatame ĂŒle need piirangud, mis kehtivad virtuaalmasinale, ja seega hajutame mĂ”ned mĂŒĂŒdid nutilepingute kohta. Virtuaalmasinas, mis ei pruugi olla ainult Ethereumis, vaid ka sarnastes platvormides, on vĂ”imalik tĂ”eliselt teostada igasuguseid loogilisi operatsioone, st kirjutada koodi ja see seal vĂ€lja viia, lisaks saab eraldada tĂ€iendavat mĂ€lu. Siiski tuleb komisjonitasu maksta iga tehingu ja iga eraldatud mĂ€luhulga eest eraldi.

Edasi, virtuaalmasin vÔib lugeda andmeid plokiahela andmebaasist, et kasutada neid andmeid nutilepingute teatud loogika teostamise kÀivitajaks. Virtuaalmasin vÔib luua ja saata tehinguid, luua uusi lepinguid ja kutsuda vÀlja teiste juba vÔrgus avaldatud nutilepingute meetodeid: olemasolevad, kÀttesaadavad jne.

Levinud mĂŒĂŒt on see, et Ethereum'i nutilepingud saavad kasutada teavet mistahes Interneti-ressurssidest oma tingimustes. TĂ”de on see, et virtuaalmasin ei saa saata vĂ”rgu pĂ€ringut mingile vĂ€list informatsiooniallikale Internetis, st ei saa kirjutada sellist nutilepingut, mis jagaks vÀÀrtust kasutajate vahel sĂ”ltuvalt nĂ€iteks ilmast, kes vĂ”itis mĂ”nes meistrivĂ”istlustes, vĂ”i mis tahes vĂ€lismaailmas toimunud sĂŒndmuse alusel, kuna teavet nende sĂŒndmuste kohta lihtsalt ei ole platvormi enda andmebaasis. See tĂ€hendab, et plokiahelas ei ole selle kohta midagi. Kui seda seal ei ole, ei saa virtuaalmasin kasutada neid andmeid kĂ€ivitajatena.

Ethereum'i puudused

Loetleme mĂ”ned peamised neist. Esimene puudus seisneb selles, et Ethereumis nutilepingute projekteerimisel, arendamisel ja testimisel esineb teatud raskusi (Ethereumis kasutatakse nutilepingute kirjutamiseks Solidity keelt). TĂ”epoolest, praktika nĂ€itab, et vĂ€ga suur protsent kĂ”ikidest vigadest tuleneb inimfaktorist. See kehtib ka juba kirjutatud Ethereum-i nutilepingute puhul, mille keerukus on keskmine vĂ”i kĂ”rgem. Kui lihtsate nutilepingute puhul on vea tekkimise tĂ”enĂ€osus vĂ€ike, siis keerulistes nutilepingutes esineb vĂ€ga sageli vigu, mis viivad vahendite varastamiseni, nende kĂŒlmutamiseni, nutilepingute ettenĂ€gematule viisil hĂ€vitamiseni jne. VĂ”ime tuua palju selliseid nĂ€iteid.

Teine puudus seisneb selles, et ise virtuaalmasin ei ole ideaalne, kuna see on samuti inimeste poolt kirjutatud. See suudab tÀita meelevaldseid kÀske ja selles peitub haavatavus: teatud viisil saab konfigureerida rida kÀske, mis viivad ettenÀgematutele tagajÀrgedele. See on vÀga keeruline valdkond, kuid juba on lÀbi viidud mitmeid uuringuid, mis nÀitavad, et need haavatavused esinevad praeguses Ethereum-i versioonis ja need vÔivad pÔhjustada paljude nutilepingute töökatkestusi.

Veel ĂŒks suur keerukus, mida vĂ”ib pidada puuduseks. See seisneb selles, et praktikas vĂ”i tehniliselt vĂ”ib juhtuda, et kui kompileerida lepingute binaarkood, mis töötab virtuaalmasinas, saab mÀÀrata teatud spetsiifilise toimingute jĂ€rjestuse. Kui neid toiminguid koos teha, koormavad need virtuaalmasinat vĂ€ga tugevalt ja aeglustavad seda vastupidiselt sellele tasule, mis on makstud nende toimingute tĂ€itmise eest.

Ajal oli juba selline arenguperiood Ethereumis, mil paljud, kes said pÔhjalikult aru virtuaalmaja toimimisest, leidsid selliseid haavatavusi. Tegelikult maksid tehingud vÀga madalat tasu, kuid peaaegu tÔid kogu vÔrgu töö vÀga aeglaselt. Nende probleemide lahendamine on ÀÀrmiselt keeruline, kuna tuleb neid kÔigepealt mÀÀratleda, teiseks korrigeerida tehingute tegemise hinda ja kolmandaks viia lÀbi hard fork, mis tÀhendab kÔigi vÔrgu sÔlmede vÀrskendamist uue tarkvara versiooniga ning seejÀrel nende muutuste samasugust aktiveerimist.

Mis puutub Ethereumisse, siis on tehtud vÀga palju uuringuid, saadud suur praktika: nii positiivne kui ka negatiivne, kuid vaatamata sellele jÀÀvad probleemid ja haavatavused, millega tuleb veel kuidagi vÔidelda.

Nii et artikli teemaosa on lĂ”petatud, liigume kĂŒsimuste juurde, mis tekivad ĂŒsna tihti.

Korduma kippuvad kĂŒsimused

— Kui kĂ”ik aktiveeritud nutilepingus osalised tahavad muuta tingimusi, kas saavad nad selle nutilepingu tĂŒhistada mitme allkirjaga ja seejĂ€rel luua uue nutilepingu selle tĂ€itmise uuendatud tingimustega?

Siin on vastus kahekordne. Miks? Kuna ĂŒhelt poolt mÀÀratakse nutileping ĂŒhekordselt ja see ei tĂ€henda juba mingeid muudatusi, kuid teisest kĂŒljest vĂ”ib see omada eelnevalt mÀÀratud loogikat, mis ette nĂ€eb tingimuste tĂ€ielikku vĂ”i osalist muutmist. See tĂ€hendab, et kui soovite oma nutilepingus midagi muuta, peate eelnevalt mÀÀratlema tingimused, mille alusel saate need tingimused uuendada. Seega saab ainult selliselt ettevaatlikult korraldada lepingu uuendamist. Kuid ka siin on vĂ”imalik eksida: teha mĂ”ni viga ja saada vastav haavatavus. SeetĂ”ttu tuleb selliseid asju vĂ€ga detailselt ja hoolikalt projekteerida ja testida.

— Ja kui vahendaja teeb koostööd ĂŒhe osalisega: escrow vĂ”i nutileping? Kas vahendaja on nutilepingus kohustuslik?

Mediatoor ei ole nutika lepinguga kohustuslik. Seda ei pruugi olla. Kui escrow puhul satub mediatoor koos ĂŒhe osapoolega salasuhtesse, siis jah, see skeem kaotab jĂ€rsult oma vÀÀrtuse. SeetĂ”ttu valitakse mediatoorid nii, et neile usaldavad kĂ”ik osalised, kes on seotud selle protsessiga. Seega ei hakka te lihtsalt ĂŒlekandeid multisignature aadressile tegema selle mediatooriga, kellele ei usalda.

— Kas on vĂ”imalik ĂŒhe Ethereum'i tehinguga saata oma aadressilt palju erinevaid tokeneid erinevatesse sihtaadressidesse, nĂ€iteks börsi aadressidesse, kus neid tokeneid kaubeldakse?

See on hea kĂŒsimus ja see puudutab Ethereum'i tehingute mudelit ning selle erinevust Bitcoin'i mudelist. Ja see erinevus on kardinaalne. Kui Ethereum'i tehingu mudelis edastate lihtsalt mĂŒnte, siis need edastatakse ainult ĂŒhelt aadressilt teisele, vaatamata tagasimaksetele, lihtsalt konkreetne summa, mille olete mÀÀranud. TeisisĂ”nu, see ei ole kulutamata vĂ€ljundite (UTXO) mudel, vaid just kontode mudel koos vastavate saldoidega. Ühe tehinguga saata teoreetiliselt mitu erinevat tokeneid on vĂ”imalik, kui kirjutada osav nutileping, kuid siiski tuleb teha palju tehinguid, luua leping, seejĂ€rel edastada sellele tokeneid ja mĂŒnte, ning seejĂ€rel kutsuda vastavat meetodit. See nĂ”uab pingutust ja aega, seega ei toimi praktikas nii, et kĂ”ik maksed Ethereum'is tehakse eraldi tehingutena.

— Üks mĂŒĂŒt Ethereum'i platvormi kohta on see, et ei ole vĂ”imalik kirjeldada tingimusi, mis sĂ”ltuvad vĂ€lisest interneti ressursist, kuidas siis olla?

Lahendus seisneb selles, et nutileping ise vĂ”ib ette nĂ€ha ĂŒhe vĂ”i mitu nii-öelda usaldusvÀÀrset oraaklit, mis koguvad teavet asjaolude kohta vĂ€lismaailmas ja edastavad seda nutilepingutele spetsiaalsete meetodite kaudu. Ainus leping peab tĂ”eks selliseid andmeid, mida ta on saanud usaldusvÀÀrsetelt osapooltelt. Suurema usaldusvÀÀrsuse tagamiseks valitakse lihtsalt suurem rĂŒhm oraakleid ja minimeeritakse nende sĂŒĂŒdistamise risk. Leping vĂ”ib ignoreerida oraaklite andmeid, mis on vastuolus enamus teabega.

KĂ€esolev teema on pĂŒhendatud ĂŒhe online-kursuse loengule Blockchain — “Sissejuhatus tarkvaralepingutesse”.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster