Panduan Peristiwa dan Log di Kontrak Cerdas Ethereum

blog 1NewsPengembangEnterpriseBlockchain DijelaskanAcara dan KonferensiTekanBuletin

Berlangganan newsletter kami.

Alamat email

Kami menghormati privasi Anda

BerandaBlogPengembangan Blockchain

Panduan Peristiwa dan Log di Kontrak Cerdas Ethereum

Pengenalan teknis untuk menggunakan kasus untuk acara dan log di blockchain Ethereum dengan kode sampel oleh Joseph Chow 6 Juni 2016Diposting pada 6 Juni 2016

ConsenSys Signal panduan untuk acara dan log in ethereum smart contract hero

Acara dan log penting di Ethereum karena memfasilitasi komunikasi antara kontrak pintar dan antarmuka penggunanya. Dalam pengembangan web tradisional, respons server disediakan dalam panggilan balik ke frontend. Di Ethereum, ketika transaksi ditambang, kontrak pintar dapat mengeluarkan peristiwa dan menulis log ke blockchain yang kemudian dapat diproses oleh frontend. Ada berbagai cara untuk menangani peristiwa dan log. Pengenalan teknis ini akan menjelaskan beberapa sumber kebingungan terkait peristiwa dan beberapa kode contoh untuk bekerja dengannya.

Acara dapat membingungkan karena dapat digunakan dengan cara yang berbeda. Acara untuk satu orang mungkin tidak terlihat seperti acara untuk orang lain. Ada 3 kasus penggunaan utama untuk acara dan log:

  1. Nilai pengembalian kontrak pintar untuk antarmuka pengguna
  2. Pemicu asinkron dengan data
  3. Bentuk penyimpanan yang lebih murah

Terminologi antara peristiwa dan log adalah sumber kebingungan lain dan ini akan dijelaskan dalam kasus penggunaan ketiga.

1) Nilai Pengembalian Kontrak Cerdas untuk Antarmuka Pengguna

Penggunaan peristiwa yang paling sederhana adalah meneruskan nilai pengembalian dari kontrak ke frontend aplikasi. Sebagai ilustrasi, inilah masalahnya:

kontrak ExampleContract {// beberapa variabel status … function foo (int256 _value) return (int256) {// manipulate state … return _value; }} Bahasa kode: JavaScript (javascript)

Dengan asumsi exampleContract adalah turunan dari ExampleContract, frontend menggunakan web3.js, dapat memperoleh nilai hasil dengan menyimulasikan eksekusi kontrak:

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

Namun, ketika web3.js mengirimkan panggilan kontrak sebagai transaksi, itu tidak dapat memperoleh nilai kembali [1]:

var returnValue = exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}); console.log (returnValue) // transaksi hash Bahasa kode: JavaScript (javascript)

Nilai kembalian metode sendTransaction selalu merupakan hash dari transaksi yang dibuat. Transaksi tidak mengembalikan nilai kontrak ke frontend karena transaksi tidak segera ditambang dan disertakan dalam blockchain.

Solusi yang disarankan adalah menggunakan acara, dan ini adalah salah satu tujuan acara yang dimaksudkan.

kontrak ExampleContract {event ReturnValue (address indexed _from, int256 _value); function foo (int256 _value) return (int256) {ReturnValue (msg.sender, _value); return _value; }} Sebuah frontend kemudian bisa mendapatkan nilai yang dikembalikan: var exampleEvent = exampleContract.ReturnValue ({_ from: web3.eth.coinbase}); exampleEvent.watch (function (err, result) {if (err) {console.log (err) return;} console.log (result.args._value) // periksa apakah result.args._from adalah web3.eth.coinbase lalu // tampilkan result.args._value di UI dan panggil // exampleEvent.stopWatching ()}) exampleContract.foo.sendTransaction (2, {from: web3.eth.coinbase}) Bahasa kode: JavaScript (javascript)

Saat transaksi yang meminta foo ditambang, callback di dalam arloji akan dipicu. Ini secara efektif memungkinkan frontend untuk mendapatkan nilai kembali dari foo.

2) Pemicu Asinkron dengan Data

Nilai yang dikembalikan adalah kasus penggunaan minimal untuk peristiwa, dan peristiwa secara umum dapat dianggap sebagai pemicu asinkron dengan data. Ketika kontrak ingin memicu frontend, kontrak tersebut mengeluarkan peristiwa. Karena, frontend mengawasi acara, ia dapat mengambil tindakan, menampilkan pesan, dll. Contohnya disediakan di bagian selanjutnya (UI dapat diperbarui saat pengguna melakukan setoran.)

3) Bentuk Penyimpanan yang Lebih Murah

