知世金融网专注于股票行情,期货开户,外汇储备等最新相关资讯信息提供投资者参考学习!

当前位置:网站首页 > 区块链 > 正文

使用Web3j管理Java中的ERC20令牌

原创
文章作者
知世-金融领域资深作者
知名金融领域作者,从事金融超过十余年,在行业内有一定影响力。
金融风险管理师认证证书 常识职业资格认证 特许金融分析师 国际金融理财师认证证书
发布时间:2020-02-16 18:30:58 发布来源:区块链研究实验室 文章点击:103

在本文中,我们将学习如何使用Web3j库管理Java中的ERC20(Fungible)令牌。 ERC20是以太坊智能合约标准,用于以兼容的方式实现令牌,因此很容易与任何应用程序(DAPP、钱包、交换等)交互...

目录

    本文标题使用Web3j管理Java中的ERC20令牌,作者:知世,本文有2798个文字,大小约为10KB,预计阅读时间7分钟,请您欣赏。知世金融网众多优秀文章,如果想要浏览更多相关文章,请使用网站导航的搜索进行搜索。本站虽然不乏优秀之作,但仅作为投资者学习参考。

    在本文中,我们将学习如何使用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-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));

    本文相关推荐: 区块链专业名词解释:支付令牌/ Payment Tokens

    以上便是知世金融网给大家分享的关于使用Web3j管理Java中的ERC20令牌/qkl/27039.html的相关信息了,希望能帮助到大家,更多金融相关信息,敬请关注知世金融网!

    网站内容均来自互联网,如侵害您的利益联系客服进行删除!

    关键词:令牌
    (0)
    (0)

    上一篇:基于POW共识的小矿币最后会是什么结局?

    下一篇:太自由的市场,最终会因自由毁灭

    本文标题:使用Web3j管理Java中的ERC20令牌

    本文地址:/index.php?s=article&c=search&keyword=%E4%BB%A4%E7%89%8C

    金融知名领域

    南方财富网 | 金融界 | 金融界 |

    更多推荐

    • 茅台吃饱,经销商哭倒
      茅台吃饱,经销商哭倒
    • 汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
      汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
    • 158亿元!比亚迪收购!
      158亿元!比亚迪收购!
    • 9月价格回落近五成 “冷静期”酒店业备战“十一”市场
      9月价格回落近五成 “冷静期”酒店业备战“十一”市场
    • 2023哈马博览会哈尔滨银行展区精彩纷呈
      2023哈马博览会哈尔滨银行展区精彩纷呈
    • 大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
      大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
    • A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
      A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
    • 最新!巨头出手,加仓宁王51%
      最新!巨头出手,加仓宁王51%
    • 600亿巨头暴雷
      600亿巨头暴雷
    • 一天32家!科创板回购潮涌来
      一天32家!科创板回购潮涌来
    • 提振信心实招来了!30余家上市公司密集出手 最高要买10亿
      提振信心实招来了!30余家上市公司密集出手 最高要买10亿
    • 高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成
      高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成

    新闻资讯栏目

    站长QQ: 2397470084