Vodič za događaje i zapisnike u pametnim ugovorima Ethereum

blog 1NewsDevelopersEnterpriseBlockchain ObjašnjeniDogađaji i konferencijePressBilteni

Pretplatite se na naše obavijesti.

Email adresa

Poštujemo vašu privatnost

Razvoj HomeBlogBlockchaina

Vodič za događaje i zapisnike u pametnim ugovorima Ethereum

Tehnički uvod za primjere slučajeva za događaje i zapisnike na Ethereum blockchainu s uzorkom koda, Joseph Chow, 6. lipnja 2016. Objavljeno 6. lipnja 2016.

ConsenSys Signal vodič za događaje i zapise u ethereum heroju pametnih ugovora

Događaji i zapisnici važni su u Ethereumu jer olakšavaju komunikaciju između pametnih ugovora i njihovih korisničkih sučelja. U tradicionalnom web razvoju, odgovor poslužitelja pruža se u povratnom pozivu na sučelju. U Ethereumu, kada se transakcija minira, pametni ugovori mogu emitirati događaje i upisivati ​​zapisnike u blockchain koje sučelje može zatim obraditi. Postoje različiti načini rješavanja događaja i dnevnika. Ovaj tehnički uvod objasnit će neke izvore zabune u vezi s događajima i neke primjere koda za rad s njima.

Događaji mogu biti zbunjujući jer se mogu koristiti na različite načine. Događaj za jednog možda neće izgledati kao događaj za drugog. Postoje 3 glavna slučaja upotrebe događaja i dnevnika:

  1. Vrijednosti povratka pametnog ugovora za korisničko sučelje
  2. Asinkroni okidači s podacima
  3. Jeftiniji oblik skladištenja

Terminologija između događaja i dnevnika drugi je izvor zabune i to će biti objašnjeno u trećem slučaju upotrebe.

1) Vrijednosti povrata pametnog ugovora za korisničko sučelje

Najjednostavnija upotreba događaja je prosljeđivanje povratnih vrijednosti iz ugovora na sučelje aplikacije. Ilustracije radi, evo problema:

ugovor ExampleContract {// neke varijable stanja … funkcija foo (int256 _value) vraća (int256) {// manipuliraj state … return _value; }} Jezik koda: JavaScript (javascript)

Pod pretpostavkom da je exampleContract instanca ExampleContract, frontend koji koristi web3.js, može dobiti povratnu vrijednost simuliranjem izvršenja ugovora:

var returnValue = exampleContract.foo.call (2); console.log (returnValue) // 2 Jezik koda: JavaScript (javascript)

Međutim, kada web3.js preda ugovor kao transakciju, ne može dobiti povratnu vrijednost [1]:


var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); console.log (returnValue) // jezik hashCode transakcije: JavaScript (javascript)

Povratna vrijednost metode sendTransaction uvijek je hash transakcije koja je stvorena. Transakcije ne vraćaju vrijednost ugovora na sučelje jer se transakcije ne miniraju odmah i ne uključuju u blockchain.

Preporučeno rješenje je korištenje događaja, a to je jedna od namjeravanih svrha događaja.

ugovor ExampleContract {event ReturnValue (adresa indeksirana _od, int256 _value); funkcija foo (int256 _value) vraća (int256) {ReturnValue (msg.sender, _value); return _value; }} Interfend tada može dobiti povratnu vrijednost: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // provjeri je li result.args._from web3.eth.coinbase zatim // prikažemo result.args._value u korisničkom sučelju i pozovimo // exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}) Jezik koda: JavaScript (javascript)

Kada se minira transakcija koja poziva foo, aktivirat će se povratni poziv unutar sata. To učinkovito omogućuje frontendu dobivanje povratnih vrijednosti od foo.

2) Asinkroni okidači s podacima

Povratne vrijednosti minimalni su slučaj upotrebe događaja, a događaji se općenito mogu smatrati asinkronim okidačima s podacima. Kada ugovor želi pokrenuti sučelje, ugovor emitira događaj. Kao što i prednji dio promatra događaje, može poduzimati radnje, prikazivati ​​poruku itd. Primjer toga nalazi se u sljedećem odjeljku (korisničko sučelje može se ažurirati kada korisnik izvrši polog.)

3) Jeftiniji oblik skladištenja

Treći slučaj upotrebe prilično se razlikuje od onoga što je pokriveno, a to je korištenje događaja kao znatno jeftiniji oblik pohrane. U virtualnom stroju Ethereum (EVM) i Ethereum žuti papir, događaji se nazivaju zapisnicima (postoje LOG opcode-ovi). Kada govorimo o pohrani, tehnički bi bilo točnije reći da se podaci mogu pohraniti u zapisnike, za razliku od podataka koji se pohranjuju u događajima. Međutim, kada prijeđemo razinu iznad protokola, točnije je reći da ugovori emitiraju ili pokreću događaje na koje sučelje može reagirati. Kad god se događaj emitira, odgovarajući dnevnici zapisuju se u blockchain. Terminologija između događaja i dnevnika drugi je izvor zabune, jer kontekst nalaže koji je pojam točniji.

Trupci su dizajnirani da budu oblik skladištenja koji košta znatno manje plina od ugovornog skladištenja. Trupci u osnovi [2] koštaju 8 plina po bajtu, dok ugovorno skladištenje košta 20 000 plina po 32 bajta. Iako trupci nude velike uštede plina, trupcima nisu dostupni ni iz jednog ugovora [3].

Ipak, postoje slučajevi upotrebe dnevnika kao jeftine pohrane, umjesto okidača za frontend. Prikladan primjer za zapisnike je pohranjivanje povijesnih podataka koje frontend može prikazati.

