Events
Web3j 監聽事件
我正在修補 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()); } });
我在這裡發現:過濾器和事件的問題(web3j/TestRPC)。求救!;)
然而,這根本不列印任何東西。
我究竟做錯了什麼?
我知道這個問題很老,但是當我遇到這個問題並且在其他地方找不到解決方案時,在這裡提供一個答案……
這似乎是 Web3j 中的一個錯誤,當您將合約地址作為過濾器的一部分傳遞時會發生該錯誤。
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contract.getContractAddress());
不起作用,但是
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contract.getContractAddress().substring(2));
做。應用過濾器時,似乎在字元串的開頭插入了“0x”。傳入帶有 ‘0x’ 修剪的子字元串會使其工作。
(另請參閱必須在 EthFilter 中修剪合約地址)
最近才這樣做,但我認為這僅適用於您的網頁打開時顯示的事件,而不是所有塊:
var CoursetroContract = web3.eth.contract(YOUR ABI); var Coursetro = CoursetroContract.at('CONTRACT ADDRESS'); var instructorEvent = Coursetro.Instructor(); instructorEvent.watch(function(error, result){ if (!error) { $("#loader").hide(); $("#instructor").html(result.args.name + ' (' + result.args.age + ' years old)'); } else { $("#loader").hide(); console.log(error); } });