博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解 Solidity 事件Event - 完全搞懂事件的使用
阅读量:7124 次
发布时间:2019-06-28

本文共 2106 字,大约阅读时间需要 7 分钟。

想知道更多区块链技术知识,请百度【链客区块链技术问答社区】    链客,有问必答!!

什么是事件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);
}
监听事件
通过上面的介绍,可能大家还是不清楚事件有什么作用,点击”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和智能合约交互的代码:
<script>
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else
{
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()来获取信息,而改用监听事件获取信息,先定义一个变量引用事件:
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);
}
});

转载地址:http://aseel.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
jQuery easyui datagrid 编辑行试用!
查看>>
×××出現错误讯息「nc.windows.app.23712」
查看>>
java泛型
查看>>
8大排序算法图文讲解
查看>>
SpringBoot热部署与打包
查看>>
架构师是什么,做什么
查看>>
CentOS7配置Nginx支持HTTPS访问
查看>>
我的友情链接
查看>>
SHELL中的if流程控制
查看>>
python字符转码的理解
查看>>
2019-5-8时代的变迁
查看>>
Microsoft .NET Native
查看>>
C#与Java的RSA(1)
查看>>
在centos上安装svn server
查看>>
KNN算法的Python实现
查看>>
实用的正则表达式的总结
查看>>
Windows Server2012 配置打印服务器图文教程
查看>>
CentOS 6.5下Samba服务器的安装与配置
查看>>
网站安全测试工具GoLismero
查看>>