web3j监听智能合约的event事件

假设智能合约中定义了一个事件:

pragma solidity ^0.4.0;

contract Transfer{
  event transfer(address indexed _from, address indexed _to, uint indexed value);

  function deposit() payable {
    address current = this;
    uint value = msg.value;
    transfer(msg.sender, current, value);
  }


  function getBanlance() constant returns(uint) {
      return this.balance;
  }

  /* fallback function */
  function(){}
}

在web3j端对该事件的监听方法为:

void listenEvent()
    {
        Event event = new Event("transfer",
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}),
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
                DefaultBlockParameterName.LATEST, contract_addr);
        filter.addSingleTopic(EventEncoder.encode(event));
        getWeb3jClient().ethLogObservable(filter).subscribe(new Action1<Log>() {
            @Override
            public void call(Log log) {
                System.println(log.toString());
            }
        });
    }
注意,因为智能合约中transfer事件的定义形式是
event transfer(address indexed _from, address indexed _to, uint indexed value);

所以在web3j定义event的时候要对应上:

Event event = new Event("transfer",
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}),
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
否则事件监听会失败。





猜你喜欢

转载自blog.csdn.net/liuzhijun301/article/details/80240437