Introducere în contractele inteligente

În acest articol, ne vom uita la ce sunt contractele inteligente, ce sunt acestea, ne vom familiariza cu diferite platforme de contracte inteligente, caracteristicile acestora și, de asemenea, vom discuta despre modul în care funcționează și ce avantaje pot aduce. Acest material va fi foarte util pentru cititorii care nu sunt bine familiarizați cu tema contractelor inteligente, dar doresc să se apropie de înțelegerea acesteia.

Contract obișnuit vs. contract inteligent

Înainte de a ne aprofunda în detalii, să luăm un exemplu de diferențe dintre un contract obișnuit, care este specificat pe hârtie, și un contract inteligent, care este reprezentat digital.

Introducere în contractele inteligente

Cum a funcționat acest lucru înainte de apariția contractelor inteligente? Imaginați-vă un grup de oameni care doresc să stabilească anumite reguli și condiții pentru distribuirea valorilor, precum și un anumit mecanism care să garanteze implementarea acestei distribuții conform regulilor și condițiilor date. Apoi se adunau, întocmeau o hârtie pe care își notau detaliile de identificare, termenii, valorile implicate, le datau și le semnau. Acest contract a fost certificat și de o parte de încredere, cum ar fi un notar. Mai departe, acești oameni au mers în direcții diferite cu copia lor pe hârtie a unui astfel de contract și au început să efectueze unele acțiuni care ar putea să nu corespundă contractului în sine, adică au făcut un lucru, dar pe hârtie s-a certificat că ar trebui să facă ceva. complet diferit. Și cum să ieșim din această situație? De fapt, unul dintre membrii grupului trebuie să ia această hârtie, să ia niște dovezi, să o ducă în instanță și să realizeze conformitatea între contract și acțiunile reale. Destul de des, este dificil să se realizeze implementarea corectă a acestui contract, ceea ce duce la consecințe neplăcute.

Ce se poate spune despre contractele inteligente? Acestea combină atât posibilitatea de a scrie termenii contractului, cât și mecanismul de implementare strictă a acestora. Dacă au fost stabilite condițiile și tranzacția sau cererea corespunzătoare a fost semnată, atunci odată ce cererea sau tranzacția respectivă a fost acceptată, nu mai este posibilă modificarea condițiilor sau afectarea implementării acestora.

Există un validator sau o întreagă rețea, precum și o bază de date care stochează toate contractele inteligente care au fost depuse spre execuție în ordine cronologică strictă. De asemenea, este important ca această bază de date să conțină toate condițiile de declanșare pentru executarea contractului inteligent. În plus, trebuie să țină cont de însăși valoarea a cărei distribuție este descrisă în contract. Dacă acest lucru se aplică unei anumite monede digitale, atunci această bază de date ar trebui să o ia în considerare.

Cu alte cuvinte, validatorii de contracte inteligente trebuie să aibă acces la toate datele pe care operează contractul inteligent. De exemplu, o singură bază de date ar trebui utilizată pentru a contabiliza simultan monedele digitale, soldurile utilizatorilor, tranzacțiile utilizatorilor și marcajele de timp. Apoi, într-un contract inteligent, condiția poate fi soldul utilizatorului într-o anumită monedă, sosirea unui anumit timp sau faptul că a fost efectuată o anumită tranzacție, dar nimic mai mult.

Definiția unui contract inteligent

În general, terminologia în sine a fost inventată de cercetătorul Nick Szabo și utilizată pentru prima dată în 1994 și a fost documentată în 1997 într-un articol care descrie însăși ideea de contracte inteligente.

Contractele inteligente presupun că se realizează o anumită automatizare a distribuției valorii, care poate depinde doar de acele condiții care sunt predeterminate în prealabil. În forma sa cea mai simplă, arată ca un contract cu termeni strict definiți, care este semnat de anumite părți.

Contractele inteligente sunt concepute pentru a minimiza încrederea în terți. Uneori, centrul decizional de care depinde totul este complet exclus. În plus, astfel de contracte sunt mai ușor de auditat. Aceasta este o consecință a unor caracteristici de proiectare ale unui astfel de sistem, dar cel mai adesea înțelegem printr-un contract inteligent un mediu descentralizat și prezența unor funcții care permit oricui să analizeze baza de date și să efectueze un audit complet al executării contractelor. Acest lucru asigură protecția împotriva modificărilor retroactive ale datelor care ar implica modificări în executarea contractului în sine. Digitalizarea majorității proceselor la crearea și lansarea unui contract inteligent simplifică adesea tehnologia și costul implementării acestora.

Un exemplu simplu - serviciul de escrow

Să ne uităm la un exemplu foarte simplu. Vă va ajuta să vă apropiați de înțelegerea funcționalității contractelor inteligente, precum și de a înțelege mai bine în ce cazuri ar trebui utilizate.

Introducere în contractele inteligente

