国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

dabai / 2913人閱讀

摘要:什么是事件事件是以太坊虛擬機日志基礎設施提供的一個便利接口。在的應用中,如果監聽了某事件,當事件發生時,會進行回調。不過要注意日志和事件在合約內是無法被訪問的,即使是創建日志的合約。使用監聽事件,刷新現在需要使用監聽事件,刷新。

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

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

寫在前面

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

什么是事件Evnet

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

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

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

event EventName(address bidder, uint amount); 

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

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

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

function testEvent() public {

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

通過上面的介紹,可能大家還是不清楚事件有什么作用,如果你跟過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);
   }   
}

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

 event Instructor(
       string name,
       uint age
    );

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

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

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

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

使用Web3監聽事件,刷新UI

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

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

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歲的記錄,應該如何做呢?
以及另外一個常見的場景:想要獲取到代幣合約中所有的轉賬記錄,也同樣需要使用事件過濾器功能,這部分內容請大家訂閱小專欄區塊鏈技術閱讀。

參考文章

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

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24097.html

相關文章

  • 智能合約最佳實踐之Solidity編碼規范

    摘要:命名規范避免使用小寫的,大寫的,大寫的應該避免在命名中單獨出現,因為很容易產生混淆。對于函數,始終以小寫字母開頭,構造函數除外。 本文首發于深入淺出區塊鏈社區原文鏈接:智能合約最佳實踐之Solidity編碼規范原文已更新,請讀者前往原文閱讀 每一門語言都有其相應的編碼規范, Solidity 也一樣, 下面官方推薦的規范及我的總結,供大家參考,希望可以幫助大家寫出更好規范的智能合約。 ...

    kevin 評論0 收藏0
  • ERC721協議詳解 --Solidity

    摘要:被授權或撤權時觸發。計數名下的所有。授權或撤銷權利,對第三方,對所有資產的操作的權利。參數值,表示允許,表示撤銷。而這將導致整個交易被拒絕。拋出異常不正確時,可能指向符合元數據模型的。。可能會出現失效情況被銷毀。 pragma solidity ^0.4.20; /// Note: the ERC-165 identifier for this interface is 0x80ac...

    tuniutech 評論0 收藏0
  • 2018以太坊智能合約編程語言solidity最佳IDEs

    摘要:使用基于以太坊的智能合約的集成開發環境。以太坊教程,主要介紹智能合約與應用開發,適合入門。以太坊,主要是介紹使用進行智能合約開發交互,進行賬號創建交易轉賬代幣開發以及過濾器和事件等內容。 Solidity是一種以智能合約為導向的編程語言。這是一種只有四年的年輕語言,旨在幫助開發基于以太坊數字貨幣的智能合約。 理解它官方文檔應該是學習Solidity的最佳來源:solidity.read...

    darkerXi 評論0 收藏0
  • Android 生命周期組件 Lifecycle 使用詳解

    摘要:括號里面的參數,表明需要監聽的是什么生命周期事件。主要就是通過和這兩個枚舉類來跟蹤所關聯組件的生命周期狀態。這點和或者更低版本上的生命周期的調用順序并不匹配,需要稍加注意。 前言 2018 年的 Google I/O 大會上,Google 發布了 Android Jetpack,并稱其為下一代的 Android 組件,旨在幫助開發者加快應用開發速度。準確來講,Jetpack 是一系列...

    springDevBird 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<