Прослушивание событий в Web3j

Я работаю с web3j, и большинство вещей, которые я хочу сделать, преуспевают, однако я, похоже, не могу слушать события.

Я расширил контракт ballot.sol, который вы получаете с ремиксом, добавив событие VoteEnded, которое запускается при вызове WinProposal и работает в 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());
        }
    });

Однако это вообще ничего не печатает.

Что я делаю не так?


person MPL    schedule 28.05.2017    source источник


Ответы (2)


Вам нужно добавить filter.addSingleTopic(EventEncoder.encode(event)), где event — это экземпляр объекта org.web3j.abi.datatypes.Event.

person Coder1224    schedule 29.08.2017

При прослушивании локального узла на основе трюфелей мне пришлось добавить .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());
person forhas    schedule 24.06.2018