solidity事件詳解

很多同學對Solidity 中的Event有疑問,這篇文章就來詳細的看看Solidity 中Event到底有什么用?

寫在前面
Solidity 是以太坊智能合約編程語言,閱讀本文前,你應該對以太坊、智能合約有所了解,如果你還不了解,建議你先看以太坊是什么,另外
本文在監聽合約事件是對上一篇Web3與智能合約交互實戰進行補充,如果閱讀了上一篇可以更好的理解本文。

什么是事件Evnet
事件是以太坊虛擬機(EVM)日志基礎設施提供的一個便利接口。當被發送事件(調用)時,會觸發參數存儲到交易的日志中(一種區塊鏈上的特殊數據結構)。這些日志與合約的地址關聯,并記錄到區塊鏈中.
來捋這個關系:區塊鏈是打包一系列交易的區塊組成的鏈條,每一個交易“收據”會包含0到多個日志記錄,日志代表著智能合約所觸發的事件。

在DAPP的應用中,如果監聽了某事件,當事件發生時,會進行回調。
不過要注意:日志和事件在合約內是無法被訪問的,即使是創建日志的合約。

在Solidity 代碼中,使用event 關鍵字來定義一個事件,如:

event EventName(address bidder, uint amount);
1
這個用法和定義函數式一樣的,并且事件在合約中同樣可以被繼承。觸發一個事件使用emit(說明,之前的版本里并不需要使用emit),如:

emit EventName(msg.sender, msg.value);
1
觸發事件可以在任何函數中調用,如:

function testEvent() public {

// 觸發一個事件emit EventName(msg.sender, msg.value); 

}
1
2
3
4
5
監聽事件
通過上面的介紹,可能大家還是不清楚事件有什么作用,如果你跟過Web3與智能合約交互實戰這篇文章,你會發現點擊”Updata Info”按鈕之后,雖然調用智能合約成功,但是當前的界面并沒有得到更新。
使用事件監聽,就可以很好的解決這個問題,讓看看如何實現。

修改合約,定義事件及觸發事件
先回顧一下合約代碼:

pragma solidity ^0.4.21;

