入门到实践基于以太坊实现代币发布,从零开始创建你的第一个ERC20代币

大家好,今天我们来聊一聊如何基于以太坊区块链发布自己的代币,随着区块链技术的火热,代币(Token)作为区块链世界的重要资产载体,其应用场景日益广泛,无论是初学者想体验一下发币流程,还是项目方需要发行功能性代币,掌握基于以太坊发币都是一项非常有价值的技能,本文将以最流行的ERC20代币标准为例,带大家一步步了解并实践如何发布自己的以太坊代币。

什么是代币?什么是以太坊?什么是ERC20

在开始之前,我们先简单理解几个核心概念:

  1. 代币(Token):在区块链领域,代币通常是基于现有区块链平台(如以太坊)发行的数字资产,它本身可能是一个独立的区块链(如比特币),但更多时候是指遵循特定标准、在已有区块链上运行的“智能合约代币”。
  2. 以太坊(Ethereum):以太坊不仅仅是一种加密货币(ETH),更是一个开源的、有智能合约功能的去中心化区块链平台,它允许开发者构建和部署去中心化应用(DApps),而代币正是这些DApps中不可或缺的一部分。
  3. ERC20:这是以太坊上代币的技术标准,全称为“Ethereum Request for Comments 20”(以太坊意见征求稿20),它定义了一套代币应遵循的接口和规则,包括名称、符号、总供应量、转账额度、余额查询等基本功能,遵循ERC20标准的代币可以确保与以太坊钱包、交易所等生态系统兼容,方便流通和使用。

发布以太坊代币前的准备工作

在动手写代码之前,我们需要准备以下工具和环境:

  1. 以太坊钱包:用于管理你的账户(私钥、公钥)、发送交易和存储代币,推荐使用MetaMask,它是一款浏览器插件钱包,支持以太坊主网和各种测试网,使用广泛且方便。
  2. 测试网ETH:为了避免在以太坊主网上浪费真实的ETH(用于支付 Gas 费),我们通常会先在测试网上进行开发和测试,你需要从测试网水龙头(Faucet)获取免费的测试网ETH,常见的测试网有Ropsten、Kovan、Goerli等(注意:部分测试网可能已弃用,建议使用Goerli或Sepolia)。
  3. 开发环境
    • Node.js 和 npm/yarn:Node.js 是一个 JavaScript 运行时环境,npm 是其包管理器,我们需要它们来安装和管理 Solidity 编译器(solc)和 Truffle 框架等。
    • 代码编辑器:如 VS Code,推荐安装 Solidity 插件以获得更好的语法高亮和智能提示。
    • Truffle Framework:一个流行的以太坊开发框架,用于智能合约的编译、测试、部署和管理。
    • Solidity:以太坊智能合约的编程语言。

安装步骤:

  • 安装 Node.js:从 Node.js 官网 下载并安装。
  • 安装 MetaMask:从 MetaMask 官网 安装浏览器插件,并创建/导入钱包。
  • 安装 Truffle:在终端运行 npm install -g truffle
  • 安装 Solidity 编译器:Truffle 通常会自带,但也可以单独更新 solc

使用 Truffle 框架创建 ERC20 代币

Truffle 框架大大简化了智能合约的开发和部署流程,下面我们用它来创建一个简单的 ERC20 代币。

创建一个新的 Truffle 项目

在终端中执行以下命令:

mkdir my-erc20-token
cd my-erc20-token
truffle init

这会创建一个基本的 Truffle 项目结构,包括 contracts/(存放智能合约)、migrations/(部署脚本)、test/(测试文件)等目录。

编写 ERC20 代币智能合约

Truffle 提供了一个 OpenZeppelin 的 ERC20 合约模板,OpenZeppelin 是一个致力于开发安全、社区审查的智能合约标准库的团队,他们的合约被广泛使用和信任。

安装 OpenZeppelin Contracts:

npm install @openzeppelin/contracts

contracts/ 目录下创建一个新的 Solidity 文件,MyToken.sol,并编写以下代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        _mint(msg.sender, 1000 * 10**decimals()); // 初始发行1000个代币,考虑小数位
    }
}

代码解释:

  • SPDX-License-Identifier: MIT:许可证标识符。
  • pragma solidity ^0.8.0;:指定 Solidity 编译器版本,0.8.0 或更高。
  • import "@openzeppelin/contracts/token/ERC20/ERC20.sol";:导入 OpenZeppelin 的 ERC20 标准合约。
  • contract MyToken is ERC20 { ... }:定义我们的代币合约 MyToken,继承自 ERC20
  • constructor(string memory name, string memory symbol) ERC20(name, symbol) { ... }:构造函数,在合约部署时执行,它接收代币名称(name)和符号(symbol),并传递给父类 ERC20 的构造函数。
  • _mint(msg.sender, 1000 * 10**decimals());_mint 是 ERC20 合约内部用于铸造代币的函数,这里我们向合约部署者(msg.sender)铸造 1000 个代币。decimals() 返回代币的小数位数(ERC20 默认为 18),10**decimals() 是为了将 1000 转换为最小单位(如果小数位是18,则实际铸造的是 1000 * 10^18 个最小单位)。

编写迁移(部署)脚本

migrations/ 目录下创建一个新的迁移脚本,文件名格式为 2_deploy_contracts.js(数字表示执行顺序):

const MyToken = artifacts.require("MyToken");
module.exports = function (deployer) {
  deployer.deploy(MyToken, "My Awesome Token", "MAT");
};

代码解释:

  • artifacts.require("MyToken");:告诉 Truffle 我们要部署的是 MyToken 合约。
  • module.exports = function (deployer) { ... };:导出一个部署函数。
  • deployer.deploy(MyToken, "My Awesome Token", "MAT");:部署 MyToken 合约,并传入构造函数所需的参数:代币名称 "My Awesome Token" 和符号 "MAT"。

配置 Truffle 网络

打开 truffle-config.js(或 truffle.js)文件,配置我们要连接的测试网,以 Goerli 测试网为例(你需要确

随机配图
保 MetaMask 已添加 Goerli 测试网并拥有测试 ETH):

require('dotenv').config(); // 引入 dotenv 包,用于管理环境变量
module.exports = {
  networks: {
    development: {
     host: "127.0.0.1",     // Localhost (default: none)
     port: 7545,            // Standard Ethereum port (default: none)
     network_id: "*",       // Any network (default: none)
    },
    goerli: {
      provider: () => new HDWalletProvider(process.env.MNEMONIC, `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`),
      network_id: 5,       // Goerli's id
      gas: 5000000,        // Gas limit used for each block
      confirmations: 2,    // # of confs to wait between deployments
      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.0",    // Fetch exact version from solc-bin (default: truffle's version)
      settings: {          // See the solidity docs for advice about optimization and evmVersion
        optimizer: {
          enabled: true,
          runs: 200
        },
      }
    }
  },
  // dotenv 配置
  plugins: [
    'truffle-plugin-verify'
  ]
};
// HDWalletProvider requires holding Mnemonic words, so it better to use .env

本文由用户投稿上传,若侵权请提供版权资料并联系删除!