Poate fi implementat și folosind Bitcoin, deși în acest moment Bitcoin încă nu poate fi numit o platformă cu drepturi depline pentru contracte inteligente. Deci, avem un cumpărător și avem un magazin online. Un client dorește să cumpere un monitor din acest magazin. În cel mai simplu caz, cumpărătorul completează și trimite o plată, iar magazinul online o acceptă, o confirmă și apoi expediază mărfurile. Cu toate acestea, în această situație este nevoie de mare încredere - cumpărătorul trebuie să aibă încredere în magazinul online pentru întregul cost al monitorului. Deoarece un magazin online poate avea o reputație scăzută în ochii cumpărătorului, există riscul ca din anumite motive, după acceptarea plății, magazinul să refuze serviciul și să nu trimită bunurile cumpărătorului. Prin urmare, cumpărătorul pune întrebarea (și, în consecință, magazinul online pune această întrebare) ce poate fi aplicat în acest caz pentru a minimiza astfel de riscuri și a face astfel de tranzacții mai fiabile.

În cazul Bitcoin, este posibil să se permită cumpărătorului și vânzătorului să selecteze independent un mediator. Există mulți oameni care sunt implicați în rezolvarea problemelor controversate. Și participanții noștri pot alege dintr-o listă generală de mediatori pe cel în care vor avea încredere. Împreună creează o adresă cu mai multe semnături 2 din 3, unde există trei chei și sunt necesare două semnături cu oricare două chei pentru a cheltui monede de la acea adresă. O cheie va aparține cumpărătorului, a doua magazinului online, iar a treia mediatorului. Iar la o astfel de adresă cu mai multe semnături cumpărătorul va trimite suma necesară pentru a plăti monitorul. Acum, când vânzătorul vede că banii sunt blocați de ceva timp la o adresă cu mai multe semnături care depinde de el, poate trimite în siguranță monitorul prin poștă.

În continuare, cumpărătorul primește coletul, inspectează bunurile și ia o decizie cu privire la achiziția finală. El poate fi complet de acord cu serviciul oferit și semnează tranzacția cu cheia sa, unde transferă monede de la adresa cu multisemnătură către vânzător, sau poate fi nemulțumit de ceva. În al doilea caz, el contactează un mediator pentru a pune la punct o tranzacție alternativă care va distribui acele monede în mod diferit.

Sa zicem ca monitorul a ajuns putin zgariat si kit-ul nu includea un cablu pentru conectarea la computer, desi site-ul magazinului online spunea ca cablul ar trebui inclus in kit. Apoi, cumpărătorul adună dovezile necesare pentru a dovedi mediatorului că a fost înșelat în această situație: face capturi de ecran ale site-ului, face o fotografie a chitanței de corespondență, face o fotografie a zgârieturilor de pe monitor și arată că sigiliul a fost rupt și cablul a fost scos. Magazinul online, la rândul său, își adună dovezile și le transferă mediatorului.

Mediatorul este interesat să satisfacă simultan atât indignarea cumpărătorului, cât și interesele magazinului online (va deveni clar de ce mai târziu). Constituie o tranzacție în care monedele de la o adresă cu mai multe semnături vor fi cheltuite într-o oarecare proporție între cumpărător, magazinul online și mediator, întrucât acesta își ia o porție drept recompensă pentru munca sa. Să presupunem că 90% din suma totală merge către vânzător, 5% către mediator și 5% compensație către cumpărător. Mediatorul semnează această tranzacție cu cheia sa, dar nu poate fi încă aplicată, deoarece necesită două semnături, dar o singură merită. Transmite o astfel de tranzacție atât cumpărătorului, cât și vânzătorului. Dacă cel puțin unul dintre ei este mulțumit de această opțiune de redistribuire a monedelor, atunci tranzacția va fi presemnată și distribuită în rețea. Pentru a o valida, este suficient ca una dintre părțile la tranzacție să fie de acord cu opțiunea mediatorului.

Este important să alegeți inițial un mediator, astfel încât ambii participanți să aibă încredere în el. În acest caz, el va acționa independent de interesele unuia sau celuilalt și va evalua în mod obiectiv situația. În cazul în care mediatorul nu oferă o opțiune de distribuire a monedelor care să satisfacă cel puțin un participant, atunci, după ce au convenit împreună, atât cumpărătorul, cât și magazinul online pot trimite monedele la o nouă adresă cu mai multe semnături punând cele două semnături ale acestora. Noua adresă cu semnături multiple va fi compilată cu un alt mediator, care poate fi mai competent în materie și poate oferi o opțiune mai bună.

Exemplu cu un cămin și un frigider

Să ne uităm la un exemplu mai complex care afișează mai explicit capacitățile unui contract inteligent.

Introducere în contractele inteligente

Să presupunem că sunt trei tipi care s-au mutat recent în aceeași cameră de cămin. Cei trei sunt interesați să cumpere un frigider pentru camera lor pe care să îl poată folosi împreună. Unul dintre ei s-a oferit voluntar să încaseze suma necesară pentru a cumpăra un frigider și a negocia cu vânzătorul. Cu toate acestea, s-au cunoscut de curând și nu există suficientă încredere între ei. Evident, doi dintre ei își asumă un risc dând bani celui de-al treilea. În plus, trebuie să ajungă la un acord în alegerea unui vânzător.

