溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Solidity事件Event怎么使用

發(fā)布時間:2021-12-07 15:45:54 來源:億速云 閱讀:379 作者:iii 欄目:互聯網科技

這篇文章主要介紹“Solidity事件Event怎么使用”,在日常操作中,相信很多人在Solidity事件Event怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Solidity事件Event怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

什么是事件Evnet

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

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

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

event EventName(address bidder, uint amount);

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

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

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

function testEvent() public {

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

監(jiān)聽事件

通過上面的介紹,可能大家還是不清楚事件有什么作用,如果你跟過Web3與智能合約交互實戰(zhàn)這篇文章,你會發(fā)現點擊"Updata Info"按鈕之后,雖然調用智能合約成功,但是當前的界面并沒有得到更新。 使用事件監(jiā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);
   }   
}

首先,需要定義一個事件:

 event Instructor(
       string name,
       uint age
    );

這個事件中,會接受兩個參數:name 和 age , 也就是需要跟蹤的兩個信息。

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

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

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

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

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

<script>
    if (typeof web3 !== 'undefined') {
        web3 = new Web3(web3.currentProvider);
    } else {
        // set the provider you want from Web3.providers
        web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
    }

    web3.eth.defaultAccount = web3.eth.accounts[0];

    var infoContract = web3.eth.contract(ABI INFO);

    var info = infoContract.at('CONTRACT ADDRESS');

    info.getInfo(function(error, result){
        if(!error)
            {
                $("#info").html(result[0]+' ('+result[1]+' years old)');
                console.log(result);
            }
        else
            console.error(error);
    });

    $("#button").click(function() {
        info.setInfo($("#name").val(), $("#age").val());
    });

</script>

現在可以不需要 info.getInfo()來獲取信息,而改用監(jiān)聽事件獲取信息,先定義一個變量引用事件:

var instructorEvent = info.Instructor();

然后使用**.watch()**方法來添加一個回調函數:

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

代碼更新之后,可以在瀏覽器查看效果,這是點擊"Updata Info"按鈕之后,會及時更新界面

事件高級用法-過濾器

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

<!-- 有時我們會有這樣的需求:獲取當前所有姓名及年齡記錄,應該如何做呢? 實際上事件支持過濾器,可以從所有的區(qū)塊中過濾出符合要求的事件,如: ```js var instructorEvent = info.Instructor({}, {fromBlock: 0, toBlock: 'latest'}); ``` 或者是,要過濾出年齡28歲的記錄,可以這樣: ```js var instructorEvent = info.Instructor({ 'age': 28}); ``` 比如,我們要獲取到代幣合約中,所有的轉賬記錄, 就可以使用: ```js var transferEvent = token.Transfer({}, {fromBlock: 0, toBlock: 'latest'}) var transferEvent.watch(function(error, result){ // handle result.args.from result.args.to }); ``` -->

到此,關于“Solidity事件Event怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI