与web3的智能合约中的持久事件状态

时间:2018-01-20 22:51:31

标签: solidity smartcontracts web3js web3

当在合同中触发事件(Something)时,页面控制台会按预期(通过somethingEvent.watch())记录输出,但是当我重新加载页面时,它会记录相同的输出。最近的事件是持续存在还是我没有正确使用它?感谢。

// Code

import { SafeAreaView } from 'react-native';

<SafeAreaView style={styles.safeArea}>
 ...
</SafeAreaView>


// Style
safeArea: {
  flex: 1,
  backgroundColor: colors.background,
},

1 个答案:

答案 0 :(得分:3)

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

将合约添加到合约时,您可以指定要开始监听的合约。如果您没有传递任何内容(正如您的代码所做的那样),则默认为最新的块(请参阅filter API docs)。因此,当您重新加载页面并且未将新块添加到链中时,您将获得相同的事件。

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

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,它会发回符合您的过滤条件的所有事件。