Aceștia pot folosi serviciul de escrow, adică să aleagă un mediator care va monitoriza execuția tranzacției și va rezolva probleme controversate dacă apar. Apoi, după ce au fost de acord, ei întocmesc un contract inteligent și prescriu anumite condiții în acesta.

Prima condiție este ca înainte de un anumit timp, să zicem într-o săptămână, contul de smart contract corespunzător să primească trei plăți de la anumite adrese pentru o anumită sumă. Dacă acest lucru nu se întâmplă, contractul inteligent se oprește și returnează monedele tuturor participanților. Dacă condiția este îndeplinită, atunci sunt stabilite valorile identificatorilor vânzătorului și mediatorului și se verifică condiția ca toți participanții să fie de acord cu alegerea vânzătorului și a mediatorului. Când toate condițiile sunt îndeplinite, atunci fondurile vor fi transferate la adresele specificate. Această abordare poate proteja participanții de fraudă din orice parte și, în general, elimină nevoia de a avea încredere.

Vedem în acest exemplu chiar principiul că această capacitate de a seta pas cu pas parametrii pentru îndeplinirea fiecărei condiții vă permite să creați sisteme de orice complexitate și profunzime de niveluri imbricate. În plus, puteți defini mai întâi prima condiție în contractul inteligent și abia după îndeplinirea acesteia puteți seta parametrii pentru următoarea condiție. Cu alte cuvinte, condiția este scrisă formal, iar parametrii pentru aceasta pot fi setați deja în timpul funcționării sale.

Clasificarea contractelor inteligente

Pentru clasificare, puteți seta diferite grupuri de criterii. Cu toate acestea, în momentul dezvoltării tehnologiei, patru dintre ele sunt relevante.

Contractele inteligente se pot distinge prin mediul lor de execuție, care poate fi fie centralizat, fie descentralizat. În cazul descentralizării, avem o independență mult mai mare și toleranță la greșeală atunci când executăm contracte inteligente.

Ele se pot distinge și prin procesul de stabilire și îndeplinire a condițiilor: pot fi liber programabile, limitate sau predefinite, adică strict tastate. Când există doar 4 contracte inteligente specifice pe platforma de contracte inteligente, parametrii pentru acestea pot fi setați în orice mod. În consecință, setarea lor este mult mai simplă: selectăm un contract din listă și trecem parametrii.

Conform metodei de inițiere, există contracte inteligente automatizate, adică atunci când apar anumite condiții, acestea se autoexecută, și există contracte în care sunt specificate condițiile, dar platforma nu verifică automat îndeplinirea acestora; pentru aceasta ei trebuie inițiat separat.

În plus, contractele inteligente variază în ceea ce privește nivelul lor de confidențialitate. Ele pot fi complet deschise, parțial sau complet confidențiale. Aceasta din urmă înseamnă că observatorii terți nu văd termenii contractelor inteligente. Cu toate acestea, subiectul confidențialității este foarte larg și este mai bine să îl luați în considerare separat de articolul actual.

Mai jos vom arunca o privire mai atentă asupra primelor trei criterii pentru a aduce mai multă claritate înțelegerii subiectului curent.

Contracte inteligente în funcție de timpul de execuție

Introducere în contractele inteligente

Pe baza mediului de execuție, se face o distincție între platformele de smart contract centralizate și descentralizate. În cazul contractelor digitale centralizate, se utilizează un singur serviciu, unde există un singur validator și poate exista un serviciu de backup și recuperare, care este, de asemenea, gestionat central. Există o bază de date care stochează toate informațiile necesare pentru a seta termenii contractului inteligent și a distribui valoarea care este luată în considerare chiar în această bază de date de servicii. Un astfel de serviciu centralizat are un client care stabilește condiții cu anumite solicitări și folosește astfel de contracte. Datorită naturii centralizate a platformei, mecanismele de autentificare pot fi mai puțin sigure decât în ​​criptomonede.

Ca exemplu, putem lua furnizorii de comunicații mobile (diferiți operatori de telefonie mobilă). Să presupunem că un anumit operator ține o evidență centralizată a traficului pe serverele sale, care poate fi transmisă în diferite formate, de exemplu: sub formă de apeluri vocale, transmisie SMS, trafic pe internet mobil și conform diferitelor standarde și, de asemenea, ține evidențe. de fonduri pe soldurile utilizatorilor. În consecință, furnizorul de comunicații mobile poate întocmi contracte de contabilizare a serviciilor prestate și plata acestora cu diferite condiții. În acest caz, este ușor să setați condiții precum „trimiteți un SMS cu așa și cutare cod la un astfel de număr și veți primi așa și așa condiții pentru distribuirea traficului”.

Un alt exemplu poate fi dat: bănci tradiționale cu funcționalitate extinsă de internet banking și contracte foarte simple, cum ar fi plăți regulate, conversie automată a plăților primite, deducere automată a dobânzii într-un anumit cont etc.

