很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用?

写在前面

Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么,另外
本文在监听合约事件是对上一篇Web3与智能合约交互实战进行补充,如果阅读了上一篇可以更好的理解本文。

什么是事件Evnet

事件是以太坊虚拟机(EVM)日志基础设施提供的一个便利接口。当被发送事件(调用)时,会触发参数存储到交易的日志中(一种区块链上的特殊数据结构)。这些日志与合约的地址关联,并记录到区块链中.
来捋这个关系:区块链是打包一系列交易的区块组成的链条,每一个交易“收据”会包含0到多个日志记录,日志代表着智能合约所触发的事件。

在DAPP的应用中,如果监听了某事件,当事件发生时,会进行回调。
不过要注意:日志和事件在合约内是无法被访问的,即使是创建日志的合约。

在Solidity 代码中,使用event 关键字来定义一个事件,如:

1
event EventName(address bidder, uint amount);

这个用法和定义函数式一样的,并且事件在合约中同样可以被继承。触发一个事件使用emit(说明,之前的版本里并不需要使用emit),如:

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

触发事件可以在任何函数中调用,如:

1
2
3
4
5
function testEvent() public {
    // 触发一个事件
     emit EventName(msg.sender, msg.value);
}

监听事件

通过上面的介绍,可能大家还是不清楚事件有什么作用,如果你跟过Web3与智能合约交互实战这篇文章,你会发现点击”Updata Info”按钮之后,虽然调用智能合约成功,但是当前的界面并没有得到更新。
使用事件监听,就可以很好的解决这个问题,让看看如何实现。

修改合约,定义事件及触发事件

先回顾一下合约代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
event Instructor(
      string name,
      uint age
   );

这个事件中,会接受两个参数:name 和 age , 也就是需要跟踪的两个信息。

然后,需要在setInfo函数中,触发Instructor事件,如:

1
2
3
4
5
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和智能合约交互的代码:

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
<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()来获取信息,而改用监听事件获取信息,先定义一个变量引用事件:

1
var instructorEvent = info.Instructor();

然后使用.watch()方法来添加一个回调函数:

1
2
3
4
5
6
7
8
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/code/100/Solidity-Events-Tutorial---Using-Web3.js-to-Listen-for-Smart-Contract-Events

https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events

  • 本文作者: Tiny熊
  • 本文链接: https://learnblockchain.cn/2018/05/09/solidity-event/

详解 Solidity 事件Event相关推荐

  1. android 拖动 点击事件,Android事件详解——拖放事件DragEvent

    1.Android拖放框架的作用? 利用Android的拖放框架,可以让用户用拖放手势把一个View中的数据移到当前layout内的另一个View中去. 2.拖放框架的内容? 1)拖放事件类 2)拖放 ...

  2. html js不触发_图文详解鼠标事件CSS:hover和JS:mouseover的区别

    在工作中为了使页面更具有吸引力,前端开发人员经常会在页面中加上鼠标移入和移出的效果.鼠标移入移出的设置,一般有两种方法,一种是单纯用CSS中的hover伪类,另一种可以用JS 中的DOM事件,即onm ...

  3. JS详解 | 对象 事件 节点 | 系统性学习 | 无知的我费曼笔记

    无知的我正在复盘js- 文章目录 JavaScript 1 常用命令 输出语句 转换为字符串 得到变量类型 1 获取元素对象 1.1 H5新增获取元素对象 1.2 直接获取特殊元素对象 2 事件三要素 ...

  4. 刘铁锰老师C#语言入门详解(委托事件等部分有详细代码和注释)

    目录 1.初识类 1.1 类与对象的关系 1.2 类的三大成员 1.3 静态成员与实例成员 1.4 类修饰符 2.构成C#语言的基本元素 2.1 六个基本元素 2.2 算法简介 3. 详解类型.变量与 ...

  5. 【Oracle】详解10053事件

    借助Oracle的10053事件event,我们可以监控到CBO对SQL进行成本计算和路径选择的过程和方法. 10053事件有两个级别: Level 2:2级是1级的一个子集,它包含以下内容: Col ...

  6. Redis详解之-事件订阅和持久化存储方式(RDB和AOF)(二)

    转载:https://blog.csdn.net/u010963948/article/details/78881057 对以前的内容进行一下总结和复习. 了解Redis的基本参数配置和使用. 了解事 ...

  7. Android 利用源码调试 详解TouchEvent 事件分发机制

    1.如果有触摸事件,首先会调用到Activity 的dispatchTouchEvent 方法. public boolean dispatchTouchEvent(MotionEvent ev) { ...

  8. Monkey详解(事件型指令篇)-转

    转自https://blog.csdn.net/daihuimaozideren/article/details/77529345 (七)事件型指令  事件类型指令可实现四个主要功能. (1)复现随机 ...

  9. flash 的鼠标事件详解

    Flash AS3鼠标事件使用详解  鼠标事件(MouseEvent)和鼠标位置(AS3鼠标坐标总结)是RIA中最重要的人机交互途径.最近在做一个动态产品展示的系统ProdutShow的时候才发现自己 ...

最新文章

  1. Microsoft 顺序分析和聚类分析算法
  2. 平台允许同时在线人数 显示_12万人同时在线,游戏未正式发售,国产“糖豆人”已诞生?...
  3. stringbuffer常用方法_第八讲:常用类库API
  4. 在SSP中查询某个用户Profile信息的SQL语句
  5. 苹果11如何设置9宫格_iphone九宫格如何设置 iphone九宫格设置方法【详解】
  6. Abp vnext Web应用程序开发教程 8 —— 作者:应用程序层
  7. 关于中英文等宽字体的设置
  8. 台式计算机自动关机,电脑会自动关机是什么原因,台式电脑自动关机是什么原因...
  9. Luogu5234[JSOI2012]越狱老虎桥
  10. 【android】项目案例(一)之超级课程表
  11. XMPP增加删除好友
  12. strapi终于装好了,网速太慢了,处理了一下代理,新建了一个.zshrc文件,加入了pon和poff两个函数
  13. 三星性能测试软件,三星T7 性能测试
  14. 2020/04/12 02-HTML和URL提取、豆瓣读书爬虫编写
  15. 光线折射公式推导:Snell‘s Law
  16. 爬虫实战之爬虫漫画(有意外发现哦~嘿嘿)
  17. SAP FICO 理解统驭科目记账与特殊记账
  18. 粒子群算法应用于重心法选址问题-基于MATLAB实现
  19. 基于Django的租房数据展示系统设计与实现
  20. IOS 拍照黑屏解决

热门文章

  1. linux机器不能上网,Deepin Linux 无法上网
  2. C语言-ATT拓展内联汇编(ATT/GCC)
  3. linux下mongodb 安装,linux下mongodb安装
  4. 计算机网络具有双重性特点,计算机网络(本)_201806_模拟卷2_答案
  5. js json数组_JaveScript对象篇和数组篇
  6. jenkins修改数据存放路径
  7. BZOJ 4094 USACO 2013 Dec. Optimal Milking
  8. *2.3.2_加入env
  9. Python筛选法(算出十亿之内所有的质数之和)
  10. [原创]group by和compute 的使用