为什么松露返回<indexed>而不是事件的实际值?

时间:2018-04-22 13:06:56

标签: solidity truffle

我已经为我的活动索引了一些值。当我进行测试时,他们为什么不出现?

示例:

Events emitted during test:
---------------------------

Upgrade(_tokenId: <indexed>, _upgradeType: 1)

---------------------------

为什么它没有显示令牌ID?

2 个答案:

答案 0 :(得分:0)

回调返回对象会有所不同,具体取决于您是创建global filter还是contract filter。您需要添加客户端代码以提供更好的答案,但这看起来像一个全局过滤器,其响应将事件数据(非索引字段)与主题(索引字段)分开。来自文档:

  
      
  • data:String - 包含日志的一个或多个32字节非索引参数。
  •   
  • 主题:字符串数组 - 0到4的数组32字节索引日志参数的数据。 (实际上:第一个主题是事件签名的哈希值(例如Deposit(address,bytes32,uint256)),除非您使用匿名说明符声明了事件。)
  •   

使用合约过滤器,您可以使用args获取每个参数,无论它是否已编入索引。

示例:

var contractFilter = contractInstance.Upgrade({}, (e, r) => {
  console.log(r.args._tokenId);
});

答案 1 :(得分:0)

我的truffle-assertions库可以按照与松露通常在出错时输出事件的相同方式记录事务中所有发出的事件,除了它还可以正确显示索引参数的值。

可以通过npm安装该库

npm install truffle-assertions

然后,可以将其导入测试文件的顶部

const truffleAssert = require('truffle-assertions');

最后,它可以用于输出事务中所有发出的事件。

let result = contractInstance.function({from: account[0]});
truffleAssert.prettyPrintEmittedEvents(result);