Dacă vorbim de contracte inteligente cu un mediu de execuție descentralizat, atunci avem un grup de validatori. În mod ideal, oricine poate deveni validator. Datorită protocolului de sincronizare a bazei de date și a ajunge la un consens, avem o bază de date comună care va stoca acum toate tranzacțiile cu contracte strict descrise, și nu niște interogări condiționate, ale căror formate se schimbă adesea și nu există nicio specificație deschisă. Aici, tranzacțiile vor conține instrucțiuni de executare a contractului conform unei specificații stricte. Această specificație este deschisă și, prin urmare, utilizatorii platformei înșiși pot audita și valida contractele inteligente. Aici vedem că platformele descentralizate sunt superioare celor centralizate în ceea ce privește independența și toleranța la erori, dar proiectarea și întreținerea lor sunt mult mai complexe.

Contracte inteligente prin metoda stabilirii și îndeplinirii condițiilor

Acum să aruncăm o privire mai atentă asupra modului în care contractele inteligente pot diferi în modul în care stabilesc și îndeplinesc condițiile. Aici ne îndreptăm atenția către contractele inteligente care sunt programabile aleatoriu și Turing complet. Un contract inteligent complet Turing vă permite să setați aproape orice algoritm ca condiții pentru executarea contractului: cicluri de scriere, unele funcții pentru calcularea probabilităților și altele asemenea - până la propriii algoritmi de semnătură electronică. În acest caz, ne referim la scrierea cu adevărat arbitrară a logicii.

Există și contracte inteligente arbitrare, dar nu și cele complete Turing. Aceasta include Bitcoin și Litecoin cu propriul script. Aceasta înseamnă că poți folosi doar anumite operații în orice ordine, dar nu mai poți scrie bucle și proprii algoritmi.

În plus, există platforme de contracte inteligente care implementează contracte inteligente predefinite. Acestea includ Bitshares și Steemit. Bitshares are o serie de contracte inteligente pentru tranzacționare, gestionarea contului, gestionarea platformei în sine și a parametrilor acesteia. Steemit este o platformă similară, dar nu se mai concentrează pe emiterea de token-uri și tranzacționare, precum Bitshares, ci pe blogging, adică stochează și procesează conținut într-o manieră descentralizată.

Contractele arbitrare Turing-complete includ platforma Ethereum și RootStock, care este încă în curs de dezvoltare. Prin urmare, mai jos ne vom opri puțin mai detaliat asupra platformei de contracte inteligente Ethereum.

Contracte inteligente prin metoda de inițiere

Pe baza metodei de inițiere, contractele inteligente pot fi, de asemenea, împărțite în cel puțin două grupe: automate și manuale (nu automatizate). Cele automate se caracterizează prin faptul că, având în vedere toți parametrii și condițiile cunoscuți, contractul inteligent se execută complet automat, adică nu necesită trimiterea unor tranzacții suplimentare și cheltuirea unui comision suplimentar pentru fiecare execuție ulterioară. Platforma în sine are toate datele pentru a calcula modul în care se va finaliza contractul inteligent. Logica acolo nu este arbitrară, ci predeterminată și toate acestea sunt previzibile. Adică, puteți estima în avans complexitatea executării unui contract inteligent, puteți utiliza un fel de comision constant pentru acesta și toate procesele pentru implementarea lui sunt mai eficiente.

Pentru contractele inteligente care sunt programate liber, execuția nu este automatizată. Pentru a iniția un astfel de contract inteligent, practic la fiecare pas trebuie să creați o nouă tranzacție, care va apela următoarea etapă de execuție sau următoarea metodă de contract inteligent, să plătiți comisionul corespunzător și să așteptați confirmarea tranzacției. Execuția se poate finaliza cu succes sau nu, deoarece codul smart contract este arbitrar și pot apărea unele momente imprevizibile, precum o buclă eternă, lipsa unor parametri și argumente, excepții negestionate etc.

Conturi Ethereum

Tipuri de conturi Ethereum

Să ne uităm la ce tipuri de conturi pot exista pe platforma Ethereum. Există doar două tipuri de conturi aici și nu există alte opțiuni. Primul tip se numește cont de utilizator, al doilea este un cont contractual. Să ne dăm seama cum diferă.

Contul de utilizator este controlat doar de cheia personală a semnăturii electronice. Proprietarul contului își generează propria pereche de chei pentru semnătura electronică folosind algoritmul ECDSA (Elliptic Curve Digital Signature Algorithm). Numai tranzacțiile semnate cu această cheie pot schimba starea acestui cont.

