java中怎么監(jiān)聽以太坊交易,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、涿鹿ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的涿鹿網(wǎng)站制作公司
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 ListgetTransferEvents(TransactionReceipt transactionReceipt) { ... return responses; } public Observable transferEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { ... } ... public Uint256 balanceOf(Address _owner) throws IOException { Function function = new Function("balanceOf", Arrays. asList(_owner), Arrays. >asList(new TypeReference () {})); return executeCallSingleValueReturn(function); } ... public TransactionReceipt transfer(Address _to, Uint256 _amount) throws IOException, TransactionException { Function function = new Function("transfer", Arrays. asList(_to, _amount), Collections. >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; } ... }
現(xiàn)在你必須使用這個類函數(shù)來加載合約然后監(jiān)聽交易。使用下面的代碼加載和監(jiān)聽交易:
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.GAS_LIMIT); token.transferEventObservable(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST) .subscribe(tx -> { String toAddress = tx._to.getValue(); String fromAddress = tx._from.getValue(); String txHash = tx._transactionHash.getValue(); }
如果你已經(jīng)部署了合約,它由第三人部署,那么你可以直接使用我的包裝類,只需更改你可以從https://etherscan.io/tokens很容易獲得的二進制密鑰。
結(jié)論:因此你可以將此代碼用于任何token的監(jiān)聽交易。此代碼為你提供address
,fromAddress
和transactionHash
。所以這些東西你可以根據(jù)你的要求使用,你可以將它們保存在你的數(shù)據(jù)庫中,或者你只保存地址是你的錢包地址的交易。
謝謝,我希望這會有所幫助。
如果希望快速進行web3j、java、以太坊開發(fā),那請看我們精心打造的教程: java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
這里是原文
完整代碼如下:
package com.bolenum.util; import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.Future; import org.web3j.abi.EventEncoder; import org.web3j.abi.EventValues; import org.web3j.abi.FunctionEncoder; import org.web3j.abi.TypeReference; import org.web3j.abi.datatypes.Address; import org.web3j.abi.datatypes.Event; import org.web3j.abi.datatypes.Function; import org.web3j.abi.datatypes.Type; import org.web3j.abi.datatypes.Utf8String; import org.web3j.abi.datatypes.generated.Uint256; import org.web3j.abi.datatypes.generated.Uint8; import org.web3j.crypto.Credentials; import org.web3j.protocol.Web3j; import org.web3j.protocol.core.DefaultBlockParameter; import org.web3j.protocol.core.RemoteCall; import org.web3j.protocol.core.methods.request.EthFilter; import org.web3j.protocol.core.methods.response.Log; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.protocol.exceptions.TransactionException; import org.web3j.tx.Contract; import org.web3j.tx.TransactionManager; import rx.Observable; import rx.functions.Func1; /** * Auto generated code.
* Do not modify!
* Please use the web3j command line tools, or {@link org.web3j.codegen.SolidityFunctionWrapperGenerator} to update. * *Generated with web3j version 2.3.1. */ 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
getTransferEvents(TransactionReceipt transactionReceipt) { final Event event = new Event("Transfer", Arrays. >asList(new TypeReference() {}, new TypeReference() {}), Arrays. >asList(new TypeReference () {})); List valueList = extractEventParameters(event, transactionReceipt); ArrayList responses = new ArrayList (valueList.size()); for (EventValues eventValues : valueList) { TransferEventResponse typedResponse = new TransferEventResponse(); typedResponse._from = (Address) eventValues.getIndexedValues().get(0); typedResponse._to = (Address) eventValues.getIndexedValues().get(1); typedResponse._value = (Uint256) eventValues.getNonIndexedValues().get(0); responses.add(typedResponse); } return responses; } public Observable transferEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { final Event event = new Event("Transfer", Arrays. >asList(new TypeReference() {}, new TypeReference() {}), Arrays. >asList(new TypeReference () {})); EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); filter.addSingleTopic(EventEncoder.encode(event)); return web3j.ethLogObservable(filter).map(new Func1 () { @Override public TransferEventResponse call(Log log) { EventValues eventValues = extractEventParameters(event, log); TransferEventResponse typedResponse = new TransferEventResponse(); typedResponse._from = (Address) eventValues.getIndexedValues().get(0); typedResponse._to = (Address) eventValues.getIndexedValues().get(1); typedResponse._value = (Uint256) eventValues.getNonIndexedValues().get(0); typedResponse._transactionHash = log.getTransactionHash(); return typedResponse; } }); } public List getApprovalEvents(TransactionReceipt transactionReceipt) { final Event event = new Event("Approval", Arrays. >asList(new TypeReference() {}, new TypeReference() {}), Arrays. >asList(new TypeReference () {})); List valueList = extractEventParameters(event, transactionReceipt); ArrayList responses = new ArrayList (valueList.size()); for (EventValues eventValues : valueList) { ApprovalEventResponse typedResponse = new ApprovalEventResponse(); typedResponse._owner = (Address) eventValues.getIndexedValues().get(0); typedResponse._spender = (Address) eventValues.getIndexedValues().get(1); typedResponse._value = (Uint256) eventValues.getNonIndexedValues().get(0); responses.add(typedResponse); } return responses; } public Observable approvalEventObservable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { final Event event = new Event("Approval", Arrays. >asList(new TypeReference() {}, new TypeReference() {}), Arrays. >asList(new TypeReference () {})); EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); filter.addSingleTopic(EventEncoder.encode(event)); return web3j.ethLogObservable(filter).map(new Func1 () { @Override public ApprovalEventResponse call(Log log) { EventValues eventValues = extractEventParameters(event, log); ApprovalEventResponse typedResponse = new ApprovalEventResponse(); typedResponse._owner = (Address) eventValues.getIndexedValues().get(0); typedResponse._spender = (Address) eventValues.getIndexedValues().get(1); typedResponse._value = (Uint256) eventValues.getNonIndexedValues().get(0); typedResponse._transactionHash = log.getTransactionHash(); return typedResponse; } }); } public Future name() throws IOException { Function function = new Function("name", Arrays. asList(), Arrays. >asList(new TypeReference () {})); return executeCallSingleValueReturn(function); } public TransactionReceipt approve(Address _spender, Uint256 _amount) throws IOException, TransactionException { Function function = new Function("approve", Arrays. asList(_spender, _amount), Collections. >emptyList()); return executeTransaction(function); } public Future totalSupply() throws IOException { Function function = new Function("totalSupply", Arrays. asList(), Arrays. >asList(new TypeReference () {})); return executeCallSingleValueReturn(function); } public TransactionReceipt transferFrom(Address _from, Address _to, Uint256 _amount) throws IOException, TransactionException { Function function = new Function("transferFrom", Arrays. asList(_from, _to, _amount), Collections. >emptyList()); return executeTransaction(function); } public Uint8 decimals() throws IOException { Function function = new Function("decimals", Arrays. asList(), Arrays. >asList(new TypeReference () {})); return executeCallSingleValueReturn(function); } public Uint256 balanceOf(Address _owner) throws IOException { Function function = new Function("balanceOf", Arrays. asList(_owner), Arrays. >asList(new TypeReference () {})); return executeCallSingleValueReturn(function); } public Future owner() throws IOException { Function function = new Function("owner", Arrays. asList(), Arrays. >asList(new TypeReference() {})); return executeCallSingleValueReturn(function); } public Future symbol() throws IOException { Function function = new Function("symbol", Arrays. asList(), Arrays. >asList(new TypeReference () {})); return executeCallSingleValueReturn(function); } public TransactionReceipt transfer(Address _to, Uint256 _amount) throws IOException, TransactionException { Function function = new Function("transfer", Arrays. asList(_to, _amount), Collections. >emptyList()); return executeTransaction(function); } public Future allowance(Address _owner, Address _spender) throws IOException { Function function = new Function("allowance", Arrays. asList(_owner, _spender), Arrays. >asList(new TypeReference () {})); return executeCallSingleValueReturn(function); } public static RemoteCall deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit, BigInteger initialWeiValue, Uint256 totalSupply, Utf8String tokenName, Uint8 decimalUnits, Utf8String tokenSymbol) { String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays. asList(totalSupply, tokenName, decimalUnits, tokenSymbol)); return deployRemoteCall(Erc20TokenWrapper.class, web3j, credentials, gasPrice, gasLimit, BINARY, encodedConstructor, initialWeiValue); } public static RemoteCall deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit, BigInteger initialWeiValue, Uint256 totalSupply, Utf8String tokenName, Uint8 decimalUnits, Utf8String tokenSymbol) { String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays. asList(totalSupply, tokenName, decimalUnits, tokenSymbol)); return deployRemoteCall(Erc20TokenWrapper.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, encodedConstructor, initialWeiValue); } public static Erc20TokenWrapper load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { return new Erc20TokenWrapper(contractAddress, web3j, credentials, gasPrice, gasLimit); } 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; } public static class ApprovalEventResponse { public Address _owner; public Address _spender; public Uint256 _value; public String _transactionHash; } }
關(guān)于java中怎么監(jiān)聽以太坊交易問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。