搞懂事件的使用,详细解读Solidity事件Event

什么是事件Evnet?

就是以EVM日志基础设备提供一个接口,当被事件调用时,出发参数存储到日志中,其与合约地址关联,并记录到区块链中。关系就是:区块链是打包交易区块组成的链条,每一个交易会包含0到多个记录,日志代表智能合约所触发事件。

DAPP中,监听了事件,当事件发生时,会回调。当然要注意的就是,日志和事件在合约内是无法被访问,即使是创建日志的合约。

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

eventEventName(addressbidder,uintamount);

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

Jake Chervinsky:Ripple案件的关键在于“投资合同”分析必须关注交易,而非资产:7月16日消息,Blockchain Association首席政策官Jake Chervinsky在推特上表示,Ripple案件的关键是“投资合同”分析必须关注交易,而不是资产;代币不是证券,但代币交易可以是,取决于事实和情况。

这是该行业多年来做出的重要区分,而SEC却忽视了这一点。联邦地区法院明确承认其有效性,这是美国加密监管的一个巨大转变,也是对SEC对于证券法理论的有力驳斥。

此外,这一判决对于SEC正在针对Coinbase等上线代币交易的交易所提起的案件尤为重要。尽管法院没有直接表示交易所订单簿上的交易不属于证券交易,但很难以其他方式解读这一裁决。[2023/7/16 10:58:33]

emitEventName(msg.sender,msg.value);

Neo Smart Economy:暂停了链接Neo链的跨链桥服务,用户资产安全:7月2日消息,Neo Smart Economy发推称,几个小时前其暂停了链接Neo链的跨链桥服务,用户资产安全。团队将与Poly Network保持密切沟通以获取进一步信息。[2023/7/2 22:13:22]

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

functiontestEvent()public{emitEventName(msg.sender,msg.value);}

监听事件

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

PancakeSwap与Aptos集成,将部署其原生Token CAKE:10月24日消息,BNB Chain链上去中心化交易平台PancakeSwap与Aptos集成,将部署其原生Token CAKE与其他关键产品,使CAKE Token首次实现多链部署。Aptos和PancakeSwap用户及项目将能够使用PancakeSwap的所有核心产品,例如Swap、Farm、Pools和IF0。[2022/10/25 16:37:31]

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

先回顾一下合约代码:

pragmasolidity^0.4.21;contractInfoContract{stringfName;uintage;functionsetInfo(string_fName,uint_age)public{fName=_fName;age=_age;}functiongetInfo()publicconstantreturns(string,uint){return(fName,age);}}

LUNA突破6.5美元,24小时涨幅超235%:金色财经报道,行情显示,LUNA突破6.5美元,现报6.55美元,24小时内涨幅达到235.87%,行情波动较大,请做好风险控制。[2022/9/9 13:20:22]

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

eventInstructor(stringname,uintage);

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

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

functionsetInfo(string_fName,uint_age)public{fName=_fName;age=_age;emitInstructor(_fName,_age);}

在web3与智能合约交互实战时,点UpdataInfo按钮之后,会调用setlnfo函数,触发Instructor事件。

使用Web3监听事件,刷新UI

现在需要使用Web3监听事件,刷新UI。先回顾下之前的使用Web3和智能合约交互的代码:

<script>if(typeofweb3!=='undefined'){web3=newWeb3(web3.currentProvider);}else

{web3=newWeb3(newWeb3.providers.HttpProvider("http://localhost:7545"));}web3.eth.defaultAccount=web3.eth.accounts;varinfoContract=web3.eth.contract(ABIINFO);varinfo=infoContract.at('CONTRACTADDRESS');info.getInfo(function(error,result){if(!error){$("Billions项目组button").click(function(){info.setInfo($("Billions项目组age").val());});</script>

现在可以不需要info.getInfo()来获取信息,而改用监听事件获取信息,先定义一个变量引用事件:

varinstructorEvent=info.Instructor();

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

instructorEvent.watch(function(error,result){if(!error){$("#info").html(result.args.name+'('+result.args.age+'yearsold)');}else{console.log(error);}});

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

银河链

[0:15ms0-1:567ms