O logică separată este furnizată pentru contul de contract inteligent. Poate fi controlat doar de un cod software predefinit care determină complet comportamentul contractului inteligent: cum își va gestiona monedele în anumite circumstanțe, la inițiativa căruia utilizatorul și în ce condiții suplimentare vor fi distribuite aceste monede. Dacă unele puncte nu sunt prevăzute de dezvoltatori în codul programului, pot apărea probleme. De exemplu, un contract inteligent poate primi o anumită stare în care nu acceptă inițierea execuției ulterioare de la niciunul dintre utilizatori. În acest caz, monedele vor fi efectiv înghețate, deoarece contractul inteligent nu prevede ieșirea din această stare.

Cum sunt create conturile pe Ethereum

În cazul unui cont de utilizator, proprietarul generează independent o pereche de chei folosind ECDSA. Este important de menționat că Ethereum folosește exact același algoritm și exact aceeași curbă eliptică pentru semnăturile electronice ca Bitcoin, dar adresa este calculată într-un mod ușor diferit. Aici nu se mai folosește rezultatul double hashing, ca în Bitcoin, dar single hashing este prevăzut cu funcția Keccak la o lungime de 256 de biți. Cei mai puțin semnificativi biți sunt tăiați din valoarea rezultată, și anume cei mai puțin semnificativi 160 de biți ai valorii hash de ieșire. Drept urmare, obținem o adresă în Ethereum. De fapt, ocupă 20 de octeți.

Vă rugăm să rețineți că identificatorul de cont în Ethereum este codificat în hex fără a aplica o sumă de control, spre deosebire de Bitcoin și multe alte sisteme, unde adresa este codificată într-un sistem de numere de bază 58 cu adăugarea unei sume de control. Aceasta înseamnă că trebuie să fiți atenți atunci când lucrați cu identificatorii de cont în Ethereum: chiar și o greșeală în identificator va duce garantat la pierderea monedelor.

Există o caracteristică importantă și este că un cont de utilizator la nivel general de bază de date este creat în momentul în care acesta acceptă prima plată primită.

Crearea unui cont de contract inteligent are o abordare complet diferită. Inițial, unul dintre utilizatori scrie codul sursă al contractului inteligent, după care codul este trecut printr-un compilator special pentru platforma Ethereum, obținând bytecode pentru propria mașină virtuală Ethereum. Bytecode rezultat este plasat într-un câmp special al tranzacției. Este certificat în numele contului inițiatorului. În continuare, această tranzacție este propagată în întreaga rețea și plasează codul de contract inteligent. Comisionul pentru tranzacție și, în consecință, pentru executarea contractului este retras din soldul contului inițiatorului.

Fiecare contract inteligent conține în mod necesar propriul său constructor (al acestui contract). Poate fi gol sau poate avea conținut. După ce constructorul este executat, se creează un identificator de cont de contract inteligent, folosind care puteți trimite monede, puteți apela anumite metode de contract inteligent etc.

Structura tranzacției Ethereum

Pentru a fi mai clar, vom începe să analizăm structura unei tranzacții Ethereum și un exemplu de cod de contract inteligent.

Introducere în contractele inteligente

O tranzacție Ethereum constă din mai multe câmpuri. Primul dintre acestea, nonce, este un anumit număr de serie al tranzacției relativ la contul însuși care o distribuie și este autorul acesteia. Acest lucru este necesar pentru a distinge tranzacțiile duble, adică pentru a exclude cazul în care aceeași tranzacție este acceptată de două ori. Prin utilizarea unui identificator, fiecare tranzacție are o valoare hash unică.

Urmează un câmp ca prețul gazelor. Acesta indică prețul la care moneda de bază Ethereum este convertită în gaz, care este folosit pentru a plăti pentru executarea contractului inteligent și alocarea resursei mașinii virtuale. Ce înseamnă?

În Bitcoin, taxele sunt plătite direct de moneda de bază - Bitcoin însuși. Acest lucru este posibil datorită unui mecanism simplu de calculare a acestora: plătim strict pentru cantitatea de date conținută în tranzacție. În Ethereum situația este mai complicată, pentru că este foarte greu să te bazezi pe volumul datelor tranzacțiilor. Aici, tranzacția poate conține, de asemenea, cod de program care va fi executat pe mașina virtuală, iar fiecare operație a mașinii virtuale poate avea o complexitate diferită. Există și operații care alocă memorie pentru variabile. Vor avea propria lor complexitate, de care va depinde plata fiecărei operațiuni.

Costul fiecărei operațiuni în echivalent gaz va fi constant. Este introdus special pentru a determina costul constant al fiecărei operațiuni. În funcție de sarcina din rețea, prețul gazului se va modifica, adică coeficientul conform căruia moneda de bază va fi convertită în această unitate auxiliară pentru a plăti comisionul.

Mai există o caracteristică a unei tranzacții în Ethereum: bytecode-ul pe care îl conține pentru a fi executat într-o mașină virtuală va fi executat până când se finalizează cu un anumit rezultat (succes sau eșec) sau până când o anumită cantitate de monede alocate se epuizează pentru a plăti comisionul. . Pentru a evita o situație în care, în cazul unei erori, toate monedele din contul expeditorului au fost cheltuite pe comision (de exemplu, un fel de ciclu etern început într-o mașină virtuală), există următorul câmp - porniți gaz (numită adesea limită de gaz) - determină cantitatea maximă de monede pe care expeditorul este dispus să o cheltuiască pentru a finaliza o anumită tranzacție.

