首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >web3智能契约中的持久事件状态

web3智能契约中的持久事件状态
EN

Stack Overflow用户
提问于 2018-01-20 22:51:30
回答 1查看 581关注 0票数 2

当一个事件(某件事)在契约中被触发时,页面控制台(通过somethingEvent.watch())会按预期记录输出,但是当我重新加载页面时,它会记录相同的输出。最近的事件是否意味着持续存在,还是我没有正确地使用它?

代码语言:javascript
复制
// Solidity
event Something(string message);

function doSomething(string newMessage) payable {
    Something(newMessage);
}

// Web3
var somethingEvent = contractInstance.Something();

somethingEvent.watch(function(error, result) {
  console.log(result.args.message);
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-20 23:34:00

每当您调用watch()时,都会发生这种情况,并且最新的块号与上一次执行相同。当事件被“触发”时,EVM所做的就是在事务被成功挖掘后将事件信息写入日志。

将手表添加到合同中时,可以指定要开始侦听的块。如果您没有传递任何内容(正如您的代码所做的那样),它默认为最新的块(请参见过滤器API文档)。因此,当您重新加载页面,而新的块尚未添加到链中时,您将得到相同的事件。

如果希望避免重复事件,请使用result.blockNumber来记住最后一个块读取,并在建立新手表时将其增加1。

代码语言:javascript
复制
let blockNumber = 'latest'; // should come from some state initially set to 'latest'

...

var somethingEvent = contractInstance.Something({}, {fromBlock: blockNumber);

somethingEvent.watch(function(error, result) {
  blockNumber = result.blockNumber + 1;
  console.log(result.args.message);
});

请注意,在这种情况下,使用watch可能不是最好的选择。这取决于你的客户的状态如何。在监听完事件后,您应该始终调用stopWatching。如果您不想设置一个手表,您也可以使用get,它将发送所有符合筛选条件的事件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48361899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档