ERC20是以太坊智能合約標準,用于以兼容的方式實現令牌,因此很容易與任何應用程序(DAPP、錢包、交換等)交互和集成令牌。
?
先決條件
要學習本教程,您需要在計算機上安裝以下軟件:
·包和依賴關系管理器,例如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));
評論