如何在以太坊上创建迷因币(MEME)?
在文中,我们将开启一段激动人心的学习之旅,探讨如何使用OpenZeppelin和Remix集成开发环境(IDE)创建迷因币。您应该已经看过无数关于创建代币的视频和文章,但大多数都需要较长的引入才能切入主题。我们将直接开始!
什么是迷因币?
迷因币是一种加密货币,通常是因为一个玩笑或出于娱乐目的而创建。尽管如此,这类代币仍然可以获得巨大的关注度和实际的价值。它们通常基于互联网迷因,没有真正的用途或价值,严重依赖社区的支持。一个取得巨大成功的迷因币是源于一个玩笑而诞生的狗狗币,获得了巨大的知名度和价值。
迷因币创建步骤
我们将遵循以下步骤创建迷因币:
使用OpenZeppelin生成代币代码。
复制代码并将其粘贴到Remix集成开发环境。
在Remix中编译合约。
将合约从Remix部署到以太坊区块链。
在Etherscan上验证合约。
为去中心化交易所(如Uniswap)添加流动性。
我们将逐步介绍以上步骤的执行过程,确保您更好地理解每个阶段。更重要的是,您将快速有效地学习到核心知识。
准备工作
开始之前,请确保已经安装并设置好MetaMask钱包。您将需要MetaMask钱包与以太坊区块链交互。此外,您还需要熟悉OpenZeppelin和Remix集成开发环境,这两个工具是用来生成和部署代币合约的。
请注意:虽然迷因币的创建过程会比较有趣,但我们应该确保负责任且合乎道德地进行。迷因币可以快速获得现实世界的价值并吸引投资者。因此,负责和透明地管理您的项目非常重要。
使用OpenZeppelin向导生成LearnCoin(LC)代码
什么是OpenZeppelin向导?
OpenZeppelin向导是一个用户友好型工具,可利用OpenZeppelin合约库帮助创建、自定义和部署智能合约。它的界面简单直观,您可以通过填写特定的详细信息和选择所需的功能来生成代币代码。
生成LearnCoin代码
详细步骤如下:
代币类型选择“ERC20”。ERC20是以太坊区块链上常见的代币类型。这些代币遵守一套规则和标准,确保它们能与以太坊网络上的其他代币和去中心化应用(dApp)顺利交互。

配置以下设置:
Name:代币名称。在本例中为“LearnCoin”。
Symbol:代币符号。我们使用“LC”作为LearnCoin的代币符号。
Premint:您希望最初铸造的LearnCoin代币数量(在本例中,我们将其配置为与比特币一样,2100万)
选择您想要包含的功能:
Mintable:特权帐户将能够创造更多供应。
Burnable:此功能可以销毁代币,从而减少总供应量。
Pausable:特权帐户将能够暂停标记为whenNotPaused的功能,适用于紧急情况响应。
Permit:代币持有人可以允许第三方在不支付gas费的情况下从他们的账户转移代币。
Votes:跟踪历史余额,用于链上治理的投票,并将投票权委托给受信任的帐户。
Flash Minting:内置闪电贷款功能。只要在同一笔交易中归还,就可以借出代币而不需要抵押品。
Snapshots:特权账户将能够存储后续可检索的余额快照。对于链上投票,建议选择”Votes”功能。
访问控制:
Ownable:此功能赋予帐户(所有者)独家功能。
Roles:此功能可以为不同地址分配权限。
可升级性:此功能可以在不丢失存量数据的情况下升级智能合约。
Transparent:此功能使合约的治理更加透明。
UUPS:这是一种使用最小存储且需要更少gas的升级机制。
Security Contact:这是可以报告合约中潜在安全问题的电子邮件地址。
License:这是您的项目将使用的开源许可证。
我们配置好的代币将显示如下:

单击“Open in Remix”,在Remix中打开并开始创建代币代码。

