Cointime

扫码下载App
iOS & Android

想发行自己的以太坊ERC20代币?教程来了

随着以太坊的普及率日益攀升,制定可靠的跨平台软件应用标准变得至关重要。以太坊改进提案(EIP)通常是人们探讨区块链开发生态系统新标准的途径。其中一项备受瞩目的提案便是可互换代币(fungible token)的标准:ERC-20。作为以太坊中第一个也是最受欢迎的代币标准,ERC-20(又称EIP-20)自2015年面世以来就备受关注。

ERC-20代币标准为开发人员提供了一种便捷的途径,通过智能合约创建可互换的代币(fungible token)。如今,该标准已成为在以太坊区块链上创建代币的流行方式,进而催生了各种各样、用途不一的数字资产。

什么是ERC-20代币标准?

ERC-20标准规定了一系列API方法和事件,以确保采用该标准创建的所有代币与其他以太坊代币具有兼容性。这些API方法包括:

  • totalSupply():返回流通的代币总数;
  • balanceOf(address _owner):查询特定地址的代币余额;
  • transfer(address _to, uint256 _value):从发送者账户向指定接收者转移特定数量的代币;
  • transferFrom(address _from, address _to, uint256 _value):允许第三方将代币从一个账户转移到另一个账户;
  • approve(address _spender, uint256 _value):让代币持有者能够授权第三方代表他们进行代币消费;
  • allowance(address _owner, address _spender):返回允许账户代表代币持有者消费的代币数量。

在ERC-20标准中定义的事件有:

  • Transfer:账户之间转移代币时触发;
  • Approval:当代币持有者批准另一个账户代表他们使用代币时触发。

除了这些方法和事件之外,ERC-20代币还具备以下三个关键字段:

  • name:代币的名称(例如Binance USD);
  • symbol:代币的简称(例如BUSD);
  • decimals:表示余额时支持的小数位数。

  自行创建代币所需的工具

创建一个全新的ERC-20代币并不复杂,您可以使用Remix直接在浏览器中完成所有操作。Remix是一个完整的Solidity开发IDE,可在浏览器上运行,非常适合处理简单的项目。尽管不建议将Remix用于更为复杂的项目,但您可以利用其工具与智能合约互动并构建POC(概念证明),而无需花费大量时间来配置开发环境。

对于更复杂和庞大的项目,使用像Hardhat(适用于JS/TS开发者)或Brownie(适用于Python开发者)这样的框架可能是更佳选择。在本教程中,我们将介绍使用Hardhat创建ERC-20令牌的过程,因此您可以随时深入了解其文档,以获取更多相关信息。

如何创建ERC-20代币

现在让我们开始编写代码,构建全新的ERC-20代币。如果您之前从未使用Solidity创建过智能合约,建议您阅读这篇文章,这是对这个主题的一个很好的入门介绍。

第0步 – 安装全局依赖项(可选)

要使用Hardhat,您需要在计算机上安装NodeJS(以及NPM)。如果尚未安装,请从此处安装。NPM会与NodeJS一起安装,安装完成后,您应该可以从终端使用它们。

步骤1 – 配置开发环境

首先,在项目所在位置创建一个新文件夹。创建文件夹后,运行以下命令:

npx hardhat

如果一切正常,您应该会看到如下内容:

如果您熟悉TypeScript,可以用TS创建项目。但在本文中,我们将选择JavaScript选项。对于接下来的问题,我们将使用默认选项,只需按回车键即可。回答完所有问题后,NPM(Node Package Manager)将完成安装所有项目依赖项的工作,这可能需要一段时间,请耐心等待。

第2步 – 了解项目结构

设置完成后,您可以使用IDE打开项目文件夹,您将看到以下文件夹结构:

Hardhat默认会以这种方式组织新项目:

  • contracts:包含所有相关源代码(Solidity智能合约)的文件夹;
  • scripts:存放与区块链交互的有用脚本的位置;
  • test:一个重要的文件夹,用于存放所有自动化测试,以测试您的合约并提高其安全性;
  • hardhat.config.js:所有Hardhat设置都放在这个文件中;
  • package.json:存储有关项目的一般信息的文件,例如名称、版本和依赖项;
  • package-lock.json:用于存储已安装依赖项版本控制信息的文件。此文件是自动生成的,您永远不应手动编辑此文件。

当然,还有另一个文件夹:node_modules。该文件夹由包管理器自动处理,包含所有外部依赖项。您永远不应手动修改其内容。

如果这是您第一次使用Hardhat,请花些时间查看每个文件夹和文件,以便熟悉这种结构。

第3步 – 安装外部依赖项

正如前文所述,社区讨论并不断完善ERC-20等标准。OpenZeppelin是这个领域最大的组织之一,它是一个重要的参与者,负责开发一些众所周知的标准。我们将使用他们的合约来帮助我们开发ERC-20代币。

