Events

Web3j 監聽事件

  • January 4, 2019

我正在修補 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 中修剪合約地址

最近才這樣做,但我認為這僅適用於您的網頁打開時顯示的事件,而不是所有塊:

https://coursetro.com/posts/code/100/Solidity-Events-Tutorial---Using-Web3.js-to-Listen-for-Smart-Contract-Events

  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);
           }
   });

引用自:https://ethereum.stackexchange.com/questions/16697