前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详解 Solidity 事件Event - 完全搞懂事件的使用

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

作者头像
Tiny熊
发布于 2018-07-23 06:47:09
发布于 2018-07-23 06:47:09
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

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

写在前面

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

什么是事件Evnet

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
event EventName(address bidder, uint amount);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
emit EventName(msg.sender, msg.value);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function testEvent() public {

    // 触发一个事件
     emit EventName(msg.sender, msg.value); 
}

监听事件

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

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

先回顾一下合约代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
   }   
}

首先,需要定义一个事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
event Instructor(
      string name,
      uint age
   );

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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和智能合约交互的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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()来获取信息,而改用监听事件获取信息,先定义一个变量引用事件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var instructorEvent = info.Instructor();

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Web3与智能合约交互实战
在最初学习以太坊的时候,很多人都是自己创建以太坊节点后,使用geth与之交互。这种使用命令行交互的方法虽然让很多程序员感到兴奋(黑客帝国的既视感),但不可能指望普通用户通过命令行使用Dapp。因此,我们需要一种友好的方式(比如一个web页面)来与智能合约交互,于是问题的答案就是web3.js。
Tiny熊
2019/08/01
2.5K0
Web3与智能合约交互实战
福利|评价超高的《精通以太坊》丛书免费送,还包邮!手慢无
在去中心化应用中,发送给节点的请求通常被称为“交易”。交易和普通的请求有很大不同,即交易的数据经过用户个人签名之后发送到节点。
区块链大本营
2018/11/07
1.2K0
第二十六课 如何从零开始搭建一个Truffle框架的DAPP应用1,摘要2, 需求描述3,操作步骤4,总结
第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)介绍了如何获取宠物商店的TRUFLLE框架代码,并完成部署的过程。 但是这个是已经成熟的代码框架,一般用户要开发自己的一能用。那如何借用宠物商店成熟框架完成自有DAPP的搭建呢?我们以tiny熊老师的一个姓名/年龄智能合约用例来呈现方法。
辉哥
2018/10/11
8680
第二十六课 如何从零开始搭建一个Truffle框架的DAPP应用1,摘要2, 需求描述3,操作步骤4,总结
Solidity:事件
在 Solidity 中,事件(Event)是合约与区块链外部的接口。事件可以用来记录合约的状态变化,或者触发合约外部的响应。事件在合约中被触发,然后被区块链记录在交易日志中。
孟斯特
2024/05/28
1710
Solidity:事件
通过web3.js与以太坊客户端进行交互
web3.js是一个js API库。要使DApp在以太坊上运行,可用web3.js库提供的web3对象。
JavaEdge
2024/07/27
2140
蚂蚁区块链第13课 如何搭建一个DAPP应用(以姓名年龄为例)
本文介绍如何使用Cloud IDE完成name-age智能合约的编译,获取其ABI和二进制码信息。 接着,本文介绍基于EXPRESS框架搭建的前端页面,完成已部署智能合约的调用,完成了相关功能的呈现。 本文假设用户已经熟悉蚂蚁BAAS的Cloud IDE和Solidity开发编译,不熟悉的查看辉哥的其他文档完成知识准备。
辉哥
2019/04/18
1.3K0
蚂蚁区块链第13课 如何搭建一个DAPP应用(以姓名年龄为例)
彻底理解solidity中的事件
我们可以通过emit调用事件方法,然后这个事件就作为日志记录到了以太坊区块链中。日志是以太坊区块链中一种特殊的数据结构,你可以把它当作区块链的一部分,只要区块链在,日志就在。日志和产生它的智能合约的地址事绑定的。
用户7634691
2023/02/24
3440
彻底理解solidity中的事件
Solidity 简易教程
Solidity 的代码都包裹在合约里面. 一份合约就是以太应币应用的基本模块, 所有的变量和函数都属于一份合约, 它是你所有应用的起点.
goodspeed
2020/12/22
6510
前端通过web3调用智能合约进行逻辑交互
本例子通过crytozombie的例子,讲解前端界面与智能合约交互的逻辑。界面一般 用HTML, JavaScript(包括 ES6 promises),以及 JQuery 写网站了,JavaScript 来写,并不是 Solidity并不能直接与前端界面进行数据交互。
rectinajh
2021/11/24
6.2K0
Solidity 智能合约开发 - 基础
去年读研的时候上的 HKU 的 <COMP7408 Distributed Ledger and Blockchain Technology>,课程中学习了以太坊智能合约的开发,做了一个简单的图书管理 ÐApp,然后毕业设计也选择了基于 Ethereum 做了一个音乐版权应用,详见 Uright - 区块链音乐版权管理ÐApp,对 Solidity 开发有一些基础了解。
pseudoyu
2023/04/11
8110
Solidity 智能合约开发 - 基础
Ethereum中Event
本篇文章将描述Ethereum的Event系统。在以太坊的合约代码中,经常会看到emit SomeEvent(...)的调用,对这里比较有困惑,查找了好些资料,整理出如下文档。
路之遥
2022/09/26
4250
第十一课 从宠物商店案例看DAPP架构和WEB3.JS交互接口
【本文目标】 了解ETH生态下DAPP去中心化应用程序的框架和交互流程,了解WEB3.JS的作用和接口函数。 【前置条件】 完成了《第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)》的学习实践,对智能合约了解。 【技术收获】 1). DAPP架构 2). ETH节点框架 3).宠物商店的APP.js文件的业务处理流程图和函数介绍 4).web3.js接口
辉哥
2018/08/10
2.7K0
第十一课 从宠物商店案例看DAPP架构和WEB3.JS交互接口
快速学习-web3.js简介与入门
为了帮助 web3 集成到不同标准的所有类型项目中,1.0.0 版本提供了多种方式来处理异步函数。大多数的 web3 对象允许将一个回调函数作为最后一个函数参数传入,同时会返回一个promise 用于链式函数调用。
cwl_java
2020/04/17
7K0
用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。
笔阁
2018/09/04
8720
【一步步一起学DApp开发】(四)web3.js 基本使用 | 连接geth | 创建web客户端
web3.js内部使用JSONRPC与geth通信。它把所有JSON-RPC API当作JavaScript API,也就是说,它不仅支持所有与以太坊相关的API,还支持与Whisper和Swarm相关的API。
前端修罗场
2023/10/07
1.1K0
以太坊开发语言solidity简介
以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分: 智能合约的开发 用户界面的开发 在本文中,我们将介绍智能合约的开发语言solidity。 如果你希望马上开始学习以太坊DApp开发,可以访问汇智网提供的出色的在线互动教程: 以太坊DApp实战入门教程 以太坊去中心化电商应用开发实战 Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。在后续内容中你将会发现,使用它很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的合约。
用户1408045
2018/05/17
9470
智能合约:solidity语法(一)
在 solidity 里面 uint 默认表示 uint256,其他的还有 uint8、uint16、uint32...
yichen
2020/05/20
1.4K0
蚂蚁区块链第14课 如何在TEE硬件隐私加密链上搭建一个DAPP应用(以姓名年龄为例)
本文介绍通过调用蚂蚁BAAS的TEE硬件隐私链的JS SDK,完成智能合约读取,编译和加密部署功能。然后通过基于EXPRESS框架搭建的前端页面完成该姓名/年龄前端系统的写入/查询功能,演示隐私链的接口基本功能。
辉哥
2019/04/18
1K0
蚂蚁区块链第14课 如何在TEE硬件隐私加密链上搭建一个DAPP应用(以姓名年龄为例)
如何在Spring Boot中玩转智能合约【修订版】
本文是由链博科技 ChainBoard.IO 为大家带来的web3j 对智能合约的调用。让 java 程序可以和我们的智能合约愉快的交互起来~ 一、 什么是 web3j web3j是一个高度模块化、响应式、类型安全的Java和Android库,用于与智能合约交互,并与Ethereum网络的客户端(节点)集成。 二、准备工作 1.新建一个spring-boot的项目,在 pom 文件中添加 <dependency> <groupId>org.web3j</groupId> <artifac
程序猿DD
2018/04/17
2.1K0
如何在Spring Boot中玩转智能合约【修订版】
快速学习-智能合约概述
智能合约概述 Solidity中合约 一组代码(合约的函数 )和数据(合约的状态 ),它们位于以太坊区块链的一个特定地址上 代码行 uint storedData; 声明一个类型为 uint (256位无符号整数)的状态变量,叫做 storedData 函数 set 和 get 可以用来变更或取出变量的值 合约结构 状态变量(State Variables)作为合约状态的一部分,值会永久保存在存储空间内。 函数(Functions)合约中可执行的代码块。 函数修饰器(Function Modifiers)用
cwl_java
2020/04/16
3330
推荐阅读
相关推荐
Web3与智能合约交互实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验