玩转Web3:编写ERC20的Token合约并发布使用

玩转Web3:编写ERC20的Token合约并发布使用

大家好,本章是 《玩转Web3》 的第二章,我们开始使用 Solidity 这个智能合约语言进行 ERC20 合约编写,最终我们会把我们的合约发布到我们构建好的联盟链上。

ERC标准介绍

ERC 是以太坊开发者们提交的提案,确定一些区块链设计上的标准,例如,我们最熟知的 ERC20ERC721 ... 等等,我们先大致了解常见标准的名称和作用,然后详细介绍 ERC20标准。

常见ERC标准

名称 核心作用 详细描述
ERC-20 标准Token接口 只要Token符合ERC-20标准,那么它将兼容以太坊钱包,可以相互转账,流通
ERC-721 NFT 在ERC-721标准里,每个Token都是独一无二的,例如数字资产:图片、音乐、文件等都可以
ERC-1155 更适合区块链游戏的NFT ERC-1155可以在一个智能合约中定义多个物品(Token),ERC-1155还可以用来把多个物品(Token)合并打包成一个物品(Token包)。ERC-1155融合了ERC-20和ERC-721的一些优点,开发者可以很方便的创建海量种类的物品,每个物品可以是ERC-721那样独立的,也可以像ERC-20一样同质化。
ERC-809 可租用的NFT 是一种租用NFT的标准,通过创建一个API来允许用户租用任一“可租赁”的NFT,简单来说,就是在ERC-721协议的基础上增加了租用功能。与其他不同的是,ERC-809标准具有排他性,当一人完成对某一NFT的租赁之后,那么其他用户便无法再去访问或使用该NFT。
ERC-998 可拆解的ERC-721 ERC-998名叫可拆解非同质化代币(Composable NFT,缩写为CNFT)。它的设计可以让任何一个NFT可以拥有其他NFT或FT。转移CNFT时,就是转移CNFT所拥有的整个层级结构和所属关系。简单来说就是一个ERC-998的物品可以包含多个ERC-721和ERC-20形式的物品

ERC20介绍

ERC20 标准是一种代币标准,这个标准让我们这些开发者可以在以太坊区块链上开发属于自己的代币,这个标准定义了开发者应该实现代币的一些基础功能,例如:

  • 设定代币名称
  • 设定代币总量
  • 规定小数点位数
  • 规范如何批准代币交易
  • 将代币从一个账户转到另一个账户
  • 获取帐户的当前代币余额
  • 获取网络上可用代币的总供应量
  • 批准一个账户中一定的代币金额由第三方账户使用

...等等

想了解更清楚的可以通过 ERC20标准的确定文档: https://eips.ethereum.org/EIPS/eip-20

代币只有按照标准才可以被各种以太坊钱包、地址、智能合约兼容,才可以成为生态的一部分,以上的标准都会在代码中体现出来,即程序中的接口或者抽象类,让我们一起看看吧:

// 确定代币名称
function name() public view returns (string);
// 代币符号(代币简称)
function symbol() public view returns (string);
// 规定小数点位数
function decimals() public view returns (uint8);
// 设定代币总量
function totalSupply() public view returns (uint256);
// 查看地址代币余额
function balanceOf(address _owner) public view returns (uint256 balance);
// 转账给其他账户
function transfer(address _to, uint256 _value) public returns (bool success);
// 提取approve授予的token(提取额度、提取津贴)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
// 批准给某个地址一定数量的token(授予额度、授予津贴)
function approve(address _spender, uint256 _value) public returns (bool success);
// 查询owner给spender的额度(总配额)
function allowance(address _owner, address _spender) public view returns (uint256 remaining);

// token转移事件
event Transfer(address indexed _from, address indexed _to, uint256 _value);
// 额度批准事件
event Approval(address indexed _owner, address indexed _spender, uint256 _value);

上面是 ERC20 在代码中的展示形式,OpenZeppelin 实现了这些接口的基本逻辑,避免开发者开发出不安全的合约,我们可以通过继承 OpenZeppelin 合约进行快速开发,通过这些了解,相信大家也对整个标准有了一定的了解,让我们开始今天的文章吧。

开篇

在开始本章之前,我们要介绍一下我们这次会使用到的工具:

  • solidity 在线 IDE Remix: https://remix.ethereum.org/
  • 快速启动个人以太坊区块链系统,很方便测试的 Ganache: https://trufflesuite.com/ganache/ (需要下载)
  • 一个用于安全智能合约开发的库 OpenZeppelin Contracts : https://github.com/OpenZeppelin/openzeppelin-contracts (它实现了ERC系列的相关接口以及提供了安全使用的合约库)

我们在进行合约测试时会使用 Ganache,所以我们需要提前下载,我们的操作流程如下:

  • 利用 Remix 实现 OpenZeppelinERC-20 合约
  • 部署到 Ganache 上进行测试
  • Metamask 进行连接 Ganache 网络,导入账户进行代币操作
  • 部署到我们之前的联盟链上

实现ERC20部署到Ganache环境中

我们通过在线 IDE 建立一个 aop.sol ,用来编写我们的合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 导入 openzeppelin ,在线IDE中会自动下载,稍等在 .deep 文件夹中就可以看见了
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract AOP is ERC20 {

    // 继承ERC20,传入父类的构造函数参数,设置 token 名称 和简称
    constructor(uint initialSupply) ERC20("AOP", "AOP") {
        _mint(msg.sender, initialSupply);
    }

    // 我们这直接就不要小数点了 0位
    function decimals() public view virtual override returns (uint8) {
        return 0;
    }
}

  • 然后打开 Ganache

  • 查看 Ganache 这个交易是否成功,可以看到,合约已经创建成功了,账户的余额也变少了,因为需要 gas

部署成功之后,我们可以利用 Remix 编辑器在线调试合约

  • 我们查看一下我账户上代币的余额,刚好是我设置的 10w,用哪个账户部署的合约,代币就在哪个账户上

Metamask进行代币操作

Metamask 中添加 Ganache 的网络,并且导入两个 Ganache 中的地址,方便我们利用小狐狸进行操作,添加网络就不说了,上篇文章有说到,
导入直接通过小狐狸选择私钥导入即可,我随机挑了一个和创建合约的地址一起导入了进来 合约地址需要保存一下哦,每次部署都会有不一样的合约地址的

0xFd0DBDb5E7b5aF600012390F5bf57F080C401d82 合约账户地址
0xa010CE74c32445165bDb8F3c3E5CA372950cfeF4 其他地址

导入账户之后,是看不到我们的合约代币的,我们需要通过导入代币


  • 发送给另外一个账户

另一个账户地址也需要导入代币哦,所以,合约地址不要弄丢了哦

部署到联盟链

  • 切换 Web3 Provider
  • 连接联盟链 RPC ip+端口
  • 选择一个有 eth 的账户
  • deploy (有可能会失败,需要先解锁账户)
  • 然后到 console 上进行 miner
  • metamask 添加代币查看即可

您的支持是对我最大的鼓励!

发表于: 作者:憧憬。
关注互联网以及分享全栈工作经验的原创个人博客和技术博客,热爱编程,极客精神
Github 新浪微博 SegmentFault 掘金专栏