contract InfoContract {

string fName;
uint age;

function setInfo(string _fName, uint _age) public {
fName = _fName;
age = _age;
}

function getInfo() public constant returns (string, uint) {
return (fName, age);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
首先,需要定義一個事件:

event Instructor(
string name,
uint age
);
1
2
3
4
這個事件中,會接受兩個參數:name 和 age , 也就是需要跟蹤的兩個信息。

然后,需要在setInfo函數中,觸發Instructor事件,如:

function setInfo(string _fName, uint _age) public {
fName = _fName;
age = _age;
emit Instructor(_fName, _age);
}
1
2
3
4
5
在Web3與智能合約交互實戰, 點擊”Updata Info”按鈕之后,會調用setInfo函數,函數時觸發Instructor事件。

使用Web3監聽事件,刷新UI
現在需要使用Web3監聽事件,刷新UI。
先回顧下之前的使用Web3和智能合約交互的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
現在可以不需要 info.getInfo()來獲取信息,而改用監聽事件獲取信息,先定義一個變量引用事件:

var instructorEvent = info.Instructor();
1
然后使用.watch()方法來添加一個回調函數:

instructorEvent.watch(function(error, result) {
if (!error)
{
$("#info").html(result.args.name + ' (' + result.args.age + ' years old)');
} else {
console.log(error);
}
});
1
2
3
4
5
6
7
8
代碼更新之后,可以在瀏覽器查看效果,這是點擊”Updata Info”按鈕之后,會及時更新界面,如圖:

完整的代碼請訂閱小專欄區塊鏈技術查看。

事件高級用法-過濾器
有時我們會有這樣的需求:獲取當前所有姓名及年齡記錄,或者是,要過濾出年齡28歲的記錄,應該如何做呢?
以及另外一個常見的場景:想要獲取到代幣合約中所有的轉賬記錄,也同樣需要使用事件過濾器功能,這部分內容請大家訂閱小專欄區塊鏈技術閱讀。

var instructorEvent = info.Instructor({}, {fromBlock: 0, toBlock: 'latest'});
1
或者是,要過濾出年齡28歲的記錄,可以這樣:
var instructorEvent = info.Instructor({ 'age': 28});
1
比如,我們要獲取到代幣合約中,所有的轉賬記錄, 就可以使用:
var transferEvent = token.Transfer({}, {fromBlock: 0, toBlock: 'latest'})
var transferEvent.watch(function(error, result){
// handle result.args.from result.args.to
});
1
2
3
4
-->
參考文章
https://coursetro.com/posts/code/100/Solidity-Events-Tutorial—Using-Web3.js-to-Listen-for-Smart-Contract-Events
https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events

? 深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。

? 我的知識星球為各位解答區塊鏈技術問題,歡迎加入討論。

? 關注公眾號“深入淺出區塊鏈技術”第一時間獲取區塊鏈技術信息

轉載于:https://www.cnblogs.com/xiaocongcong888/p/9613846.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279422.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

敏捷開發

敏捷開發是1990年逐漸引起人們廣泛關注的新型軟件開發方式,它是具有應對快速變化需求的軟件開發能力。相對于非敏捷開發,它是一種以客戶需求為核心,持續迭代,循序漸進的開發方式,敏捷絕非是一種特定的開發方式,而是一種…

MpAndroidChart源碼修改之餅狀圖添加標志線

由于項目需要,需要改MpandroidChart源碼,下面,先看下效果圖:效果圖效果很簡單,但是由于所選依賴庫沒提供相關方法,所以就需要重寫源碼了.這條紅色的標志線其實就是那個影廳的均值嘛,這條線看著是不是和圖表中的連接線很像呢,那把連接線稍加改造不就可以了嗎?下面,先看下此依賴…

數據同步云端本地_如何從云端刪除Windows 8的同步數據

數據同步云端本地The ability to sync data and settings between computers running Windows 8 is great, but it does mean that your information – possibly personal – is stored in the cloud. If you have changed your mind about syncing and want to remove your d…

前端roadmap

轉載于:https://www.cnblogs.com/cleverle/p/9615061.html

mysql 8+ 忘記root密碼 解決方案

在安裝完數據庫后,由于自己不小心直接關閉了安裝窗口,或者長時間沒有使用root用戶登錄系統,導致忘記了root密碼,這時就需要重置MySQL的root密碼。當然,最簡單方式自然是刪除數據庫的data目錄,然后重新安裝數…

安全領域應該關注的網站

http://www.freebuf.com/ https://www.seceye.cn/ https://zhuanlan.zhihu.com/c_118578260 https://www.easyaq.com/samesource/360.shtml http://bobao.360.cn/index/index https://www.sec-wiki.com/event

國內是否可以安裝alexa_Alexa可以聽到您無法聽到的命令,哪些黑客可以利用

國內是否可以安裝alexaYour smart speaker can hear sounds that humans can’t, meaning attackers could hypothetically trigger a command without you noticing. It’s happening in labs right now. 您的智能揚聲器可以聽到人類聽不到的聲音,這意味著攻擊者可…

為什么要使用React Hooks?(5分鐘實例)

前言 React Hooks在React v16.8正式穩定版中加入。 Hooks是什么? React Hooks 就是讓你不必寫class組件就可以用state和其他的React特性;你也可以編寫自己的hooks在不同的組件之間復用;最近很多人都在談論 React Hooks。當使用React類組件那么久&#x…

ActiveMQ在windows下啟動失敗解決方案

activemq.xml文件中的<transportConnectors><!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --><transportConnector name"openwire" uri"tcp://0.0.0.0:61616?maximumConnections1000&amp;wireForma…

jest忽略如何添加忽略_大多數人忽略的基本家庭維護任務

jest忽略如何添加忽略Owning a home requires a lot of responsibility, most notably regular maintenance to keep everything working great. However, there are a handful of very basic home maintenance tasks that you might be forgetting about. 擁有房屋需要承擔很多…

自定義常用input表單元素二:純css實現自定義radio單選按鈕

這是接著上一篇純css自定義復選框checkbox的第二篇&#xff0c;自定義一個radio單選按鈕&#xff0c;同樣&#xff0c;采用css偽類和“”css選擇器為思路&#xff0c;下面是預覽圖&#xff1a; 下面直入主題放代碼&#xff1a;HTML部分 <!--兩個name相同的radio--> <i…

Elasticsearch之kopf插件安裝之后的瀏覽詳解

比如&#xff0c;我的這里是http://192.168.80.200:9200/_plugin/kopf/ 1、cluster 2、nodes 3、rest 4、more 5、更多詳情&#xff0c;隨著深入&#xff0c;再貼寫分享&#xff01; 本文轉自大數據躺過的坑博客園博客&#xff0c;原文鏈接&#xff1a;http://www.cnblogs.com/…

郵件系統之webmail

courier-authlib 網址http://www.courier-mta.org/ flush privileges 命令本質上的作用是將當前user和privilige表中的用戶信息/權限設置從mysql庫(MySQL數據庫的內置庫)中提取到內存里 虛擬用戶&#xff1a;Maildir &#xff1a;/var/mailbox/Suexec apache ,httpdusergroupht…

如何將Microsoft Word文檔轉換為PDF

PDFs are handy for distributing documents so that they’re seen the same way by all parties. Typically, you’ll create documents using another app, and then convert them to PDF. Here’s how to do it for a Microsoft Word document. PDF易于分發文檔&#xff0c…

ASP.NET WebApi 基于JWT實現Token簽名認證

一、前言 開發提供數據的WebApi服務&#xff0c;最重要的是數據的安全性。那么對于我們來說&#xff0c;如何確保數據的安全將會是需要思考的問題。在ASP.NET WebService服務中可以通過SoapHead驗證機制來實現&#xff0c;那么在ASP.NET WebApi中我們應該如何保證我們的接口安全…

Cage驗證碼生成器快速上手

Cage小巧&#xff0c;好用。這里在官方基礎例子基礎上做了擴展&#xff1a; 12345678910111213141516171819202122232425262728293031323334package com.lavasoft.ntv.web.common; import com.github.cage.IGenerator; import java.util.Random; /*** 驗證碼生成器 * * author …

馬云:未來無工可打,人工智能發展紅利還在10年以后

馬云雖然已經退出阿里巴巴&#xff0c;但作為一代商業傳奇他所說的話&#xff0c;還十分據有影響力。關于人工智能&#xff0c;馬云提出過不少預測性言論。未來10年&#xff0c;房子、車子都不在值錢。面對人工智能時代&#xff0c;未來傳統行業大部分會消失。更有厲害的&#…

如何更改您的iPhone鈴聲

The problem with having a popular phone like an iPhone is that, by default, everyone has the same ringtone. If you want to give your iPhone a more personal sound, here’s how to do it. 擁有像iPhone這樣的流行手機的問題是&#xff0c;默認情況下&#xff0c;每個…

【ACM-ICPC 2018 沈陽賽區網絡預賽 I】Lattice's basics in digital electronics

【鏈接】 我是鏈接,點我呀:) 【題意】 【題解】 每個單詞的前綴都不同。 不能更明示了... 裸的字典樹。 模擬一下。輸出一下就ojbk了。 【代碼】 #include <bits/stdc.h> #define LL long long #define rep1(i,a,b) for (int i a;i < b;i) #define rep2(i,a,b) for…

扒一扒那些年我們遇到的奇葩代碼

前言 本文首發于公眾號【一名打字員】 在工作中&#xff0c;我們通常會遇到傳說中的“祖傳”代碼&#xff0c;有些是否讓我們感到哭笑不得&#xff0c;今天本猿整理一下自己以及網絡上出現過的奇葩代碼。來源于互聯網的均會標明出處。 TOP1 當仁不讓的當然是傳說中的“睡排序”…