如何使用Web3j库管理Java中的ERC20令牌

erc20是以太坊智能合约标准,用于以兼容的方式实现令牌,因此很容易与任何应用程序(dapp、钱包、交换等)交互和集成令牌。
先决条件
要学习本教程,您需要在计算机上安装以下软件:
·java编程语言(>8)
·包和依赖关系管理器,例如maven或gradle
·一个集成开发环境,对于本教程,我们使用eclipse
·truffle:开发、测试和部署以太坊智能合约的开发框架
·ganache-cli:以太坊开发的本地个人区块链。
·通过运行以下命令启动ganache:
ganache-cli
合约部署
在开始之前,我们需要在以太坊区块链上部署一个erc20代币合约(在我们的例子中是ganache)。为了本教程的目的,我们使用最简单的解决方案,使用openzeppelin可重用合同,truffle和ganache。
1.首先为我们的erc20创建一个名为jvm的项目文件夹,并初始化一个truffle项目
$ mkdir jvm
$ cd jvm
$ truffle init
2.然后我们安装open-zeppelin solidity库,其中包含大量高质量,经过全面测试和审核的可重用智能合约。
使用npm包导入openzeppelin智能合约。
$ npm init -y
$ npm install openzeppelin-solidity --save-exact
3.创建合同文件。/contracts/javatoken.sol
智能合约继承了可重用的openzeppelin合约erc20mintable的所有功能和规则。我们只需要配置以下常量变量,如下所示:
// javatoken.sol
pragma solidity ^0.5.8;
import “openzeppelin-solidity/contracts/token/erc20/erc20mintable.sol”;
contract javatoken is erc20mintable {
string public constant name = “java token”;
string public constant symbol = “jvm”;
uint8 public constant decimals = 18;
}
4.在我们本地的ganache网络上部署智能合约
我们需要先完成迁移脚本。创建一个名为。/migrations/2_deploy_contract.js的文件,并将以下代码添加到该文件中:
// 2_deploy_contract.js
const javatoken = artifacts.require(“。/javatoken.sol”);
module.exports = function(deployer, network, accounts) {
// deploy the smart contract
deployer.deploy(javatoken, {from: accounts[0]}).then(function(instance) {
// mint 100 tokens
return instance.mint(accounts[0], web3.utils.tobn(“100”), {from: accounts[0]});
});
};
迁移脚本部署合约,mints并将100个jvm令牌分发到部署者帐户(ganache第一个帐户)。
下一步是配置与ganache网络的连接以部署智能合约。更改文件。/truffle-config.jsto代码如下:
// truffle-config.js
module.exports = {
networks: {
development: {
host: “localhost”,
port: 8545,
network_id: “*”
}
}
};
要在ganache网络上部署智能合约,请运行以下命令(不要忘记预先启动ganache cli):
$ truffle migrate --network development
compiling your contracts.。.
===========================
》 compiling 。/contracts/javatoken.sol
》 compiling 。/contracts/migrations.sol
》 compiling openzeppelin-solidity/contracts/access/roles.sol
》 compiling openzeppelin-solidity/contracts/access/roles/minterrole.sol
》 compiling openzeppelin-solidity/contracts/math/safemath.sol
》 compiling openzeppelin-solidity/contracts/token/erc20/erc20.sol
》 compiling openzeppelin-solidity/contracts/token/erc20/erc20mintable.sol
》 compiling openzeppelin-solidity/contracts/token/erc20/ierc20.sol
》 artifacts written to /home/gjeanmart/workspace/tutorials/kauri-content/java-erc20/jvm/build/contracts
》 compiled successfully using:
- solc: 0.5.8+commit.23d335f2.emscripten.clang
starting migrations.。.
======================
》 network name: ‘development’
》 network id: 1565778588423
》 block gas limit: 0x6691b7
1_initial_migration.js
======================
deploying ‘migrations’
----------------------
》 transaction hash: 0x6161e15461a5c748a532b2191600986b8798be4842e78791238e9e77af5e1310
》 blocks: 0 seconds: 0
》 contract address: 0xc59fc6035859dd35871c5d9211a0713ed608d59d
》 block number: 6
》 block timestamp: 1565778631
》 account: 0xb0c24796fc9212ab371c8caf1ea3f33cc1d4c8a0
》 balance: 99.95438236
》 gas used: 261393
》 gas price: 20 gwei
》 value sent: 0 eth
》 total cost: 0.00522786 eth
》 saving migration to chain.
》 saving artifacts
-------------------------------------
》 total cost: 0.00522786 eth
2_deploy_contract.js
====================
deploying ‘javatoken’
---------------------
》 transaction hash: 0xfc5b214cbd56ecd4d24795aacefe1fdaf27b1b223ebff78299fd47f302cb374c
》 blocks: 0 seconds: 0
》 contract address: 0x9339a071cb9c1e3bbba50e5e298f234c5095f012
》 block number: 8
》 block timestamp: 1565778631
》 account: 0xb0c24796fc9212ab371c8caf1ea3f33cc1d4c8a0
》 balance: 99.92109908
》 gas used: 1622141
》 gas price: 20 gwei
》 value sent: 0 eth
》 total cost: 0.03244282 eth
》 saving migration to chain.
》 saving artifacts
-------------------------------------
》 total cost: 0.03244282 eth
summary
=======
》 total deployments: 2
》 final cost: 0.03767068 eth
注意命令完成后的合同地址。
如果您想了解更多有关此步骤的信息,我建议阅读以下有关truffle和ganache部署智能合约的文章:truffle:智能合约编译和部署和truffle 101-智能合约开发工具
使用web3j加载合同
现在我们已经在我们的ganach本地块链上部署了一个erc20智能合同,并且我们可以使用web3j erc20实用程序类在java中与它进行交互。
1.创建一个新项目并导入web3j依赖项
在您喜欢的ide中创建一个新的maven项目并导入web3j依赖项(eip支持的核心和合同):
《project xmlns=“http://maven.apache.org/pom/4.0.0” xmlns:xsi=“http://www.w3.org/2001/xmlschema-instance” xsi:schemalocation=“http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”》
《modelversion》4.0.0《/modelversion》
《groupid》io.kauri.tutorials.java-ethereum《/groupid》
《artifactid》java-erc20《/artifactid》
《version》0.0.1-snapshot《/version》
《properties》
《maven.compiler.target》1.8《/maven.compiler.target》
《maven.compiler.source》1.8《/maven.compiler.source》
《web3j.version》4.2.0《/web3j.version》
《/properties》
《dependencies》
《dependency》
《groupid》org.web3j《/groupid》
《artifactid》core《/artifactid》
《version》${web3j.version}《/version》
《/dependency》
《dependency》
《groupid》org.web3j《/groupid》
《artifactid》contracts《/artifactid》
《version》${web3j.version}《/version》
《/dependency》
《/dependencies》
《/project》
2.创建一个新类以加载erc20智能合约wrapper
erc20是一个标准,因此不需要手动生成智能合约wrapper,web3j默认包含它。
但是,您需要将web3j连接到以太坊区块链并配置钱包以签署交易。
在本文中,我们连接到本地ganache区块链(默认情况下在http:// localhost:8545上公开)并使用第一个ganache测试帐户(读取ganache启动日志来查找此信息),在部署期间收到100个jvm令牌。
// connect web3j to the blockchain
string rpcendpoint = “http://localhost:8545”;
web3j web3j = web3j.build(new httpservice(rpcendpoint));
// prepare a wallet
string pk = “0x5bbbef76458bf30511c9ee6ed56783644eb339258d02656755c68098c4809130”;
// account address: 0x1583c05d6304b6651a7d9d723a5c32830f53a12f
credentials credentials = credentials.create(pk);
// load the contract
string contractaddress = “0xe4f275ce131ef87cb8bf425e02d9215055e9f875”;
erc20 javatoken = erc20.load(contractaddress, web3j, credentials, new defaultgasprovider());
对于更复杂的方案,您可以使用erc20.load(contractaddress,web3j,transactionmanager,gasprice,gaslimit)加载具有特定transactionmanager和gas参数的合同。
3.获取令牌信息
一旦我们加载了erc20令牌合约,我们就可以开始请求存储在此合约上的信息,例如jvm令牌中的小数或余额。
以下代码检索我们之前在合约中配置的信息。
string symbol = javatoken.symbol().send();
string name = javatoken.name().send();
biginteger decimal = javatoken.decimals().send();
system.out.println(“symbol: ” + symbol);
system.out.println(“name: ” + name);
system.out.println(“decimal: ” + decimal.intvalueexact());
更重要的是,我们可以检索帐户的令牌余额。
biginteger balance1 = javatoken.balanceof(“0x1583c05d6304b6651a7d9d723a5c32830f53a12f”).send();
system.out.println(“balance (0x1583c05d6304b6651a7d9d723a5c32830f53a12f)=”+balance1.tostring());
biginteger balance2 = javatoken.balanceof(“0x0db6b797e64666d4b36b13e5dc6fcd4661893ac8”).send();
system.out.println(“balance (0x0db6b797e64666d4b36b13e5dc6fcd4661893ac8)=”+balance2.tostring());
帐户0x1583c05d6304b6651a7d9d723a5c32830f53a12f是ganache的第一个帐户,即部署合约并在部署期间收到100个令牌的帐户。而0x0db6b797e64666d4b36b13e5dc6fcd4661893ac8代表ganache的第二个帐户没有收到任何令牌。
转移代币
为了与令牌交互,erc20类提供了所需的所有功能,如transfer,transferfrom和approve。
例如,我们可以通过从配置为凭据的帐户(0x1583c05d6304b6651a7d9d723a5c32830f53a12f)签名并发送一个事务,将25个jvm令牌传输到0x0db6b797e64666d4b36b13e5dc6fcd4661893ac8。
transactionreceipt receipt = javatoken.transfer(“0x0db6b797e64666d4b36b13e5dc6fcd4661893ac8”, new biginteger(“25”)).send();
system.out.println(“transaction hash: ”+receipt.gettransactionhash());
biginteger balance1 = javatoken.balanceof(“0x1583c05d6304b6651a7d9d723a5c32830f53a12f”).send();
system.out.println(“balance (0x1583c05d6304b6651a7d9d723a5c32830f53a12f)=”+balance1.tostring());
biginteger balance2 = javatoken.balanceof(“0x0db6b797e64666d4b36b13e5dc6fcd4661893ac8”).send();
system.out.println(“balance (0x0db6b797e64666d4b36b13e5dc6fcd4661893ac8)=”+balance2.tostring());
收到传输事务的通知
最后,我们将介绍如何订阅erc20合约生成的特定事件,以便我们可以对其中的任何活动做出反应。
您可以通过gettransferevents方法检索给定事务的特定事件:
list《erc20.transfereventresponse》 events = javatoken.gettransferevents(receipt);
events.foreach(event
-》 system.out.println(“from: ” + event._from + “, to: ” + event._to + “, value: ” + event._value));
我们还可以添加rxjava作为依赖项,通过transfereventflowable连续订阅任何新事务。
javatoken.transfereventflowable(defaultblockparametername.earliest, defaultblockparametername.latest)
.subscribe(event
-》 system.out.println(“from: ” + event._from + “, to: ” + event._to + “, value: ” + event._value));

电力电子电路的数字化控制技术
蔡司2018/19财年总营收64.28亿欧元,同比增长11%
新型的智慧城市主要的创新在哪
小米MIX2概念图曝光 你惊艳了吗?
东莞电子信息产业将走向高端
如何使用Web3j库管理Java中的ERC20令牌
维珍大西洋航空公司采用AR/VR技术,可让机组人员提前熟悉飞机的布局
三星S8 Plus的电池容量将与三星Note 7一致:达到了3500mAh
关于低副瓣、超低副瓣天线技术知识
传感器和AI如何协同为农业服务
常用测温仪表的测量范围及特点需要了解
数字Σ-Δ调制器的基本原理及采用FPGA器件实现设计
基于YL-236单片机实训装置的数字电压表的设计方案
因三星提高图像传感器价格,导致全球2024年旗舰手机价格或上涨 ?
微星Z390GAMINGPLUS上手 该有的该要用的都有
射频识别技术漫谈(14)——Mifare S50与S70的存取控制
完整的DDR电源解决方案LTC3876
逆变器如何匹配182/210硅片尺寸的超高功率组件呢?
大热的四轴飞行器设计_软硬件参考方案
一种新的OLED架构-有机发光二极管显示器