Java 在Web3j中收听事件

Java 在Web3j中收听事件,java,blockchain,ethereum,remix,web3-java,Java,Blockchain,Ethereum,Remix,Web3 Java,我正在修补web3j和我想做的大部分事情,但我似乎无法倾听事件 我通过添加一个事件VoteEnded扩展了您与remix签订的ballot.sol合同,该事件在调用winningProposal时触发,并在remix JavaScript VM中运行 ... event VoteEnded(); ... function winningProposal() constant returns (uint8 winningProposal) { uint256 winningVoteCou

我正在修补web3j和我想做的大部分事情,但我似乎无法倾听事件

我通过添加一个事件VoteEnded扩展了您与remix签订的ballot.sol合同,该事件在调用winningProposal时触发,并在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();
}
...
。。。
事件voteend();
...
函数winningProposal()常量返回(uint8 winningProposal){
uint256 winningVoteCount=0;
对于(uint8提案=0;提案<提案长度;提案++)
if(提案[提案].voteCount>winningVoteCount){
winningVoteCount=提案[提案]。voteCount;
赢得提案=提案;
}
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());
        }
    });
EthFilter filter=newethfilter(DefaultBlockParameterName.EARLIEST、DefaultBlockParameterName.LATEST、contract.getContractAddress());
ethLogObservable(filter).subscribe(新操作1(){
@凌驾
公共作废调用(日志){
System.out.println(“log.toString():”+log.toString());
}
});
但是,这根本不打印任何内容


我做错了什么?

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

在侦听基于本地块菌的节点时,我必须添加
.substring(2):

其次,您可能需要使用

    String encodedEventSignature = EventEncoder.encode(event);
    filter.addSingleTopic(encodedEventSignature);
您案例中的事件应该是什么样子的

new Event("VoteEnded", 
            Arrays.<TypeReference<?>>asList(), Arrays.<TypeReference<?>>asList());
新事件(“VoteEnded”,
数组。>asList());
new Event("VoteEnded", 
            Arrays.<TypeReference<?>>asList(), Arrays.<TypeReference<?>>asList());