进入Remix集成开发环境后,在左侧的Compiler页面上,单击“Advanced Configurations”并选中“Enable Optimization”。设置完成后,您就可以开始编译合约了。
恭喜!您现在已经拥有一个完整的、自定义的ERC20代币合约,接下来便可以在以太坊网络上进行部署!
请注意:OpenZeppelin向导生成的代码基于OpenZeppelin合约库,该库是安全和标准化智能合约代码的可信来源。尽管如此,在部署代码之前,您仍需对代码进行仔细审查和测试。
在Goerli测试网上部署LearnCoin(LC)
现在我们已经给我们的ERC20迷因币生成了代码,接下来就需要部署它。将它部署到以太坊主网之前,我们先在Goerli测试网上进行部署,这样便能够在无风险的环境中对代币进行测试。
什么是Goerli测试网?
Goerli测试网是以太坊的测试网之一,开发人员在将去中心化应用部署到主以太坊主网之前,会用Goerli测试网进行测试。与其他以太坊测试网一样,Goerli测试网与主网的运作方式类似,但测试网上的以太币没有真正的价值。
使用Goerli测试网能够确保代币按我们的预期运行,而无需花费真正的以太币,是开发和部署智能合约的关键步骤。
获取测试网以太币
在部署代币之前,我们需要在Metamask钱包中存入一些以太币。由于我们使用的是测试网,我们将使用可以免费获得的测试网以太币。

首先,您需要确保您的Metamask上有Goerli测试网。如果没有,只需单击“Add Network(添加网络)”并按照说明进行操作即可。您也可以直接使用此网站进行快速添加。
要获得免费的测试网以太币,请访问Goerli Faucet。
按照网站上的说明在您的MetaMask钱包中接收免费的测试网以太币。
完成后您应该会看到这样的屏幕。您将收到0.02 GoerliETH

确保您的MetaMask钱包已连接到Goerli测试网。
部署合约
接下来,我们将使用Remix集成开发环境在Goerli测试网上部署合约:
返回到Remix集成开发环境。
单击屏幕左侧的“Deploy & run transactions”图标。

在下拉菜单中将环境设置为“Injected Provider - Metamask”。此选项将连接到Metamask(再次确认您的MetaMask钱包已连接到Goerli测试网)。
在“Contract”下拉菜单中,选择“LearnCoin”(编译成功后,您的合约将在此处显示)。

单击“Deploy”。

您应该已经从Goerli faucet收到了GoerliETH。您可以在Metamask上确认您的交易,并等待它在Goerli测试网上确认!交易确认后,您的合约将被部署到Goerli测试网!您的Remix控制台须如下图所示:

单击“View on Etherscan”便能找到您部署的合约。
恭喜!您已经在一个安全的测试网环境中创建了自己的ERC20代币!您可以在这里查看我们创建的Learn Coin迷因币:https://goerli.etherscan.io/address/0x70a1704f22c476d64c6dfd5ad2e1a75dc2928cf0
LearnCoin合约详解
合约结构
以下是我们的LearnCoin完整合约:
Python
// SPDX-License-Identifier: None
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20FlashMint.sol";
contract LearnCoin is ERC20, ERC20Burnable, ERC20Snapshot, AccessControl, Pausable, ERC20Permit, ERC20Votes, ERC20FlashMint {
bytes32 public constant SNAPSHOT_ROLE = keccak256("SNAPSHOT_ROLE");
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
constructor() ERC20("Learn Coin", "LC") ERC20Permit("Learn Coin") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(SNAPSHOT_ROLE, msg.sender);
_grantRole(PAUSER_ROLE, msg.sender);
_mint(msg.sender, 21000000 * 10 ** decimals());
}
function snapshot() public onlyRole(SNAPSHOT_ROLE) {
_snapshot();
}
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
// The following functions are overrides required by Solidity.
function _afterTokenTransfer(address from, address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._afterTokenTransfer(from, to, amount);
}
function _mint(address to, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._mint(to, amount);
}
function _burn(address account, uint256 amount)
internal
override(ERC20, ERC20Votes)
{
super._burn(account, amount);
}
}
我们部署的合约是一个名为LearnCoin的ERC20代币合约。它包含了OpenZeppelin合约库中的多个功能,如可销毁代币、快照、访问控制、可暂停代币、许可、投票和闪电铸币。
合约import语句
合约开头的import语句是从OpenZeppelin的合约库中导入代码:
ERC20.sol是ERC20代币的基础合约。
ERC20Burnable.sol使代币持有者能够销毁自己的代币。
ERC20Snapshot.sol支持创建代币余额的快照。
AccessControl.sol是一个用于管理对某些功能的访问权限的合约模块。
Pausable.sol可以暂停和取消暂停代币传输。
ERC20Permit.sol使持有者能够通过许可(permits)使用用户的代币。
ERC20Votes.sol为代币添加了投票功能。
ERC20FlashMint.sol可以实现快速铸造代币。
LearnCoin合约声明
LearnCoin合约继承了导入的OpenZeppelin合约。因此,LearnCoin合约将拥有OpenZeppelin合约的所有方法和属性。
角色声明
SNAPSHOT_ROLE和PAUSER_ROLE是常量值(使用keccak256哈希函数创建),表示合约中访问控制的特定角色。
构造函数
部署LearnCoin合约时,会调用构造函数。构造函数设置了代币的名称和符号,授予部署帐户(msg.sender)管理员、快照者和暂停者角色,并铸造了一定数量的初始代币供部署账户使用。
其他函数
snapshot,pause和unpause是允许具有相应角色的帐户执行某些操作的函数。snapshot函数可以创建快照,pause和unpause函数可以停止和重新启动代币转账。
重写
函数_beforeTokenTransfer、_afterTokenTransfer、_mint和_burn是从父合约重写的内部函数。它们执行LearnCoin合约的自定义逻辑。
_beforeTokenTransfer:在代币转账之前调用此函数,确保代币转账不会暂停。
_afterTokenTransfer:在代币转账之后调用此函数。此处,它是一个空函数,但可用于转账后立即执行的自定义逻辑。
_mint:此函数用于创建新代币并将其分配给给定的帐户。
_burn:此函数用于销毁来自给定帐户的代币。
运行LearnCoin合约
在之前的课程中,我们讨论了LearnCoin合约的结构,以及如何在Goerli测试网上部署该合约。在本章中,我们将带领大家在Remix以太坊集成开发环境中运行合约。
LearnCoin合约中有多个函数,您可以调用这些函数来执行不同的操作,例如暂停代币转账、取消暂停、创建快照等,但并非所有函数都可供所有用户使用。有些函数只能由具有特定角色的帐户(如合约所有者)调用。
我们来逐个分析各个函数的用法。在Remix左侧的面板中,单击“Deploy & Run Transactions”按钮,然后在下方找到已部署的合约。您将看到如下内容:

