2

我正在修补 web3j 和大多数我想做的事情,但是我似乎无法收听事件。

我通过添加一个事件 VoteEnded 扩展了您通过 remix 获得的 ballot.sol 合约,该事件在调用 winsProposal 时触发,并且在 Remix JavaScript VM 中有效。

...
event VoteEnded();
...

function winningProposal() constant returns (uint8 winningProposal) {
    uint256 winningVoteCount = 0;
    for (uint8 proposal = 0; proposal < proposals.length; proposal++)
        if (proposals[proposal].voteCount > winningVoteCount) {
            winningVoteCount = proposals[proposal].voteCount;
            winningProposal = proposal;
        }
    VoteEnded();
}
...

我能够在 Web3j 中部署这个合约和投票等。然后我添加了一个过滤器来收听 VoteEnded。我是这样做的:

    EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contract.getContractAddress());
    web3.ethLogObservable(filter).subscribe(new Action1<Log>() {
        @Override    
        public void call(Log log) {
            System.out.println("log.toString(): " +  log.toString());
        }
    });

然而,这根本不打印任何东西。

我究竟做错了什么?

4

2 回答 2

3

您需要添加filter.addSingleTopic(EventEncoder.encode(event))whereevent是一个实例化的org.web3j.abi.datatypes.Event对象。

于 2017-08-29T19:13:37.447 回答
3

在收听基于本地松露的节点时,我必须添加.substring(2):

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contract.getContractAddress().substring(2);

其次,您可能需要使用

    String encodedEventSignature = EventEncoder.encode(event);
    filter.addSingleTopic(encodedEventSignature);

在您的情况下,事件应该看起来像

new Event("VoteEnded", 
            Arrays.<TypeReference<?>>asList(), Arrays.<TypeReference<?>>asList());
于 2018-06-24T20:28:01.027 回答