java erc 2.0_如何使用java监听Erc20Token交易
你可以在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 getTransferEvents(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;
}
...
}
现在你必须使用这个类函数来加载合约然后监听交易。使用下面的代码加载和监听交易:
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();
}
如果你已经部署了合约,它由第三人部署,那么你可以直接使用我的包装类,只需更改你可以从 https://etherscan.io/tokens
很容易获得的二进制密钥。
结论:因此你可以将此代码用于任何token的监听交易。此代码为你提供 address
, fromAddress
和 transactionHash
。所以这些东西你可以根据你的要求使用,你可以将它们保存在你的 数据库 中,或者你只保存地址是你的钱包地址的交易。
谢谢,我希望这会有所帮助。
如果希望快速进行web3j、java、以太坊开发,那请看我们精心打造的教程:java以太坊开发教程,主要是针对java和 android 程序员进行区块链以太坊开发的web3j详解。
其他以太坊教程如下:
以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
以太坊开发进阶教程,主要是介绍使用node.js、 mongodb 、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
python以太坊,主要是针对 python 工程师使用web3.py进行区块链以太坊开发的详解。
php以太坊,主要是介绍使用 php 进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和事件等内容。
C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和事件等。
汇智网原创翻译,转载请标明出处。这里是 原文
完整代码如下:
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;
}
}
java erc 2.0_如何使用java监听Erc20Token交易相关推荐
- java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制
本文主要介绍了java中使用session监听实现同帐号登录限制.登录人数限制,具体代码如下: 问题域: 1.同帐号登录:若此帐号已登录,不可再次登录(与QQ模式相反). 2.登录人数限制,超过.已达 ...
- ibm mq java 发布订阅,JMS调用IBM MQ 监听模式的点对点模式
JMS调用IBM MQ 监听方式的点对点模式 前面三篇,第一篇讲了安装IBM MQ时遇到的一些问题.第二篇讲了点对点模式的调用.第三篇讲了发布订阅模式.本篇说一下监听模式. 监听模式只是在消费者端监听 ...
- Java语言学习--Swing中Button事件监听
1 前言 今天在使用Java Swing中的JButton的事件触发机制时遇到了许多问题,简单的了解了一下. 2 事件监听机制 事件监听的机制如下图所示分析. 3 代码分析 3.1 分步解析 1.事件 ...
- java erc 2.0_如何使用Web3j库管理Java中的ERC20令牌
ERC20是以太坊智能合约标准,用于以兼容的方式实现令牌,因此很容易与任何应用程序(DAPP.钱包.交换等)交互和集成令牌. 先决条件 要学习本教程,您需要在计算机上安装以下软件: ·Java编程语言 ...
- java mouseclicked_我用mouseClicked没办法被监听,求大神看看怎么回事
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java ...
- java监控activemq,ActiveMQ与Spring整合-监听消息
本课程全程使用目前比较流行的开发工具idea进行开发,涉及到目前互联网项目中常用的高并发解决方案技术, 如 dubbo,redis,solr,freemarker,activeMQ,springBo ...
- java聊天室持续监听,[Java聊天室server]实战之二 监听类
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...
- java erc 2.0_java 监听 ERC20 Token 交易
你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易. 要监听Erc20Token交易,你必须使用在合约(token)创建时的token封装类.我假设你 ...
- java如何监听以太坊交易
2019独角兽企业重金招聘Python工程师标准>>> 你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易. 要监听Erc20Tok ...
最新文章
- 【CV】Python下载安装及环境变量配置教程
- Ubuntu 组态 Tomcat而每天的错误解决
- IOS上路_07-简单示例-电子书
- Firefox 将导入 Windows 根证书,避免与杀毒软件的冲突
- html5和响应式,35个响应式HTML5和CSS3模版
- mysql使用数据库_MySQL数据库的常用操作
- android intent 分发,Android分享操作
- 三年经验前端社招——丰巢科技
- java将生成数据写入文件_JAVA-将内容写入文件并导出到压缩包
- CSU 2151 集训难度(线段树)
- DPM2010 粒度恢复个人用户邮箱
- 【ANSYS命令流】Workbench中施加流体渗透压力载荷(超详细)
- ctrl+鼠标滚轮 设置pycharm字体大小
- 微信公众号授权登陆流程
- 计算机编程需要学哪些基础知识,学编程需要掌握哪些基础知识
- Java Swing中的下拉式菜单(menu)、弹出式菜单(JPopupMenu)、选项卡窗体(JTabbedPane),TextArea右键菜单 组件使用案例
- MySQL 数据库设计范式/优化
- Linux-常用快捷键
- 环境变量配置以mysql为例
- String中与获取相关的几个方法