以太坊-web3j监听合约事件不工做(web3j listen contract events not working),始终没有回调。html
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作长链接,去掉监听是为了节省资源。java
通常推荐web3j开发环境,搭建一个公用的geth测试节点,而后开发的时候链接使用。部署合约能够使用 truffle console --network xxx(xxx是你配置的网络),我的喜欢的一种方式,固然你也能够使用geth控制台部署。web