区块链:搞懂事件的使用,详细解读Solidity事件Event

什么是事件Evnet?

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

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

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

eventEventName(addressbidder,uintamount);

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

20家公司完成英国央行的“CBDC样本钱包概念证明”项目招标申请:1月5日消息,英国央行(BOE)的“CBDC样本钱包概念和研究证明”项目共收到28份招标申请,但有8家供应商在提问阶段后没有继续进行。完成申请的有9家中小企业和11家大公司。英国央行表示,它希望为核心分类账、移动钱包应用程序和商家网站创建一个后端服务器。它尚未承诺开发样本钱包,只会使用概念验证 (PoC) 来扩展其知识。该项目合同将于1月31日授予选定的申请人。作为回应,英国央行还回答了申请人提出的 70 多个问题。

上月报道,英国央行正为“CBDC样本钱包概念证明”项目进行招标。[2023/1/5 10:23:31]

emitEventName(msg.sender,msg.value);

美参议员致信SBF和John Ray III:要求提供有关FTX崩盘的更多信息:11月18日消息,美国参议员Elizabeth Warren和RichardJ.Durbin致信FTX前任CEO Sam Bankman-Fried和现任CEO John Jay Ray III,要求在11月28日之前提供2019年到现在FTX和子公司资产负债表的完整副本,提供所有从FTX转账到Alameda的完整列表(包括日期、金额以及原因)和FTX和Alameda之间的关系证明副本,以及解释路透社关于FTX17亿美元客户资金失踪的报道,提供有关导致交易平台倒闭的更多信息,并要求就11月11日的黑客攻击事件作出答复和内部沟通。

信件称,公众有义务对导致FTX倒闭以及数十亿美元客户资金损失之前和之后的商业行为和金融活动进行完整和透明的核算。[2022/11/18 13:19:59]

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

BUSD市值突破230亿美元创历史新高:11月12日消息,据Coingecko最新数据显示,Binance发行的稳定币Binance USD(BUSD)市值已达到23,395,798,860美元,创下历史新高。目前BUSD是市值第六大加密货币,仅次于比特币、以太坊、Tether、BNB和USDC。[2022/11/12 12:55:44]

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

监听事件

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

亚特兰大联储主席博斯蒂克暗示不赞成美联储7月加息100个基点:7月15日消息,亚特兰大联储主席博斯蒂克强调了有序政策行动的重要性,暗示他不赞成在本月晚些时候的会议上加息100个基点。上周五,他在一场活动上说,“动作太过剧烈会破坏其他很多运转良好的事情。我们希望它是有序的,让人们对经济有正确的认识。(金十)[2022/7/15 2:16:40]

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

先回顾一下合约代码:

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:78ms0-0:533ms