Kasus penggunaan ketiga sangat berbeda dari yang dicakup, dan menggunakan peristiwa sebagai bentuk penyimpanan yang jauh lebih murah. Di Ethereum Virtual Machine (EVM) dan Kertas Kuning Ethereum, peristiwa disebut sebagai log (ada opcode LOG). Ketika berbicara tentang penyimpanan, akan lebih akurat secara teknis untuk mengatakan bahwa data dapat disimpan dalam log, dibandingkan dengan data yang disimpan dalam acara. Namun, ketika kita naik level di atas protokol, lebih akurat untuk mengatakan bahwa kontrak mengeluarkan atau memicu peristiwa yang dapat bereaksi di frontend. Setiap kali suatu peristiwa dipancarkan, log yang sesuai akan ditulis ke blockchain. Terminologi antara peristiwa dan log adalah sumber kebingungan lain, karena konteksnya menentukan istilah mana yang lebih akurat.

Log dirancang untuk menjadi bentuk penyimpanan dengan biaya gas yang jauh lebih rendah daripada penyimpanan kontrak. Log pada dasarnya [2] biaya 8 gas per byte, sedangkan penyimpanan kontrak biaya 20.000 gas per 32 byte. Meskipun log menawarkan penghematan gas yang sangat besar, log tidak dapat diakses dari kontrak mana pun [3].

Namun demikian, ada kasus penggunaan untuk menggunakan log sebagai penyimpanan murah, bukan pemicu untuk frontend. Contoh yang cocok untuk log adalah menyimpan data historis yang dapat ditampilkan oleh frontend.

Pertukaran mata uang kripto mungkin ingin menunjukkan kepada pengguna semua setoran yang telah mereka lakukan di bursa. Alih-alih menyimpan detail setoran ini dalam kontrak, jauh lebih murah untuk menyimpannya sebagai log. Hal ini dimungkinkan karena pertukaran memerlukan keadaan saldo pengguna, yang disimpan dalam penyimpanan kontrak, tetapi tidak perlu mengetahui tentang detail riwayat simpanan.

