#1. 关于web3j web3j是一个高度模块化,反应性,类型安全的Java和Android库,用于与智能合约配合并与以太坊网络上的客户端(节点)集成。
#2. 准备工作 jdk版本1.8
引入maven
org.web3j
core
3.4.0
最新的web3j版本请参考 这里
【java|JAVA使用 web3j 进行token转账】
#3. 代码编写 首先你要创建一个web3j实例
Web3j web3j = Web3j.build(new HttpService("XXXXXXXX"))
然后是发起交易,这个工具类简单,只要传入入账、出账地址、私钥、以及合约地址就可以进行发起交易操作,最后的精度要判断不同的类型,传入不同的精度。
其中手续费很容易出现问题,要注意。
public static String tokenDeal(String from, String to, String value, String privateKey, String contractAddress,int decimal) {
try {
//转账的凭证,需要传入私钥
Credentials credentials = Credentials.create(privateKey);
//获取交易笔数
BigInteger nonce;
EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(from, DefaultBlockParameterName.PENDING).send();
if (ethGetTransactionCount == null) {
return null;
}
nonce = ethGetTransactionCount.getTransactionCount();
//手续费
BigInteger gasPrice;
EthGasPrice ethGasPrice = web3j.ethGasPrice().sendAsync().get();
if (ethGasPrice == null) {
return null;
}
gasPrice = ethGasPrice.getGasPrice();
//注意手续费的设置,这块很容易遇到问题
BigInteger gasLimit = BigInteger.valueOf(60000L);
BigInteger val = new BigDecimal(value).multiply(new BigDecimal("10").pow(decimal)).toBigInteger();
// 单位换算
Function function = new Function(
"transfer",
Arrays.asList(new Address(to), new Uint256(val)),
Collections.singletonList(new TypeReference() {
}));
//创建交易对象
String encodedFunction = FunctionEncoder.encode(function);
RawTransaction rawTransaction = RawTransaction.createTransaction(nonce, gasPrice, gasLimit,
contractAddress, encodedFunction);
//进行签名操作
byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
String hexValue = https://www.it610.com/article/Numeric.toHexString(signMessage);
//发起交易
EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).sendAsync().get();
String hash = ethSendTransaction.getTransactionHash();
if (hash != null) {
//执行业务
return hash;
}
} catch (Exception ex){
//报错应进行错误处理
ex.printStackTrace();
}
return null;
}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)