成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

詳解Solidity事件Event - 完全搞懂事件的使用

dabai / 3059人閱讀

摘要:什么是事件事件是以太坊虛擬機(jī)日志基礎(chǔ)設(shè)施提供的一個(gè)便利接口。在的應(yīng)用中,如果監(jiān)聽(tīng)了某事件,當(dāng)事件發(fā)生時(shí),會(huì)進(jìn)行回調(diào)。不過(guò)要注意日志和事件在合約內(nèi)是無(wú)法被訪問(wèn)的,即使是創(chuàng)建日志的合約。使用監(jiān)聽(tīng)事件,刷新現(xiàn)在需要使用監(jiān)聽(tīng)事件,刷新。

本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:搞懂 Solidity 事件 Event - 如何在 DApp 中使用原文已更新,請(qǐng)讀者前往原文閱讀

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

寫(xiě)在前面

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

什么是事件Evnet

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

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

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

event EventName(address bidder, uint amount); 

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

emit EventName(msg.sender, msg.value); 

觸發(fā)事件可以在任何函數(shù)中調(diào)用,如:

function testEvent() public {

    // 觸發(fā)一個(gè)事件
     emit EventName(msg.sender, msg.value); 
}
監(jiān)聽(tīng)事件

通過(guò)上面的介紹,可能大家還是不清楚事件有什么作用,如果你跟過(guò)Web3與智能合約交互實(shí)戰(zhàn)這篇文章,你會(huì)發(fā)現(xiàn)點(diǎn)擊"Updata Info"按鈕之后,雖然調(diào)用智能合約成功,但是當(dāng)前的界面并沒(méi)有得到更新。
使用事件監(jiān)聽(tīng),就可以很好的解決這個(gè)問(wè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);
   }   
}

首先,需要定義一個(gè)事件:

 event Instructor(
       string name,
       uint age
    );

這個(gè)事件中,會(huì)接受兩個(gè)參數(shù):name 和 age , 也就是需要跟蹤的兩個(gè)信息。

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

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

在Web3與智能合約交互實(shí)戰(zhàn), 點(diǎn)擊"Updata Info"按鈕之后,會(huì)調(diào)用setInfo函數(shù),函數(shù)時(shí)觸發(fā)Instructor事件。

使用Web3監(jiān)聽(tīng)事件,刷新UI

現(xiàn)在需要使用Web3監(jiān)聽(tīng)事件,刷新UI。
先回顧下之前的使用Web3和智能合約交互的代碼:


現(xiàn)在可以不需要 info.getInfo()來(lái)獲取信息,而改用監(jiān)聽(tīng)事件獲取信息,先定義一個(gè)變量引用事件:

var instructorEvent = info.Instructor();

然后使用.watch()方法來(lái)添加一個(gè)回調(diào)函數(shù):

instructorEvent.watch(function(error, result) {
        if (!error)
            {
                $("#info").html(result.args.name + " (" + result.args.age + " years old)");
            } else {
                console.log(error);
            }
    });

代碼更新之后,可以在瀏覽器查看效果,這是點(diǎn)擊"Updata Info"按鈕之后,會(huì)及時(shí)更新界面,如圖:

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

事件高級(jí)用法-過(guò)濾器

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

參考文章

https://coursetro.com/posts/c...
https://github.com/ethereum/w...

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

? 我的知識(shí)星球為各位解答區(qū)塊鏈技術(shù)問(wèn)題,歡迎加入討論。

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/24097.html

相關(guān)文章

  • 智能合約最佳實(shí)踐之Solidity編碼規(guī)范

    摘要:命名規(guī)范避免使用小寫(xiě)的,大寫(xiě)的,大寫(xiě)的應(yīng)該避免在命名中單獨(dú)出現(xiàn),因?yàn)楹苋菀桩a(chǎn)生混淆。對(duì)于函數(shù),始終以小寫(xiě)字母開(kāi)頭,構(gòu)造函數(shù)除外。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約最佳實(shí)踐之Solidity編碼規(guī)范原文已更新,請(qǐng)讀者前往原文閱讀 每一門(mén)語(yǔ)言都有其相應(yīng)的編碼規(guī)范, Solidity 也一樣, 下面官方推薦的規(guī)范及我的總結(jié),供大家參考,希望可以幫助大家寫(xiě)出更好規(guī)范的智能合約。 ...

    kevin 評(píng)論0 收藏0
  • ERC721協(xié)議詳解 --Solidity

    摘要:被授權(quán)或撤權(quán)時(shí)觸發(fā)。計(jì)數(shù)名下的所有。授權(quán)或撤銷(xiāo)權(quán)利,對(duì)第三方,對(duì)所有資產(chǎn)的操作的權(quán)利。參數(shù)值,表示允許,表示撤銷(xiāo)。而這將導(dǎo)致整個(gè)交易被拒絕。拋出異常不正確時(shí),可能指向符合元數(shù)據(jù)模型的。??赡軙?huì)出現(xiàn)失效情況被銷(xiāo)毀。 pragma solidity ^0.4.20; /// Note: the ERC-165 identifier for this interface is 0x80ac...

    tuniutech 評(píng)論0 收藏0
  • 2018以太坊智能合約編程語(yǔ)言solidity最佳IDEs

    摘要:使用基于以太坊的智能合約的集成開(kāi)發(fā)環(huán)境。以太坊教程,主要介紹智能合約與應(yīng)用開(kāi)發(fā),適合入門(mén)。以太坊,主要是介紹使用進(jìn)行智能合約開(kāi)發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建交易轉(zhuǎn)賬代幣開(kāi)發(fā)以及過(guò)濾器和事件等內(nèi)容。 Solidity是一種以智能合約為導(dǎo)向的編程語(yǔ)言。這是一種只有四年的年輕語(yǔ)言,旨在幫助開(kāi)發(fā)基于以太坊數(shù)字貨幣的智能合約。 理解它官方文檔應(yīng)該是學(xué)習(xí)Solidity的最佳來(lái)源:solidity.read...

    darkerXi 評(píng)論0 收藏0
  • Android 生命周期組件 Lifecycle 使用詳解

    摘要:括號(hào)里面的參數(shù),表明需要監(jiān)聽(tīng)的是什么生命周期事件。主要就是通過(guò)和這兩個(gè)枚舉類(lèi)來(lái)跟蹤所關(guān)聯(lián)組件的生命周期狀態(tài)。這點(diǎn)和或者更低版本上的生命周期的調(diào)用順序并不匹配,需要稍加注意。 前言 2018 年的 Google I/O 大會(huì)上,Google 發(fā)布了 Android Jetpack,并稱其為下一代的 Android 組件,旨在幫助開(kāi)發(fā)者加快應(yīng)用開(kāi)發(fā)速度。準(zhǔn)確來(lái)講,Jetpack 是一系列...

    springDevBird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<