为了安装OpenZeppelin的合约,我们将使用以下命令:

npm install @openzeppelin/contracts --save-dev

第4步 – 创建智能合约

安装OpenZeppelin的合约之后,我们需要整理项目文件夹,从contractsscriptstest中删除不必要的内容。清理完项目结构后,我们将在contracts文件夹内创建一个新文件Token.sol

现在我们已经创建了智能合约文件,接下来就需要用实际的代码填充它。让我们从基本结构开始。以下代码将作为构建我们智能合约的基础:

  编写完基础代码后,我们需要从OpenZeppelin导入依赖项并将其用于我们的智能合约。为此,我们应将以下代码添加到文件的顶部(最好放在pragma版本和合约声明之间):  

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

所有依赖项都已加载,现在我们可以在代码中使用它们。让我们的代币合约继承ERC20合约。为此,我们使用is关键字来告诉Solidity合约正在扩展另一个合约。代码应如下所示:

contract Token is ERC20 {

如果您的代码编辑器已经可以与Hardhat正常协作,您可能会看到以下编译错误:

这是因为我们的合约需要实现某些功能并初始化ERC20继承代码。为此,我们将在构造函数中使用它。让我们添加代码来初始化继承的合约代码,如下所示:

代码差不多完成了,还剩一件事:在部署时铸造一些代币。 我们将从 ERC20 调用 _mint 函数以向部署者发送一百万个代币:

现在几乎就是一个功能完善的ERC-20代币了。如果您部署它,它会正常工作并在网络上部署一个供应量为1M的新代币。比想象中的简单,对吧?但现在我们将介绍如何扩展和修改ERC-20标准的一些功能。

第5步 – 修改和扩展默认的ERC-20行为

如今,具有内置税收和奖励等附加功能的代币已经很常见。我们现在将学习如何向智能合约添加一些简单的功能。

修改1:允许用户销毁他们的代币. 

修改2:允许用户通过存入一定数量的以太币来铸造新代币

第6步 – 编译和部署

在构建和运行部署脚本之前,请安装dotenv以管理项目中的密钥:

npm install dotenv --save-dev

为了将我们的合约部署到区块链,我们将在scripts文件夹中创建一个deploy.js文件:

创建脚本后,我们需要添加钱包的私钥以便在区块链上进行实际交易。为此,请按照以下方式编辑hardhat.config.js文件:

现在您需要输入钱包的助记词,以便用于验证智能合约并将其部署到网络。在项目的根目录中创建一个.env文件,内容如下:

MNEMONIC=rifle enter coyote much acid smooth dolphin stairs south cattle immense paper

完成后,我们应该能够运行部署脚本,使用以下命令:

npx hardhat run scripts/deploy.js --network goerli

以下是预期输出:

现在我们可以在区块链浏览器中找到合约:

https://goerli.etherscan.io/token/0x454337827f119cdd56e2962ef40a4ccc1a44bc63#code

接下来我们将验证合约的源代码。最简单的方法是将合约代码扁平化(将所有智能合约合并到一个文件中)并将其上传到Etherscan。让我们开始:

npx hardhat flatten > output.sol

在提交代码之前,扁平化文件可能存在一个问题:它包含多个SPDX许可证标识符。为了解决这个问题,我们将从文件中删除除第一行之外的所有SPDX行。

解决问题后,我们将其复制粘贴到 Etherscan 验证步骤中:

如果一切正确,您将看到此消息:

现在合约代码已经过验证,并且对所有用户公开可见。

合规问题

遵循所有ERC-20标准至关重要。ERC-20的指定行为得到了所有将ERC-20代币作为软件一部分实施的来源的信任。例如,在用户之间执行转账时,您应该且只应该发出Transfer事件。这些事件被视为资金在账户之间转移的证据,如果执行不当,可能会导致交易所和钱包在跟踪交易和余额方面遇到问题。

处理ERC-20代币时,还会预期发生其他一些行为。例如:

  • 转账应该返回一个代表交易成功的布尔值;
  • 零代币的转移应被视为正常转账并发出Transfer事件;
  • 铸币和销毁被视为转账,因此它们应该发出一个Transfer事件。铸造新代币时,_from0x0。销毁时,_to0x0

始终参考原始文档,以避免构建违反ERC-20标准的合约。

最后的话

正如本文所述,创建ERC-20代币智能合约可能很简单,但仍然具有挑战性,应遵循规则以避免出现问题。检查合约合规性的一种好方法是编写自动化测试。Hardhat提供了一套很好的测试工具,您可以用来测试智能合约可能遇到的所有情况。毫不犹豫地创建大量测试,以确保覆盖每一个可能的情况。

对于开发人员来说,文档永远是您最好的朋友。记住查阅官方语言文档和框架规范。玩得开心,快将您的新代币分享出去!

评论

所有评论

推荐阅读