kontrak CryptoExchange {event Deposit (uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time); function deposit (uint256 _amount, uint256 _market) return (int256) {// lakukan deposit, perbarui saldo pengguna, dll. Deposit (_market, msg.sender, _amount, now); } Bahasa kode: JavaScript (javascript)

Misalkan kita ingin memperbarui UI saat pengguna melakukan penyetoran. Berikut adalah contoh penggunaan event (Deposit) sebagai pemicu asynchronous dengan data (_market, msg.sender, _amount, now). Asumsikan cryptoExContract adalah turunan dari CryptoExchange:

var depositEvent = cryptoExContract.Deposit ({_ sender: userAddress}); depositEvent.watch (function (err, result) {if (err) {console.log (err) return;} // tambahkan detail result.args ke UI}) Bahasa kode: JavaScript (javascript)

Meningkatkan efisiensi mendapatkan semua peristiwa untuk pengguna adalah alasan mengapa parameter _sender ke acara diindeks: event Deposit (uint256 indexed _market, address indexed _sender, uint256 _amount, uint256 _time).

Secara default, mendengarkan kejadian hanya dimulai pada saat kejadian itu dibuat. Saat UI pertama kali dimuat, tidak ada setoran untuk ditambahkan. Jadi kami ingin mengambil peristiwa sejak blok 0 dan itu dilakukan dengan menambahkan parameter fromBlock ke acara tersebut.

var depositEventAll = cryptoExContract.Deposit ({_ sender: userAddress}, {fromBlock: 0, toBlock: ‘latest’}); depositEventAll.watch (function (err, result) {if (err) {console.log (err) return;} // tambahkan detail result.args ke UI}) Bahasa kode: JavaScript (javascript)

Saat UI dirender, depositEventAll.stopWatching () harus dipanggil.

Selain – Parameter yang diindeks

Hingga 3 parameter dapat diindeks. Misalnya, standar token yang diusulkan memiliki: Event Transfer (alamat diindeks _from, alamat diindeks _to, uint256 _value). Ini berarti bahwa frontend dapat secara efisien mengawasi transfer token yang:

  • dikirim oleh alamat tokenContract.Transfer ({_ from: senderAddress})
  • atau diterima oleh alamat tokenContract.Transfer ({_ to: receiverAddress})
  • atau dikirim melalui alamat ke alamat tertentu tokenContract.Transfer ({_ from: senderAddress, _to: receiverAddress})

Kesimpulan

Tiga kasus penggunaan telah disajikan untuk acara. Pertama, menggunakan peristiwa untuk mendapatkan nilai kembali dari fungsi kontrak yang dipanggil dengan sendTransaction (). Kedua, menggunakan peristiwa sebagai pemicu asinkron dengan data, yang bisa memberi tahu pengamat seperti UI. Ketiga, menggunakan acara untuk menulis log di blockchain sebagai bentuk penyimpanan yang lebih murah. Pendahuluan ini telah menunjukkan beberapa dari Lebah untuk bekerja dengan acara. Ada pendekatan lain untuk bekerja dengan acara, log, dan tanda terima dan topik ini dapat dibahas di artikel mendatang.

Terima kasih kepada Aaron Davis, Vincent Gariepy, dan Joseph Lubin atas umpan balik untuk artikel ini.

Referensi

[1] web3.js dapat melihat transaksi yang akan dimasukkan ke dalam blockchain, kemudian memutar ulang transaksi tersebut dalam instance EVM, untuk mendapatkan nilai pengembalian, tetapi ini adalah logika dalam jumlah yang signifikan untuk ditambahkan ke web3.js

[2] Ada biaya gas sebesar 375 untuk operasi LOG, dan 375 gas per topik, tetapi ketika banyak byte disimpan, biaya ini mewakili sebagian kecil dari total biaya penyimpanan.

[3] Bukti merkle untuk log dimungkinkan, jadi jika entitas eksternal memberikan kontrak dengan bukti seperti itu, kontrak dapat memverifikasi bahwa log benar-benar ada di dalam blockchain.

Ingin panduan pengembang langsung ke kotak masuk Anda?

Berlangganan buletin pengembang ConsenSys

Berlangganan buletin kami untuk berita Ethereum terbaru, solusi perusahaan, sumber daya pengembang, dan banyak lagi Alamat emailKonten EksklusifCara Membangun Produk Blockchain yang BerhasilWebinar

Cara Membangun Produk Blockchain yang Berhasil

Cara Mengatur dan Menjalankan Node EthereumWebinar

Cara Mengatur dan Menjalankan Node Ethereum

Cara Membangun API Ethereum Anda SendiriWebinar

Cara Membangun API Ethereum Anda Sendiri

Cara Membuat Token SosialWebinar

Cara Membuat Token Sosial

Menggunakan Alat Keamanan dalam Pengembangan Kontrak CerdasWebinar

Menggunakan Alat Keamanan dalam Pengembangan Kontrak Cerdas

Masa Depan Keuangan Aset Digital dan DeFiWebinar

Masa Depan Keuangan: Aset Digital dan DeFi

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me