我正在修补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();
}
...
我能够在 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());
}
});
但是,这根本不会打印任何内容。
我做错了什么?
添加filter.addSingleTopic(EventEncoder.encode(event))
其中event
是实例化的org.web3j.abi.datatypes.Event
对象。
在收听基于松露的本地节点时,我必须添加.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());