web3调用常用错误类型:cannot filter non-indexed parameters; must be null【原因就是字段amount没有定义为indexed】
参考indexed部分介绍:https://www.jianshu.com/p/131c07c6f72f
官方文档介绍: https://solidity-cn.readthedocs.io/zh/develop/contracts.html?highlight=indexed
solidity语言中定义事件【可以在事件参数上增加indexed
属性,最多可以对三个参数增加这样的属性。加上这个属性,可以允许你在web3.js或ethes.js中通过对加了这个属性的参数进行值过滤】
event Transfer(address indexed _from, address indexed _to, uint indexed amount);
indexed
属性在solidity事件中非常重要【过滤当前事件名中,设置了为indexed索引参数值,作为条件判断筛选】:过滤某个地址为发送者的事件
【非常重要】这里的事件名Transfer有三个参数,如果设置为null,代表所有【必须在solidity中定义为indexed的属性才支持】
let filter = this.contract_instance.filters.Transfer(this.active_wallet.address, null,null);
this.contract_instance.on(filter, (from, to, value, event) => {
console.log("监听发送以太坊事件:");
console.log(`from:${from}+to:${to}+value:${value}`);
});
过滤某个地址为接收者的事件
【非常重要】这里的事件名Transfer有三个参数,如果设置为null,代表所有【必须在solidity中定义为indexed的属性才支持】
let filter = this.contract_instance.filters.Transfer(null, this.active_wallet.address,null);
this.contract_instance.on(filter, (from, to, value, event) => {
console.log("监听发送以太坊事件:");
console.log(`from:${from}+to:${to}+value:${value}`);
});
过滤指定数量的事件【由于事件默认的参数是hex十六进制,所以筛选的时候也必须是十六进制】
【非常重要】这里的事件名Transfer有三个参数,如果设置为null,代表所有【必须在solidity中定义为indexed的属性才支持】
// 过滤value为100的事件
let filter = this.contract_instance.filters.Transfer(null,null,"0x100");
// 过滤value为数组中值的事件
let filter = this.contract_instance.filters.Transfer(null,null,["0x99","0x100","0x101"]);
this.contract_instance.on(filter, (from, to, value, event) => {
console.log("监听发送以太坊事件:");
console.log(`from:${from}+to:${to}+value:${value}`);
});