资讯专栏INFORMATION COLUMN

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

dabai / 2918人阅读

摘要:什么是事件事件是以太坊虚拟机日志基础设施提供的一个便利接口。在的应用中,如果监听了某事件,当事件发生时,会进行回调。不过要注意日志和事件在合约内是无法被访问的,即使是创建日志的合约。使用监听事件,刷新现在需要使用监听事件,刷新。

本文首发于深入浅出区块链社区
原文链接:搞懂 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...

☛ 深入浅出区块链 - 系统学习区块链,打造最好的区块链技术博客。

☛ 我的知识星球为各位解答区块链技术问题,欢迎加入讨论。

☛ 关注公众号“深入浅出区块链技术”第一时间获取区块链技术信息。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/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元查看
<