以上您可以调用或不能调用的所有函数。
合约函数介绍
LearnCoin合约包括一组可以从Remix集成开发环境调用的公共函数:
pause():可以调用此函数来暂停所有代币转账。它只能由具有PAUSER_ROLE(暂停者角色)的帐户调用。
unpause():可以调用此函数来取消暂停代币转账。它也只能由具有PAUSER_ROLE(暂停者角色)的帐户调用。
snapshot():此函数用于获取代币当前余额的快照。它只能由具有SNAPSHOT_ROLE(快照者角色)的帐户调用。
decimals():此函数返回代币使用的小数位数-通常为18。这是一个只读函数,任何人都可以调用。
DEFAULT_ADMIN_ROLE():该函数返回默认的管理员角色。这是一个只读函数,任何人都可以调用。
DOMAIN_SEPARATOR()、EIP712DOMAIN()、name()、PAUSER_ROLE()、SNAPSHOT_ROLE()、symbol()、totalSupply():这些都是只读函数,返回合约的各种信息。任何人都可以调用。
以下函数可以直接通过Remix集成开发环境来使用:
暂停和取消暂停代币转账
要暂停所有代币转账,请点击pause()函数。该函数只能由合约所有者调用,您需要通过MetaMask确认交易。
取消暂停的方式与暂停类似。只需点击unpause()函数并确认交易。
创建快照
要创建代币余额的快照,请点击snapshot()函数并确认交易。
查看合约信息
您可以通过调用以下函数查看合约的各种信息:
decimals():查看代币使用的小数位数。
DEFAULT_ADMIN_ROLE():查看默认管理员角色。
DOMAIN_SEPARATOR()、EIP712DOMAIN()、name()、PAUSER_ROLE()、SNAPSHOT_ROLE()、symbol()、totalSupply():查看合约的各种详细信息。
您可以通过单击Remix集成开发环境中的名称来调用这些函数。
例如,您可以通过单击totalSupply,查看代币的总供应,输出结果将显示如下:

结论
我们首先介绍了迷因币的概念。随后,我们深入探讨了OpenZeppelin,OpenZeppelin是经过严格测试的安全的智能合约模板。同时,我们还演示了如何利用OpenZeppelin向导创建具有各种功能的个性化ERC20代币。接下来,我们以LearnCoin合约为例,重点介绍了其独特的属性和功能,包括合约所包含的各种角色和函数,帮助大家更好地掌握如何利用这些函数进行有效的代币管理。