日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

solidity事件详解

發(fā)布時間:2023/12/9 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 solidity事件详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

什么是事件Evnet
事件是以太坊虛擬機(jī)(EVM)日志基礎(chǔ)設(shè)施提供的一個便利接口。當(dāng)被發(fā)送事件(調(diào)用)時,會觸發(fā)參數(shù)存儲到交易的日志中(一種區(qū)塊鏈上的特殊數(shù)據(jù)結(jié)構(gòu))。這些日志與合約的地址關(guān)聯(lián),并記錄到區(qū)塊鏈中.
來捋這個關(guān)系:區(qū)塊鏈?zhǔn)谴虬幌盗薪灰椎膮^(qū)塊組成的鏈條,每一個交易“收據(jù)”會包含0到多個日志記錄,日志代表著智能合約所觸發(fā)的事件。

在DAPP的應(yīng)用中,如果監(jiān)聽了某事件,當(dāng)事件發(fā)生時,會進(jìn)行回調(diào)。
不過要注意:日志和事件在合約內(nèi)是無法被訪問的,即使是創(chuàng)建日志的合約。

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

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

emit EventName(msg.sender, msg.value);
1
觸發(fā)事件可以在任何函數(shù)中調(diào)用,如:

function testEvent() public {

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

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

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

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
這個事件中,會接受兩個參數(shù):name 和 age , 也就是需要跟蹤的兩個信息。

然后,需要在setInfo函數(shù)中,觸發(fā)Instructor事件,如:

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

使用Web3監(jiān)聽事件,刷新UI
現(xiàn)在需要使用Web3監(jiān)聽事件,刷新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
現(xiàn)在可以不需要 info.getInfo()來獲取信息,而改用監(jiān)聽事件獲取信息,先定義一個變量引用事件:

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

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
代碼更新之后,可以在瀏覽器查看效果,這是點(diǎn)擊”Updata Info”按鈕之后,會及時更新界面,如圖:

完整的代碼請訂閱小專欄區(qū)塊鏈技術(shù)查看。

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

var instructorEvent = info.Instructor({}, {fromBlock: 0, toBlock: 'latest'});
1
或者是,要過濾出年齡28歲的記錄,可以這樣:
var instructorEvent = info.Instructor({ 'age': 28});
1
比如,我們要獲取到代幣合約中,所有的轉(zhuǎn)賬記錄, 就可以使用:
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

? 深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。

? 我的知識星球?yàn)楦魑唤獯饏^(qū)塊鏈技術(shù)問題,歡迎加入討論。

? 關(guān)注公眾號“深入淺出區(qū)塊鏈技術(shù)”第一時間獲取區(qū)塊鏈技術(shù)信息

轉(zhuǎn)載于:https://www.cnblogs.com/xiaocongcong888/p/9613846.html

總結(jié)

以上是生活随笔為你收集整理的solidity事件详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。