Următorul câmp este numit adresa de destinație. Aceasta include adresa destinatarului monedelor sau adresa unui anumit contract inteligent ale cărui metode vor fi apelate. După ce vine câmpul valoare, unde se introduce cantitatea de monede care sunt trimise la adresa de destinație.

Urmează un domeniu interesant numit de date, unde se potrivește întreaga structură. Acesta nu este un câmp separat, ci o structură întreagă în care este definit codul pentru mașina virtuală. Puteți plasa date arbitrare aici - există reguli separate pentru aceasta.

Și ultimul câmp se numește semnătură. Conține simultan atât semnătura electronică a autorului acestei tranzacții, cât și cheia publică cu care va fi verificată această semnătură. Din cheia publică puteți obține identificatorul de cont al expeditorului acestei tranzacții, adică identificați în mod unic contul expeditorului în sistemul propriu-zis. Am aflat principalul lucru despre structura tranzacției.

Exemplu de cod de contract inteligent pentru Solidity

Să aruncăm acum o privire mai atentă la cel mai simplu contract inteligent folosind un exemplu.

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

Mai sus este un cod sursă simplificat care poate păstra monedele utilizatorilor și le poate returna la cerere.

Deci, există un smart contract Bank care îndeplinește următoarele funcții: acumulează monede pe soldul său, adică atunci când o tranzacție este confirmată și este plasat un astfel de smart contract, se creează un nou cont care poate conține monede în soldul său; își amintește utilizatorii și distribuția monedelor între aceștia; are mai multe metode de gestionare a soldurilor, adică este posibilă completarea, retragerea și verificarea soldului utilizatorului.

Să trecem prin fiecare linie de cod sursă. Acest contract are câmpuri constante. Unul dintre ei, cu adresă tip, se numește proprietar. Aici contractul își amintește adresa utilizatorului care a creat acest contract inteligent. În plus, există o structură dinamică care menține corespondența între adresele și soldurile utilizatorilor.

Aceasta este urmată de metoda Bank - are același nume ca și contractul. În consecință, acesta este constructorul său. Aici variabilei proprietar i se atribuie adresa persoanei care a plasat acest contract inteligent în rețea. Acesta este singurul lucru care se întâmplă în acest constructor. Adică msg în acest caz este exact datele care au fost transferate pe mașina virtuală împreună cu tranzacția care conține întregul cod al acestui contract. În consecință, msg.sender este autorul acestei tranzacții care găzduiește acest cod. El va fi proprietarul contractului inteligent.

Metoda de depunere vă permite să transferați un anumit număr de monede în contul contractului prin tranzacție. În acest caz, contractul inteligent, primind aceste monede, le lasă în bilanţ, dar înregistrează în structura soldurilor cine a fost exact expeditorul acestor monede pentru a şti cui aparţin.

Următoarea metodă se numește retrage și este nevoie de un singur parametru - cantitatea de monede pe care cineva dorește să o retragă de la această bancă. Aceasta verifică dacă există suficiente monede în soldul utilizatorului care apelează această metodă pentru a le trimite. Dacă sunt suficiente, atunci contractul inteligent în sine returnează acel număr de monede apelantului.

Urmează metoda de verificare a soldului curent al utilizatorului. Cine apelează la această metodă va fi folosit pentru a recupera acest sold în contractul inteligent. Este de remarcat faptul că modificatorul acestei metode este vizualizarea. Aceasta înseamnă că metoda în sine nu schimbă în niciun fel variabilele clasei sale și este de fapt doar o metodă de citire. Nu este creată nicio tranzacție separată pentru a apela această metodă, nu se plătește nicio taxă și toate calculele sunt efectuate local, după care utilizatorul primește rezultatul.

Metoda kill este necesară pentru a distruge starea contractului inteligent. Și aici există o verificare suplimentară dacă apelantul acestei metode este proprietarul acestui contract. Dacă da, atunci contractul se autodistruge, iar funcția de distrugere ia un parametru - identificatorul de cont către care contractul va trimite toate monedele rămase în soldul său. În acest caz, monedele rămase vor merge automat la adresa titularului contractului.

Cum funcționează un nod complet în rețeaua Ethereum?

Să privim schematic cum sunt executate astfel de contracte inteligente pe platforma Ethereum și cum funcționează un nod complet de rețea.

Introducere în contractele inteligente

Un nod complet din rețeaua Ethereum trebuie să aibă cel puțin patru module.
Primul, ca și pentru orice protocol descentralizat, este modulul de rețea P2P - un modul pentru conexiunea la rețea și lucrul cu alte noduri, unde sunt schimbate blocuri, tranzacții și informații despre alte noduri. Aceasta este o componentă tradițională pentru toate criptomonedele descentralizate.

