创建 ERC-20 供应 - OpenZeppelin 文档

本文介绍了如何使用 OpenZeppelin Contracts 创建具有自定义供应机制的 ERC-20 代币。文章展示了两种使用 OpenZeppelin Contracts 的方法,包括创建固定供应量的代币,以及奖励矿工的代币供应机制。此外,还介绍了如何使用 _update 函数在每次代币转账时自动奖励矿工。

创建 ERC-20 供给

在本指南中,你将学习如何创建一个具有自定义供给机制的 ERC-20 token。我们将展示两种使用 OpenZeppelin Contracts 来实现此目的的惯用方法,你能够将其应用于你的智能合约开发实践。

以太坊上构建的 token 实现的标准接口称为 ERC-20,Contracts 包含一个广泛使用的实现:恰如其名的 ERC20 合约。这个合约,就像标准本身一样,非常简单和基础。事实上,如果你尝试按原样部署一个 ERC20 实例,它将毫无用处……它将没有供给!没有供给的 token 有什么用?

供给的创建方式未在 ERC-20 文档中定义。每个 token 都可以自由地尝试自己的机制,从最去中心化的到最中心化的,从最天真的到最有研究的等等。

固定供给

假设我们想要一个固定供给为 1000 的 token,最初分配给部署合约的账户。如果你使用过 Contracts v1,你可能编写过如下代码:

contract ERC20FixedSupply is ERC20 {
    constructor() {
        totalSupply += 1000;
        balances[msg.sender] += 1000;
    }
}

从 Contracts v2 开始,这种模式不仅不被鼓励,而且是被禁止的。变量 totalSupplybalances 现在是 ERC20 的私有实现细节,你不能直接写入它们。相反,有一个内部 _mint 函数可以做到这一点:

contract ERC20FixedSupply is ERC20 {
    constructor() ERC20("Fixed", "FIX") {
        _mint(msg.sender, 1000);
    }
}

像这样封装状态可以更安全地扩展合约。例如,在第一个例子中,我们必须手动使 totalSupply 与修改后的余额保持同步,这很容易忘记。事实上,我们省略了另一件容易被遗忘的事情:标准要求的 Transfer 事件,并且一些客户端依赖此事件。第二个例子没有这个错误,因为内部 _mint 函数会处理它。

奖励矿工

内部 _mint 函数是关键的构建块,它允许我们编写实现供给机制的 ERC-20 扩展。

我们将实现的机制是为生产以太坊区块的矿工提供 token 奖励。在 Solidity 中,我们可以访问全局变量 block.coinbase 中当前区块矿工的地址。每当有人在我们的 token 上调用函数 mintMinerReward() 时,我们将向该地址 mint 一个 token 奖励。该机制听起来可能很傻,但你永远不知道这会产生什么样的动态,值得分析和实验!

contract ERC20WithMinerReward is ERC20 {
    constructor() ERC20("Reward", "RWD") {}

    function mintMinerReward() public {
        _mint(block.coinbase, 1000);
    }
}

正如我们所看到的,_mint 使正确地执行此操作变得非常容易。

自动化奖励

到目前为止,我们的供给机制是手动触发的,但 ERC20 也允许我们通过 _update 函数扩展 token 的核心功能。

在上一节的供给机制的基础上,我们可以使用这个函数为区块链中包含的每个 token 转移 mint 一个矿工奖励。

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract ERC20WithAutoMinerReward is ERC20 {
    constructor() ERC20("Reward", "RWD") {
        _mintMinerReward();
    }

    function _mintMinerReward() internal {
        _mint(block.coinbase, 1000);
    }

    function _update(address from, address to, uint256 value) internal virtual override {
        if (!(from == address(0) && to == block.coinbase)) {
            _mintMinerReward();
        }
        super._update(from, to, value);
    }
}

总结

我们已经了解了如何实现 ERC-20 供给机制:通过内部的 _mint。希望这能帮助你理解如何使用 OpenZeppelin Contracts 及其背后的一些设计原则,并且你可以将它们应用到你自己的智能合约中。

← ERC-20

ERC-721 →

  • 原文链接: docs.openzeppelin.com/co...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。