Mjenjačnica kriptovaluta možda će korisniku htjeti pokazati sve depozite koje je izvršio na burzi. Umjesto da ove detalje o depozitu pohranite u ugovoru, mnogo je jeftinije pohraniti ih kao zapisnike. To je moguće jer je na burzi potrebno stanje korisnikova stanja koje pohranjuje u ugovornu pohranu, ali ne mora znati o detaljima povijesnih depozita.

ugovor CryptoExchange {depozit događaja (uint256 indeksiran _market, indeksirana adresa _sender, uint256 _amount, uint256 _time); depozit funkcije (uint256 _amount, uint256 _market) vraća (int256) {// izvršiti depozit, ažurirati stanje korisnika itd. Depozit (_market, msg.sender, _amount, now); } Jezik koda: JavaScript (javascript)

Pretpostavimo da želimo ažurirati korisničko sučelje dok korisnik vrši depozite. Evo primjera upotrebe događaja (Depozit) kao asinkronog okidača s podacima (_market, msg.sender, _amount, now). Pretpostavimo da je cryptoExContract primjer CryptoExchange-a:

var depositEvent = cryptoExContract.Deposit ({_ sender: userAddress}); depositEvent.watch (funkcija (pogreška, rezultat) {if (pogreška) {console.log (pogreška) return;} // dodavanje detalja rezultata.args u korisničko sučelje}) Jezik koda: JavaScript (javascript)

Poboljšanje učinkovitosti dobivanja svih događaja za korisnika razlog je zašto se parametar _sender događaja indeksira: depozit događaja (uint256 indeksiran _market, adresa indeksirana _sender, uint256 _amount, uint256 _time).

Prema zadanim postavkama, preslušavanje događaja započinje tek u trenutku kada je događaj instanciran. Kada se korisničko sučelje prvi put učitava, nema pologa za dodavanje. Dakle, želimo dohvatiti događaje od bloka 0, a to se događa dodavanjem parametra fromBlock događaju.

var depositEventAll = cryptoExContract.Deposit ({_ sender: userAddress}, {fromBlock: 0, toBlock: ‘latest’}); depositEventAll.watch (funkcija (pogreška, rezultat) {if (pogreška) {console.log (pogreška) return;} // dodavanje detalja rezultata.args u korisničko sučelje}) Jezik koda: JavaScript (javascript)

Kada se pruži korisničko sučelje treba pozvati depositEventAll.stopWatching ().

Na stranu – indeksirani parametri

Mogu se indeksirati do 3 parametra. Na primjer, predloženi standard tokena ima: Prijenos događaja (adresa indeksirana _od, adresa indeksirana _to, uint256 _value). To znači da sučelje može učinkovito promatrati prijenose tokena koji su:

  • poslano adresom tokenContract.Transfer ({_ from: senderAddress})
  • ili primljeno adresom tokenContract.Transfer ({_ to: receiverAddress})
  • ili poslana adresom na određenu adresu tokenContract.Transfer ({_ from: senderAddress, _to: receiverAddress})

Zaključak

Tri događaja su predstavljena za događaje. Prvo, upotrebom događaja za jednostavno dobivanje povratne vrijednosti iz funkcije ugovora koja se poziva s sendTransaction (). Drugo, upotreba događaja kao asinkronog okidača s podacima, koji može obavijestiti promatrača kao što je korisničko sučelje. Treće, korištenje događaja za pisanje dnevnika u blockchain kao jeftiniji oblik pohrane. Ovaj je uvod pokazao neke od Apis za rad s događajima. Tamo su drugi pristupi radu s događajima, zapisnicima i priznanicama, a ove teme mogu biti obrađene u budućim člancima.

Zahvaljujemo Aaronu Davisu, Vincentu Gariepyju i Josephu Lubinu na povratnim informacijama o ovom članku.

Reference

[1] web3.js mogao je paziti da transakcija bude uključena u blockchain, zatim ponovno reproducirati transakciju u instanci EVM-a, kako bi dobio povratnu vrijednost, ali ovo je značajna količina logike koju treba dodati web3.js [2] Postoje troškovi plina od 375 za LOG operaciju i 375 plina po temi, ali kada se pohranjuje mnogo bajtova, ti troškovi predstavljaju beznačajan udio u ukupnim troškovima skladišta. [3] Mogući su Merkleovi dokazi za zapisnike, pa ako vanjski entitet dostavi ugovor s takvim dokazom, ugovorom se može potvrditi da zapisnik stvarno postoji unutar blockchaina.

Želite vodiče za programere izravno u pristiglu poštu?

Pretplatite se na bilten ConsenSysovog programera

Newsletter Pretplatite se na naš newsletter za najnovije vijesti o Ethereumu, rješenja za poduzeća, resurse za programere i još mnogo toga. Adresa e-pošte Ekskluzivni sadržajKako izraditi uspješan blockchain proizvodWebinar

Kako izraditi uspješan blockchain proizvod

Kako postaviti i pokrenuti Ethereum čvorWebinar

Kako postaviti i pokrenuti Ethereum čvor

Kako izraditi vlastiti Ethereum APIWebinar

Kako izraditi vlastiti Ethereum API

Kako stvoriti društveni žetonWebinar

Kako stvoriti društveni žeton

Korištenje sigurnosnih alata u razvoju pametnih ugovoraWebinar

Korištenje sigurnosnih alata u razvoju pametnih ugovora

Budućnost financija Digitalna imovina i DeFiWebinar

Budućnost financija: digitalna imovina 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