你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易。
要监听Erc20Token交易,你必须使用在合约(token)创建时的token
封装类。我假设你已经使用最少的功能部署了合约,因此你的封装类看起来像这样:
package com.bolenum.util;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util...;
import org.web3j.abi.EventEncoder;
import org.web3j.abi...
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol...;
import org.web3j.tx.Contract;
import org.web3j.tx.TransactionManager;
import rx.Observable;
import rx.functions.Func1;
...
public final class Erc20TokenWrapper extends Contract {
private static final String BINARY = "contract binary key";
private Erc20TokenWrapper(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
}
private Erc20TokenWrapper(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
}
public List<TransferEventResponse> getTransferEvents(TransactionReceipt transactionReceipt) {
...
return responses;
}
public Observable<TransferEventResponse> transferEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
...
}
...
public Uint256 balanceOf(Address _owner) throws IOException {
Function function = new Function("balanceOf",
Arrays.<Type>asList(_owner),
Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
return executeCallSingleValueReturn(function);
}
...
public TransactionReceipt transfer(Address _to, Uint256 _amount) throws IOException, TransactionException {
Function function = new Function("transfer", Arrays.<Type>asList(_to, _amount), Collections.<TypeReference<?>>emptyList());
return executeTransaction(function);
}
...
public static Erc20TokenWrapper load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
return new Erc20TokenWrapper(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
}
public static class TransferEventResponse {
public Address _from;
public Address _to;
public Uint256 _value;
public String _transactionHash;
}
...
}
现在你必须使用这个类函数来加载合约然后监听交易。使用下面的代码加载和监听交易:
Web3j web3j = Web3j.build(new HttpService("url of your ethereum blockchain"))
ClientTransactionManager transactionManager = new ClientTransactionManager(web3j,
"your deployed contract addess");
Erc20TokenWrapper token = Erc20TokenWrapper.load("your deployed contract addess", web3j, transactionManager,
Contract.GAS_PRICE, Contract