使用Web3j管理Java中的ERC20令牌

買賣虛擬貨幣
在本文中,我們將學習如何使用Web3j庫管理Java中的ERC20(Fungible)令牌。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-exact3.建立合同檔案./contracts/JavaToken.sol智慧合約繼承了可重用的OpenZeppelin合約ERC20Mintable的所有功能和規則。我們只需要配置以下常量變數,如下所示:
// JavaToken.solpragma 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.jsconst 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.jsmodule.exports = {  networks: {
    development: {      host: "localhost",      port: 8545,      network_id: "*"    }  }
};要在GANACHE網路上部署智慧合約,請執行以下命令(不要忘記預先啟動GANACHE CLI):$ truffle migrate --network developmentCompiling 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.clangStarting migrations...======================
> Network name: 'development'> Network id: 1565778588423> Block gas limit: 0x6691b71_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 ETH2_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 ETHSummary
=======> 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智慧合約wrappererc20是一個標準,因此不需要手動生成智慧合約wrapper,web3j預設包含它。但是,您需要將Web3j連線到以太坊區塊鏈並配置錢包以簽署交易。在本文中,我們連線到本地Ganache區塊鏈(預設情況下在http:// localhost:8545上公開)並使用第一個Ganache測試帳戶(讀取Ganache啟動日誌來查詢此資訊),在部署期間收到100個JVM令牌。
// Connect Web3j to the BlockchainString rpcEndpoint = "http://localhost:8545";Web3j web3j = Web3j.build(new HttpService(rpcEndpoint));// Prepare a walletString pk = "0x5bbbef76458bf30511c9ee6ed56783644eb339258d02656755c68098c4809130";// Account address: 0x1583c05d6304b6651a7d9d723a5c32830f53a12f
Credentials credentials = Credentials.create(pk);// Load the contractString 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));

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;