În continuare, avem un modul pentru stocarea datelor blockchain, procesarea, alegerea unei ramuri prioritare, adăugarea blocurilor, deconectarea blocurilor, validarea acestor blocuri etc.

Al treilea modul se numește EVM (Ethereum virtual machine) - aceasta este o mașină virtuală care primește bytecode din tranzacțiile Ethereum. Acest modul preia starea curentă a unui anumit cont și face modificări în starea acestuia pe baza bytecode-ului primit. Versiunea mașinii virtuale de pe fiecare nod de rețea trebuie să fie aceeași. Calculele care au loc pe fiecare nod Ethereum sunt exact aceleași, dar apar într-o manieră asincronă: cineva verifică și acceptă această tranzacție mai devreme, adică execută tot codul conținut în ea, iar cineva mai târziu. În consecință, atunci când se creează o tranzacție, aceasta este distribuită în rețea, nodurile o acceptă, iar în momentul verificării, la fel în care se execută Bitcoin Script în Bitcoin, aici se execută bytecode-ul mașinii virtuale.

O tranzacție este considerată verificată dacă tot codul conținut în ea a fost executat, a fost generată și salvată o nouă stare a unui anumit cont până când este clar dacă această tranzacție a fost aplicată sau nu. Dacă tranzacția este aplicată, atunci această stare este considerată nu numai finalizată, ci și actuală. Există o bază de date care stochează starea fiecărui cont pentru fiecare nod de rețea. Datorită faptului că toate calculele au loc în același mod și starea blockchain-ului este aceeași, baza de date care conține stările tuturor conturilor va fi și ea aceeași pentru fiecare nod.

Mituri și limitări ale contractelor inteligente

În ceea ce privește restricțiile care există pentru platformele de contracte inteligente similare cu Ethereum, pot fi citate următoarele:

  • executarea codului;
  • aloca memorie;
  • date blockchain;
  • trimite plăți;
  • crearea unui nou contract;
  • apelati la alte contracte.

Să ne uităm la restricțiile care sunt impuse unei mașini virtuale și, în consecință, să risipim unele mituri despre contractele inteligente. Pe o mașină virtuală, care poate fi nu numai în Ethereum, ci și în platforme similare, puteți efectua operații logice cu adevărat arbitrare, adică scrieți cod și va fi executat acolo, puteți aloca suplimentar memorie. Cu toate acestea, taxa se plătește separat pentru fiecare operațiune și pentru fiecare unitate suplimentară de memorie alocată.

În continuare, mașina virtuală poate citi date din baza de date blockchain pentru a utiliza aceste date ca declanșator pentru a executa una sau alta logica de contract inteligent. Mașina virtuală poate crea și trimite tranzacții, poate crea noi contracte și metode de apelare a altor contracte inteligente care sunt deja publicate în rețea: existente, disponibile etc.

Cel mai des întâlnit mit este că contractele inteligente Ethereum pot folosi informații din orice resursă de internet în termenii lor. Adevărul este că o mașină virtuală nu poate trimite o solicitare de rețea către o resursă externă de informații de pe Internet, adică este imposibil să scrii un contract inteligent care să distribuie valoare între utilizatori în funcție, să zicem, de cum este vremea afară, sau cine a câștigat vreun campionat, sau în funcție de ce alt incident s-a întâmplat în lumea exterioară, pentru că informațiile despre aceste incidente pur și simplu nu se află în baza de date a platformei în sine. Adică, nu există nimic în blockchain despre asta. Dacă nu apare acolo, atunci mașina virtuală nu poate folosi aceste date ca declanșatori.

Dezavantajele lui Ethereum

Să le enumerăm pe cele principale. Primul dezavantaj este că există unele dificultăți în proiectarea, dezvoltarea și testarea contractelor inteligente în Ethereum (Ethereum folosește limbajul Solidity pentru a scrie contracte inteligente). Într-adevăr, practica arată că un procent foarte mare din toate erorile aparțin factorului uman. Acest lucru este valabil pentru contractele inteligente Ethereum deja scrise, care au o complexitate medie sau mai mare. Dacă pentru contractele inteligente simple probabilitatea unei erori este mică, atunci în contractele inteligente complexe apar foarte des erori care duc la furtul de fonduri, înghețarea acestora, distrugerea contractelor inteligente într-un mod neașteptat etc. Multe astfel de cazuri sunt deja cunoscut.

Al doilea dezavantaj este că mașina virtuală în sine nu este perfectă, deoarece este scrisă și de oameni. Poate executa comenzi arbitrare și aici constă vulnerabilitatea: o serie de comenzi pot fi configurate într-un anumit mod care vor duce la consecințe neprevăzute în prealabil. Aceasta este o zonă foarte complexă, dar există deja mai multe studii care arată că aceste vulnerabilități există în versiunea actuală a rețelei Ethereum și pot duce la eșecul multor contracte inteligente.

