以太坊-web3j监听合约事件不工作(web3j listen contract events not working),始终没有回调。
测试方式:
- web3j官方文档说明Infura不支持过滤器,Note: filters are not supported on Infura,文档地址https://docs.web3j.io/filters.html
- 使用testRPC/ganache/或者truffle develop,依然不起作用
代码:
EthFilter filter = new EthFilter(
DefaultBlockParameterName.EARLIEST,
DefaultBlockParameterName.LATEST,
contractAddress);
Event event = new Event("Transfer",
Arrays.asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}),
Arrays.asList(new TypeReference<Uint256>() {})
);
String topicData = EventEncoder.encode(event);
filter.addSingleTopic(topicData);
web3j.ethLogObservable(filter).subscribe(log -> {
System.out.println(log.getBlockNumber());
System.out.println(log.getTransactionHash());
List<String> topics = log.getTopics();
for (String topic : topics) {
System.out.println("topic:" + topic);
}
EventValues eventValues = Contract.staticExtractEventParameters(event, log);
String from = (String) eventValues.getIndexedValues().get(0).getValue();
String to = (String) eventValues.getIndexedValues().get(1).getValue();
BigInteger value = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
System.out.println("form:" + from);
System.out.println("to:" + to);
System.out.println("value:" + value);
});
经过多次测试发现,上面两张方式都把监听合约阉割掉了,必须自己在本地运行一个geth客户端才有用。原因是监听一般使用websocket做长连接,去掉监听是为了节省资源。
一般推荐web3j开发环境,搭建一个公用的geth测试节点,然后开发的时候连接使用。部署合约可以使用 truffle console --network xxx(xxx是你配置的网络),个人喜欢的一种方式,当然你也可以使用geth控制台部署。