搞懂事件的使用,详细解读Solidity事件Event_atc:ONT

什么是事件Evnet?

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

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

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

eventEventName(addressbidder,uintamount);

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

Shibarium团队或难以恢复桥接资产,Shibarium RPC网站已关闭:8月17日消息,Shibarium开发人员之间的内部Telegram对话截图显示,首席开发者Shytoshi Kusama透露,该团队无法恢复桥接到Shibarium网络的资产。

链上侦探ZachXBT表示,他尚未确认资产是否真正丢失,但指出RPC(运行关键区块链客户端软件的节点)已宕机,并称区块浏览器Shibarium Scan非常“糟糕”。

另一屏幕截图显示,一名Shibarium用户遇到了区块浏览器的技术问题,称无法通过RPC查询桥接余额。

社区成员认为,这可能表明跨链桥存在缺陷,锁定资金总额接近246万美元,其中包括价值170万美元的以太坊和价值76.2万美元的Shibarium治理代币BONE。

经查询Shibarium Scan区块浏览器,Shibarium网络在停止出块8个小时后,于50分钟前恢复出块,又于27分钟前停止出块。目前,Shibarium RPC网站无法打开。[2023/8/17 18:05:24]

emitEventName(msg.sender,msg.value);

BIS创新中心邀请供应商提交离线CBDC技术:金色财经报道,国际清算银行创新中心的北欧部门正在邀请技术供应商提交在未来中央银行数字货币中实现离线功能的想法。许多考虑潜在实施 CBDC 的中央银行将离线功能视为一项重要要求,理由包括弹性、危机、金融包容性、现金相似性、隐私、可访问性等。通过邀请技术供应商提交他们的建议,北欧中心希望引导中央银行了解各种可用解决方案的适用性、适用性和准备情况、风险和权衡以及技术的成熟度。

选定的供应商将受邀向 BIS 专家小组和其他中央银行的代表展示他们的解决方案。申请截止日期为 2 月 24 日。选定的参与者将在三月份收到通知。[2023/2/21 12:20:11]

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

拥有20亿美元的阿布扎比科技生态中心Hub71发起“Hub71+数字资产”计划:金色财经报道,阿布扎比科技生态中Hub71宣布发起“Hub71+数字资产” 计划,该生态中拥有超过20亿美元资金,致力于为当地Web3初创公司和区块链技术公司提供资助,还将帮助项目融资、商业化创新、并接触阿联酋和全球市场的企业客户、政府及投资合作伙伴。(wam)[2023/2/15 12:08:44]

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

监听事件

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

Web3基础设施协议Ankr:Polygon和Fantom RPC服务已完全恢复:据官方消息,Web3基础设施协议Ankr表示,其Polygon和Fantom RPC服务已完全恢复,目前所有服务运行顺利。此次事件是由于第三方供应商的违规行为,Ankr的域名主机被更改,影响了用户对免费的独立Fantom和Polygon公共RPC的一些访问。

此前消息,Web3基础设施协议Ankr的Polygon和Fantom RPC服务疑遭劫持。[2022/7/2 1:45:36]

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

先回顾一下合约代码:

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

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

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-0:541ms