Web3空间移动很快!但是,这很棒,这意味着大多数指南如何创建ERC-20代币正在使用过时的版本和使用折衷的功能(例如Rinkeby testnet)。因此,这是2022年11月写的更新的拍摄...
这是我们要做的:
- 利用OpenZeppelin的安全和社区审查的合同来创建ERC-20代币。
- 使用Truffle的工具套件来编译和部署合同在本地的以太坊网络,然后与各种方法进行交互。
- 利用Infura的Web3基础架构平台将合同部署到Goerli testnet。
- 在Etherscan上找到新部署的令牌并将令牌导入MetaMask。
项目设置
先决条件:安装松露(在写作时,我正在使用truffle@5.6.3
):
npm install -g truffle
注意:为了此演示,我会称呼token MyToken
,因此,每当我引用MyToken
时,请用任何想要的令牌名称替换为。
1)初始化一个裸露的项目模板和cd
:
truffle init MyToken && cd MyToken
2)安装openzeppelin,以便我们可以利用他们的智能合约:
npm install @openzeppelin/contracts
3)在您选择的编辑器中打开项目(如果您使用VSCODE,可能会使用已设置的任何快捷方式或手动打开它)
)创建令牌
花点时间查看项目结构,您会注意到以下内容:
contracts/
:坚固合同目录
migrations/
:可脚本部署文件目录
test/
:测试文件的目录用于测试您的应用程序和合同
truffle.js
:松露配置文件
在contracts/
中创建一个名为MyToken.sol
的文件。 .sol
扩展名表示Solidity,这是实现我们将要使用的智能合约的面向对象的语言。
在MyToken.sol
中添加以下内容:
MyToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
- 第一行表示合同使用的许可证标识符。 SPDX许可证标识符是在v0.6.8中引入的。
-
pragma
是指定文件应使用的编译器版本的指令。 - 导入行正在导入this file的内容,该内容可在我们的
node_modules
中提供,从较早的openzeppelin中进行。
现在是时候创建合同:
MyToken.sol
// ...
contract MyToken is ERC20 {
constructor(
string memory name,
string memory symbol,
uint initialSupply
) ERC20(name, symbol) {
require(initialSupply > 0, "Initial supply has to be greater than 0");
_mint(msg.sender, initialSupply * 10**18);
}
}
上面的一些注释:
- 合同是与
is
关键字的Openzeppelin ERC20合同中的inheriting。 - 构造函数正在接收
name
,symbol
和initialSupply
,我们将稍后从部署传递。 - 在使用
require
进行快速验证后,我们使用的是已从OpenZeppelin继承的_mint
函数来发出令牌。 -
initialSupply * 10**18
代表了18个小数的平衡。为什么?因为小数不受固体和EVM的支持。以同样的方式,1 ETH由其天然单位的10^18代表(1乙醚= 1,000,000,000,000,000 wei),我们将为令牌做同样的事情。这使我们可以发送任意金额(例如0.0004 mytoken)。
配置松露
在一个新创建的松露项目中,有很多样板可以帮助您开始,您可以将其减少到此:
truffle-config.js
require("dotenv").config();
const { MNEMONIC, PROJECT_ID } = process.env;
const HDWalletProvider = require("@truffle/hdwallet-provider");
module.exports = {
networks: {
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 9545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
goerli: {
provider: () =>
new HDWalletProvider(
MNEMONIC,
`https://goerli.infura.io/v3/${PROJECT_ID}`,
),
network_id: 5, // Goerli's id
confirmations: 2, // # of confirmations to wait between deployments. (default: 0)
timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
skipDryRun: true, // Skip dry run before migrations? (default: false for public nets )
},
},
compilers: {
solc: {
version: "0.8.17",
},
},
};
接下来:
1)安装HDWalletProvider:
npm install @truffle/hdwallet-provider
.
2)安装dotenv:
npm install dotenv
.
3)在项目目录的根目录中创建一个.env
文件,并具有以下内容:
MNEMONIC=
PROJECT_ID=
(不要忘记将.env
文件添加到您的.gitignore
!)
是时候填充MNEMONIC
&PROJECT_ID
值...
从metamask获取助记符
先决条件:如果您尚未得到它,请从https://metamask.io/download/安装MetAmask浏览器。
1)关注these instructions以揭示您的秘密恢复短语。注意:做不与任何人共享此密钥或在任何地方在线存储。
2)将值复制到.env
文件中的相应的MNEMONIC
键。
从infura获取project_id
1)在https://infura.io/注册(免费!)
2)确认并登录后,单击仪表板右上角的“创建新键”按钮。输入Name
并选择Web3 API
作为网络,然后创建。
4)将HTTPS URL中的ID复制到.env
文件中的相应的PROJECT_ID
键。
创建迁移
要部署合同,您需要在migrations/
文件夹中创建文件:
1_initial_migration.js
const MyToken = artifacts.require("MyToken");
module.exports = (deployer) => {
deployer.deploy(MyToken, "MyToken", "MYT", 100000);
};
上面的一些注释:
- 我们告诉松露我们想通过
artifacts.require()
方法与哪些合同进行交互。该名称应匹配该源文件中合同定义的名称,而不是源文件(因为文件可以包含多个合同)。 - 可以找到Deployer API(
deployer.deploy(contract, args..., options)
)here。我们正在通过合同,然后是可选的构造方参数。 - 构造函数参数为
"MyToken"
(名称),"MYT"
(符号)和100000
(初始供应)。
应该是配置! -
在本地部署合同
要部署智能合约,我们将需要连接到区块链。松露具有内置的个人区块链,可用于测试。该区块链是您系统本地的,并且不与主要以太坊网络交互。
1)打开一个终端窗口,然后将cd
打开到松露项目目录中。
2)运行将启动本地以太坊网络的truffle develop
。
3)运行compile
,该51将编译固体合同文件,这应该给您类似的东西:
truffle(develop)> compile
Compiling your contracts...
===========================
> Compiling ./contracts/MyToken.sol
> Compiling @openzeppelin/contracts/token/ERC20/ERC20.sol
> Compiling @openzeppelin/contracts/token/ERC20/IERC20.sol
> Compiling @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
> Compiling @openzeppelin/contracts/utils/Context.sol
> Artifacts written to /Users/ME/MyToken/build/contracts
> Compiled successfully using:
- solc: 0.8.17+commit.8d345f5f.Emscripten.clang
truffle(develop)>
注意:如成功消息所示,在您的
/build/contracts
目录中创建了工件。生成的伪影.json
文件的名称没有反映源文件的名称,而是合同定义的名称。
5)最后,运行migrate --reset
将您的合同部署到本地运行的网络。
运行
--reset
从一开始就运行所有迁移,而不是从最后完成的迁移
与令牌相互作用
是时候进行一些基本检查以查看一切是否按预期工作:
1)运行token = await MyToken.deployed();
访问TruffleContract
。这还应该输出所有可用方法,属性等的完整合同实例
2)从这里,我们可以测试一些方法:
truffle(develop)> name = await token.name();
'MyToken'
truffle(develop)> symbol = await token.symbol();
'MYT'
truffle(develop)> decimals = (await token.decimals()).toString()
'18'
我鼓励您尝试其他可用方法!
将合同部署到Goerli Testnet
在您可以将合同部署到Goerli之前,我们需要一些测试网络!首先,请切换到MetAmask上的Goerli网络(如果不是您的选项,则可能需要在高级设置中打开“显示测试网络”选项):
然后,前往https://goerlifaucet.com,输入您的地址并按下“ Send Me Eth”按钮。确认交易后,检查您的元张纸以确认ETH到达了,如果没有,请尝试其他水龙头。
迁移的时间!运行migrate --reset --network goerli
,它应该输出这样的东西:
truffle(develop)> migrate --reset --network goerli
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'goerli'
> Network id: 5
> Block gas limit: 30000000 (0x1c9c380)
1_initial_migration.js
======================
Deploying 'MyToken'
-------------------
> transaction hash: 0x31b69373bdfdabb20e205746150d5c4845b363e9a3755450d23adbad1a736c04
> Blocks: 1 Seconds: 4
> contract address: 0x904609375980165691D587386A0163aa7d8D00A6
> block number: 7875096
> block timestamp: 1667350704
> account: 0xEb390e921A349e2434871D989c9AD74bB8de10c0
> balance: 0.047005278846168288
> gas used: 1186096 (0x121930)
> gas price: 2.524855622 gwei
> value sent: 0 ETH
> total cost: 0.002994721153831712 ETH
Pausing for 2 confirmations...
-------------------------------
> confirmation number: 1 (block: 7875097)
> confirmation number: 2 (block: 7875098)
> Saving artifacts
-------------------------------------
> Total cost: 0.002994721153831712 ETH
Summary
=======
> Total deployments: 1
> Final cost: 0.002994721153831712 ETH
查看Etherscan的合同
就我而言,您将看到合同地址为:0x904609375980165691D587386A0163aa7d8D00A6
的迁移输出的一部分。使用它,我们可以转到Etherscan查看创建的合同!
将令牌添加到metamask
使用相同的合同地址,回到metAmask,然后单击“导入令牌”。输入合同地址后,符号和小数应自动填充:
然后单击“添加自定义令牌” ...
您应该能够看到自己的平衡! ð
就是这样! ð
如果您有兴趣了解有关坚固性的更多信息,Crypto Zombies是一个不错的起点。 Solidity by example也有智能合约可以去哪里的良好消化现实世界示例。