Un ghid pentru evenimente și jurnale în contractele inteligente Ethereum

blogul 1NewsDevelopersEnterpriseBlockchain Explained Evenimente și conferințe ApăsațiBuletine informative

Aboneaza-te la newsletter-ul nostru.

Adresa de email

Vă respectăm confidențialitatea

AcasăBlogDezvoltare blockchain

Un ghid pentru evenimente și jurnale în contractele inteligente Ethereum

O introducere tehnică pentru utilizarea cazurilor pentru evenimente și jurnale pe blockchain-ul Ethereum cu eșantion de cod de Joseph Chow 6 iunie 2016 Publicat pe 6 iunie 2016

ConsenSys Signal un ghid pentru evenimente și loguri în eroul contractelor inteligente ethereum

Evenimentele și jurnalele sunt importante în Ethereum, deoarece facilitează comunicarea între contractele inteligente și interfețele lor de utilizator. În dezvoltarea web tradițională, un răspuns server este furnizat într-un apel invers către frontend. În Ethereum, atunci când o tranzacție este minată, contractele inteligente pot emite evenimente și pot scrie jurnale pe blockchain pe care frontendul le poate procesa apoi. Există diferite moduri de a aborda evenimentele și jurnalele. Această introducere tehnică va explica unele surse de confuzie cu privire la evenimente și câteva exemple de cod pentru lucrul cu acestea.

Evenimentele pot fi confuze, deoarece pot fi utilizate în moduri diferite. Un eveniment pentru unul poate să nu arate ca un eveniment pentru altul. Există 3 cazuri de utilizare principale pentru evenimente și jurnale:

  1. Valori de returnare a contractului inteligent pentru interfața cu utilizatorul
  2. Declanșatoare asincrone cu date
  3. O formă de stocare mai ieftină

Terminologia dintre evenimente și jurnale este o altă sursă de confuzie și acest lucru va fi explicat în al treilea caz de utilizare.

1) Valori de returnare a contractului inteligent pentru interfața cu utilizatorul

Cea mai simplă utilizare a unui eveniment este de a transmite valorile returnate de la contracte la frontend-ul unei aplicații. Pentru a ilustra, iată problema:

contract ExempluContract {// unele variabile de stare … funcția foo (int256 _value) returnează (int256) {// manipulează starea … returnează _value; }} Limba codului: JavaScript (javascript)

Presupunând exampleContract este o instanță a ExampleContract, un frontend care folosește web3.js, poate obține o valoare returnată prin simularea executării contractului:

var ReturnValue = exampleContract.foo.call (2); console.log (returnValue) // 2 Limbajul codului: JavaScript (javascript)

Cu toate acestea, atunci când web3.js trimite apelul contractual ca tranzacție, acesta nu poate obține valoarea returnată [1]:


var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); console.log (returnValue) // tranzacție hash Limbaj cod: JavaScript (javascript)

Valoarea returnată a unei metode sendTransaction este întotdeauna hash-ul tranzacției create. Tranzacțiile nu returnează o valoare a contractului pe frontend, deoarece tranzacțiile nu sunt extrase imediat și incluse în blockchain.

Soluția recomandată este utilizarea unui eveniment și acesta este unul dintre scopurile destinate evenimentelor.

contract ExampleContract {eveniment ReturnValue (adresa indexată _din, int256 _value); funcția foo (int256 _value) returnează (int256) {ReturnValue (msg.sender, _value); valoare returnată; }} Un frontend poate obține apoi valoarea returnată: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // verificați dacă result.args._from este web3.eth.coinbase apoi // afișează result.args._value în interfața de utilizare și apelează // exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}) Limbajul codului: JavaScript (javascript)

Când tranzacția care invocă foo este extrasă, va fi declanșată apelarea din interiorul ceasului. Acest lucru permite frontendului să obțină valori de returnare de la foo.

2) Declanșatoare asincrone cu date

Valorile returnate sunt un caz de utilizare minim pentru evenimente, iar evenimentele pot fi considerate, în general, ca declanșatoare asincrone cu date. Când un contract dorește să declanșeze frontend-ul, contractul emite un eveniment. Deoarece frontendul urmărește evenimentele, poate face acțiuni, afișa un mesaj etc. Un exemplu în acest sens este furnizat în secțiunea următoare (o interfață de utilizare poate fi actualizată atunci când un utilizator face o depunere).

3) O formă de stocare mai ieftină

Al treilea caz de utilizare este destul de diferit de ceea ce a fost acoperit și care folosește evenimentele ca o formă de stocare semnificativ mai ieftină. În mașina virtuală Ethereum (EVM) și Cartea galbenă Ethereum, evenimentele sunt denumite jurnale (există coduri de opțiuni LOG). Când vorbim de stocare, ar fi din punct de vedere tehnic mai exact să spunem că datele pot fi stocate în jurnale, spre deosebire de datele stocate în evenimente. Cu toate acestea, atunci când mergem la un nivel peste protocol, este mai exact să spunem că contractele emit sau declanșează evenimente la care frontendul poate reacționa. Ori de câte ori este emis un eveniment, jurnalele corespunzătoare sunt scrise în blockchain. Terminologia dintre evenimente și jurnale este o altă sursă de confuzie, deoarece contextul dictează ce termen este mai precis.

Jurnalele au fost concepute pentru a fi o formă de depozitare care costă mult mai puțin gaz decât depozitarea contractuală. Jurnalele practic [2] costă 8 gaze pe octet, în timp ce stocarea contractului costă 20.000 de gaze pe 32 de octeți. Deși buștenii oferă economii enorme de gaz, buștenii nu sunt accesibile din niciun contract [3].