O altă mare dificultate, poate fi considerată un dezavantaj. Constă în faptul că, practic sau tehnic, poți ajunge la concluzia că, dacă compilați bytecode-ul unui contract care va fi executat pe o mașină virtuală, puteți determina o anumită ordine a operațiunilor. Când sunt efectuate împreună, aceste operațiuni vor încărca foarte mult mașina virtuală și o vor încetini în mod disproporționat față de taxa care a fost plătită pentru efectuarea acestor operațiuni.

În trecut, a existat deja o perioadă în dezvoltarea lui Ethereum, când mulți tipi care au înțeles în detaliu funcționarea unei mașini virtuale au găsit astfel de vulnerabilități. De fapt, tranzacțiile plăteau o taxă foarte mică, dar practic au încetinit întreaga rețea. Aceste probleme sunt foarte greu de rezolvat, deoarece este necesar, în primul rând, să le determine, în al doilea rând, să ajustați prețul pentru efectuarea acestor operațiuni și, în al treilea rând, să efectuați un hard fork, ceea ce înseamnă actualizarea tuturor nodurilor de rețea la o versiune nouă. a software-ului și apoi activarea simultană a acestor modificări.

În ceea ce privește Ethereum, s-au făcut multe cercetări, s-a acumulat multă experiență practică: atât pozitive, cât și negative, dar cu toate acestea rămân dificultăți și vulnerabilități care mai trebuie rezolvate cumva.

Deci, partea tematică a articolului este finalizată, să trecem la întrebările care apar destul de des.

FAQ

— Dacă toate părțile la un contract inteligent existent doresc să modifice termenii, pot anula acest contract inteligent folosind multisig și apoi pot crea un nou contract inteligent cu termenii actualizați de execuție?

Răspunsul aici va fi dublu. De ce? Pentru că, pe de o parte, un contract inteligent este definit o singură dată și nu mai presupune nicio modificare, iar pe de altă parte, poate avea o logică pre-scrisă care prevede modificarea totală sau parțială a unor condiții. Adică, dacă vrei să schimbi ceva în contractul tău inteligent, atunci trebuie să prescrii condițiile în care poți actualiza aceste condiții. În consecință, doar într-o manieră atât de prudentă poate fi organizată reînnoirea contractului. Dar și aici puteți avea probleme: faceți o greșeală și obțineți o vulnerabilitate corespunzătoare. Prin urmare, astfel de lucruri trebuie să fie foarte detaliate și atent proiectate și testate.

— Ce se întâmplă dacă mediatorul încheie un acord cu una dintre părțile participante: escrow sau smart contract? Este necesar un mediator într-un contract inteligent?

Un mediator nu este necesar într-un contract inteligent. S-ar putea să nu existe. Dacă, în cazul escrow, mediatorul intră într-o conspirație cu una dintre părți, atunci da, această schemă își pierde brusc toată valoarea. Prin urmare, mediatorii sunt selectați în așa fel încât să aibă încredere în ei de către toate părțile implicate în acest proces în același timp. În consecință, pur și simplu nu veți transfera monede la o adresă cu mai multe semnături cu un mediator în care nu aveți încredere.

— Este posibil cu o singură tranzacție Ethereum să transferați mai multe jetoane diferite de la adresa dvs. la adrese țintă diferite, de exemplu, adrese de schimb unde aceste jetoane sunt tranzacționate?

Aceasta este o întrebare bună și se referă la modelul tranzacției Ethereum și la modul în care acesta diferă de modelul Bitcoin. Iar diferența este radicală. Dacă în modelul de tranzacție Ethereum pur și simplu transferi monede, atunci acestea sunt transferate doar de la o adresă la alta, fără schimbare, doar suma specifică pe care ai specificat-o. Cu alte cuvinte, acesta nu este un model de ieșiri necheltuite (UTXO), ci un model de conturi și solduri corespunzătoare. Teoretic, este posibil să trimiteți mai multe jetoane diferite într-o singură tranzacție deodată dacă scrieți un contract inteligent și viclean, dar va trebui totuși să faceți multe tranzacții, să creați un contract, apoi să transferați jetoane și monede la acesta și apoi să apelați metoda corespunzătoare. . Acest lucru necesită efort și timp, așa că, în practică, nu funcționează așa și toate plățile în Ethereum se fac în tranzacții separate.

— Unul dintre miturile despre platforma Ethereum este că este imposibil să descrii condiții care vor depinde de datele unei resurse externe de internet, așa că ce să faci atunci?

Soluția este că contractul inteligent în sine poate oferi unul sau mai multe așa-zise oracole de încredere, care colectează date despre starea lucrurilor din lumea exterioară și le transmit contractelor inteligente prin metode speciale. Contractul în sine consideră că datele pe care le-a primit de la părți de încredere sunt adevărate. Pentru o mai mare fiabilitate, alegeți pur și simplu un grup mare de oracole și minimizați riscul coliziunii lor. Contractul în sine nu poate ține cont de date din oracole care contrazic majoritatea.

Una dintre prelegerile cursului online despre Blockchain este dedicată acestui subiect - „Introducere în contractele inteligente".

Sursa: www.habr.com

Adauga un comentariu