当前位置:首页 > 物联网 > 区块链
[导读] ERC20是以太坊智能合约标准,用于以兼容的方式实现令牌,因此很容易与任何应用程序(DAPP、钱包、交换等)交互和集成令牌。   先决条件 要学习本教程,您需要在计

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));

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