在15分钟内创建和部署ERC-20令牌(松露,OpenZeppelin,Goerli)
#javascript #web3 #solidity #truffle

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
  • 构造函数正在接收namesymbolinitialSupply,我们将稍后从部署传递。
  • 在使用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!)

是时候填充MNEMONICPROJECT_ID值...

从metamask获取助记符

先决条件:如果您尚未得到它,请从https://metamask.io/download/安装MetAmask浏览器。

1)关注these instructions以揭示您的秘密恢复短语。注意:做与任何人共享此密钥或在任何地方在线存储。

2)将值复制到.env文件中的相应的MNEMONIC键。

从infura获取project_id

1)在https://infura.io/注册(免费!)

2)确认并登录后,单击仪表板右上角的“创建新键”按钮。输入Name并选择Web3 API作为网络,然后创建。

3)在网络端点下选择Görli
Infura screenshot

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网络(如果不是您的选项,则可能需要在高级设置中打开“显示测试网络”选项):

MetaMask screenshot

然后,前往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查看创建的合同!

Etherscan MyToken page

将令牌添加到metamask

使用相同的合同地址,回到metAmask,然后单击“导入令牌”。输入合同地址后,符号和小数应自动填充:

MetaMask screenshot of form

然后单击“添加自定义令牌” ...

MetaMask screenshot of balance

您应该能够看到自己的平衡! ð

就是这样! ð

如果您有兴趣了解有关坚固性的更多信息,Crypto Zombies是一个不错的起点。 Solidity by example也有智能合约可以去哪里的良好消化现实世界示例。