随着以太坊的普及率日益攀升,制定可靠的跨平台软件应用标准变得至关重要。以太坊改进提案(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的合约之后,我们需要整理项目文件夹,从contracts、scripts和test中删除不必要的内容。清理完项目结构后,我们将在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
以下是预期输出:

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

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

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

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

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

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

合规问题
遵循所有ERC-20标准至关重要。ERC-20的指定行为得到了所有将ERC-20代币作为软件一部分实施的来源的信任。例如,在用户之间执行转账时,您应该且只应该发出Transfer事件。这些事件被视为资金在账户之间转移的证据,如果执行不当,可能会导致交易所和钱包在跟踪交易和余额方面遇到问题。
处理ERC-20代币时,还会预期发生其他一些行为。例如:
- 转账应该返回一个代表交易成功的布尔值;
- 零代币的转移应被视为正常转账并发出Transfer事件;
- 铸币和销毁被视为转账,因此它们应该发出一个Transfer事件。铸造新代币时,
_from为0x0。销毁时,_to为0x0。
始终参考原始文档,以避免构建违反ERC-20标准的合约。
最后的话
正如本文所述,创建ERC-20代币智能合约可能很简单,但仍然具有挑战性,应遵循规则以避免出现问题。检查合约合规性的一种好方法是编写自动化测试。Hardhat提供了一套很好的测试工具,您可以用来测试智能合约可能遇到的所有情况。毫不犹豫地创建大量测试,以确保覆盖每一个可能的情况。
对于开发人员来说,文档永远是您最好的朋友。记住查阅官方语言文档和框架规范。玩得开心,快将您的新代币分享出去!
所有评论