Cu toate acestea, există cazuri de utilizare pentru utilizarea jurnalelor ca stocare ieftină, în loc de declanșatoare pentru frontend. Un exemplu potrivit pentru jurnale este stocarea datelor istorice care pot fi redate de frontend.

Un schimb de criptomonede poate dori să arate unui utilizator toate depozitele pe care le-au efectuat pe bursă. În loc să stochezi aceste detalii de depozit într-un contract, este mult mai ieftin să le stochezi ca jurnale. Acest lucru este posibil, deoarece un schimb necesită starea soldului unui utilizator, pe care îl stochează în stocul contractual, dar nu trebuie să știe despre detaliile depozitelor istorice.

contract CryptoExchange {Event Deposit (uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time); function deposit (uint256 _amount, uint256 _market) returnează (int256) {// efectuați depunerea, actualizați soldul utilizatorului, etc. Depuneți (_market, msg.sender, _amount, acum); } Limba codului: JavaScript (javascript)

Să presupunem că dorim să actualizăm o interfață de utilizare în timp ce utilizatorul face depozite. Iată un exemplu de utilizare a unui eveniment (Depunere) ca declanșator asincron cu date (_market, msg.sender, _amount, now). Să presupunem că cryptoExContract este o instanță a CryptoExchange:

var depositEvent = cryptoExContract.Deposit ({_ expeditor: userAddress}); depositEvent.watch (function (err, result) {if (err) {console.log (err) return;} // adaugă detaliile result.args la UI}) Limbajul codului: JavaScript (javascript)

Îmbunătățirea eficienței obținerii tuturor evenimentelor pentru un utilizator este motivul pentru care parametrul _sender al evenimentului este indexat: Event Deposit (uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time).

În mod implicit, ascultarea evenimentelor începe doar în momentul în care evenimentul este instanțiat. Când se încarcă prima dată interfața de utilizare, nu există depozite la care să se atașeze. Deci, vrem să recuperăm evenimentele de la blocul 0 și asta se face prin adăugarea unui parametru fromBlock la eveniment.

var depositEventAll = cryptoExContract.Deposit ({_ expeditor: userAddress}, {fromBlock: 0, toBlock: ‘latest’}); depositEventAll.watch (function (err, result) {if (err) {console.log (err) return;} // adaugă detaliile result.args la UI}) Limbajul codului: JavaScript (javascript)

Când interfața de utilizare este redată, trebuie chemat depositEventAll.stopWatching ().

În afară – Parametrii indexați

Pot fi indexați până la 3 parametri. De exemplu, un standard de jeton propus are: eveniment Transfer (adresă indexată _de la, adresă indexată _to, uint256 _valor). Aceasta înseamnă că un frontend poate urmări în mod eficient doar transferurile de jetoane care sunt:

  • trimis de o adresă tokenContract.Transfer ({_ de la: senderAddress})
  • sau primit printr-o adresă tokenContract.Transfer ({_ către: receiverAddress})
  • sau trimis printr-o adresă la o anumită adresă tokenContract.Transfer ({_ de la: senderAddress, _to: receiverAddress})

Concluzie

Au fost prezentate trei cazuri de utilizare pentru evenimente. În primul rând, utilizarea unui eveniment pentru a obține pur și simplu o valoare de returnare dintr-o funcție contract invocată cu sendTransaction (). În al doilea rând, folosind un eveniment ca declanșator asincron cu date, care poate notifica un observator, cum ar fi o interfață de utilizare. În al treilea rând, utilizarea unui eveniment pentru a scrie jurnale în blockchain ca o formă de stocare mai ieftină. Această introducere a arătat unele dintre API-uri pentru lucrul cu evenimente. Sunt alte abordări pentru a lucra cu evenimente, jurnale și chitanțe, iar aceste subiecte pot fi tratate în articolele viitoare.

Mulțumim lui Aaron Davis, Vincent Gariepy și Joseph Lubin pentru feedback despre acest articol.

Referințe

[1] web3.js ar putea urmări ca tranzacția să fie inclusă în blockchain, apoi să redea tranzacția într-o instanță a EVM, pentru a obține valoarea returnată, dar aceasta este o cantitate semnificativă de logică de adăugat la web3.js [2] Există costuri de gaz de 375 pentru o operațiune LOG și 375 de gaz pe subiect, dar atunci când sunt stocați mai mulți octeți, aceste costuri reprezintă o fracțiune nesemnificativă din costul total al stocării. [3] Sunt posibile dovezi Merkle pentru jurnale, deci dacă o entitate externă furnizează un contract cu o astfel de dovadă, un contract poate verifica dacă jurnalul există de fapt în interiorul blockchain-ului.

Vrei ghiduri pentru dezvoltatori direct în căsuța de e-mail?

Abonați-vă la buletinul informativ pentru dezvoltatori ConsenSys

Newsletter Abonați-vă la newsletter-ul nostru pentru cele mai recente știri Ethereum, soluții pentru întreprinderi, resurse pentru dezvoltatori și multe altele. Adresa de e-mail Conținut exclusivCum să construiți un produs Blockchain de succesWebinar

Cum să construiți un produs Blockchain de succes

Cum se configurează și se execută un nod EthereumWebinar

Cum se configurează și se execută un nod Ethereum

Cum să vă construiți propriul API EthereumWebinar

Cum să vă construiți propriul API Ethereum

Cum să creați un simbol socialWebinar

Cum să creați un simbol social

Utilizarea instrumentelor de securitate în dezvoltarea contractelor inteligenteWebinar

Utilizarea instrumentelor de securitate în dezvoltarea contractelor inteligente

Viitorul activelor digitale și al DeFi-ului financiarWebinar

Viitorul finanțelor: active digitale și DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
Adblock
detector
map