尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

什么是代币?从ERC-20开始 - all-in

什么是代币?从ERC-20开始 - all-in
📅 发布时间:2026/6/19 20:12:30

一、什么是代币(Token)

一句话概括,代币(Token)是由区块链上的智能合约发行的可编程数字资产。

代币的介绍

二、发行自己的ERC-20代币

ERC-20 是以太坊上最重要的智能合约标准之一,是用于实现同质化代币的智能合约接口。

ERC-20 的功能示例包括:

  • 将代币从一个帐户转到另一个帐户

  • 获取帐户的当前代币余额

  • 获取网络上可用代币的总供应量

  • 批准一个帐户中一定的代币金额由第三方帐户使用

以下是ERC-20标准定义的方法和事件:

pragma solidity ^0.8.30;interface IERC20 {// 方法// 返回 Token 的名称function name() external view returns (string calldata);// 返回 Token 的符号function symbol() external view returns (string calldata);// 返回 Token 使用的小数位数function decimals() external view returns (uint8);// 返回 Token 的总供应量。function totalSupply() external view returns (uint256);// 返回地址为 _owner 的账户余额function balanceOf(address _owner) external view returns (uint256 balance);// 将 _value 数量的 Token 转移到地址 _to,并且必须触发 Transfer 事件。// 如果消息调用者的账户余额没有足够的 Token 可供花费,则该函数应该 throw。function transfer(address _to, uint256 _value) external returns (bool success);// 将 _value 数量的 Token 从地址 _from 转移到地址 _to,并且必须触发 Transfer 事件。// 通常用于提款工作流程,允许合约代表您转移 Token。function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);// 授权允许 _spender 从您的账户中多次提取,最高可达 _value 数量。function approve(address _spender, uint256 _value) external returns (bool success);// 返回 _spender 仍然可以从 _owner 提取的数量。function allowance(address _owner, address _spender) external view returns (uint256 remaining);// 事件// 当 Token 被转移时必须触发,包括0值转移。event Transfer(address indexed _from, address indexed _to, uint256 _value);// 必须在任何成功调用 approve 方法时触发。event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

以太坊网络上已经部署了大量符合 ERC20 标准的 Token。 不同的团队编写了不同的实现,这些实现具有不同的权衡:从节省 gas 到提高安全性。

OpenZeppelin 库内置了遵守 ERC20 标准的可复用的安全合约模版,可以极大地简化开发过程。

下面是使用 OpenZeppelin 创建并发行自己的 ERC-20 代币,通过foundry编译并部署:

1、创建Foundry项目

通过 forge init 创建项目:

$ forge init MyFirstToken

创建好的 Foundry 工程结构如下:

MyFirstToken
├── foundry.lock
├── foundry.toml       ## 配置文件,配置网络URL及编译选项
├── lib                ## 依赖库目录
│   └── forge-std
├── README.md
├── script             ## 部署脚本文件
│   └── Counter.s.sol
├── src                ## 智能合约目录
│   └── Counter.sol
└── test               ## 智能合约测试用例└── Counter.t.sol6 directories, 6 files

2、开发&编译合约

安装依赖 OpenZeppelin 库,执行

$ forge install OpenZeppelin/openzeppelin-contracts

然后可以看到lib下已经有了

MyFirstToken
├── foundry.lock
├── foundry.toml
├── lib
│   ├── forge-std
│   └── openzeppelin-contracts

在src目录下新建MyFirstToken.sol,编写代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";// 从 OpenZeppelin 的 ERC20 派生一个新合约
contract MyFirstToken is ERC20 {// 构造函数constructor(uint256 initialSupply) ERC20("MyFirstToken", "MFT") {// 通过 _mint 函数铸造初始供应量的代币到部署合约的地址_mint(msg.sender, initialSupply);}
}

我们把自己的ERC-20代币命名为MyFirstToken,缩写为MFT。

与 VSCode 集成

  • 执行 forge remappings > remappings.txt 在当前项目的目录下生成 remappings.txt 文件。

  • 然后在 .vscode/settings.json 文件添加如下配置:

    {// 依赖项"solidity.packageDefaultDependenciesContractsDirectory": "src","solidity.packageDefaultDependenciesDirectory": "lib",// 设置保存时自动格式化"editor.formatOnSave": true,"[solidity]": {"editor.defaultFormatter": "JuanBlanco.solidity" },"solidity.formatter": "forge",// 指定solc版本"solidity.compileUsingRemoteVersion": "v0.8.30"
    }
    

编译

在foundry.toml 中使用solc配置编译器版本:

[profile.default]
src = "src"
out = "out"
libs = ["lib"]solc = "0.8.30"

然后执行命令编译:

$ forge build src/MyFirstToken.sol
[⠊] Compiling...
[⠒] Compiling 1 files with Solc 0.8.30
[⠢] Solc 0.8.30 finished in 53.79ms
Compiler run successful!

3、编写测试用例

Foundry的一大优势是使用 solidity 编写测试用例。在目录test/ 下添加文件MyFirstToken.t.sol,测试代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;import {Test} from "forge-std/Test.sol";
import {MyFirstToken} from "../src/MyFirstToken.sol";// 测试合约需要继承 Forge标准库 的 Test 合约
contract MyFirstTokenTest is Test {MyFirstToken public mft;// 每个测试合约运行之前调用的可选函数function setUp() public {mft = new MyFirstToken(25000 * 10 ** 18);}// 函数名以 test 为前缀的函数都被认为是一个测试function testName() public view {// 断言assertEq(mft.name(), "MyFirstToken");}function testSymbol() public view {assertEq(mft.symbol(), "MFT");}function testSupply() public view {assertEq(mft.totalSupply(), 25000 * 10 ** 18);}
}

使用 forge test 命令运行测试用例:

$ forge test
[⠊] Compiling...
[⠒] Compiling 1 files with Solc 0.8.30
[⠑] Solc 0.8.30 finished in 568.82ms
Compiler run successful!Ran 3 tests for test/MyFirstToken.t.sol:MyFirstTokenTest
[PASS] testName() (gas: 12920)
[PASS] testSupply() (gas: 7944)
[PASS] testSymbol() (gas: 13008)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.06ms (3.66ms CPU time)Ran 1 test suite in 165.52ms (4.06ms CPU time): 3 tests passed, 0 failed, 0 skipped (3 total tests)

4、部署合约

执行 forge create 命令向特定网络部署智能合约。

$ forge create src/MyFirstToken.sol:MyFirstToken \--rpc-url https://sepolia.gateway.tenderly.co \--private-key 0x... \--broadcast \--constructor-args 25000000000000000000000[⠊] Compiling...
No files changed, compilation skipped
Deployer: 0x108E5C3086Efc06a962065b566F2683540ffB615
Deployed to: 0x45DEd927f6F21b5C21E864391e52000d29D09178
Transaction hash: 0xec46039324fba3785027aa85391c3414a8a86cadabee8a1d5bc38a17e45232f8
  • --constructor-args 传入构造函数参数:初始供应量 25000 * $$10^{18}$$MFT

  • --private-key 私钥需要以0x开头

  • --broadcast 将交易广播到网络中,没有这个参数只会打包交易,但不会广播

在sepolia.etherscan.io中查看交易(合约部署)详情:

ERC20

ERC20-log

5、钱包中展示代币

在MetaMask中添加代币:

image

ERC20-MetaMask

相关新闻

  • Yanhua Mini ACDP-2 BMW CAS Package: Advanced CAS ISN Module Programming for N20/N55/B38
  • 发布与订阅者模式-复盘
  • 20232307 2025-2026-1 《网络与系统攻防技术》实验七实验报告

最新新闻

  • 武汉家具安装推荐良匠千艺2026口碑榜 - 我叫一
  • 2026昆山卫生间防水服务商适配指南:昆山鼎壹万机构解析及5家优质服务商推荐 专业瓷砖空鼓维修公司排名推荐(2026年5月瓷砖空鼓维修最新TOP权威排名) - 鼎壹万修缮说
  • 166、模组来料检验标准:外观、MTF 抽检、IRCF 透过率测试的 IQC 流程
  • 马鞍山GEO服务商代理加盟选型靠谱推荐?2026年马鞍山GEO代理服务商选型排名与合作路径解析 - 子柔传媒
  • 大连家电维修平台推荐:本地用户实测较好的几家服务商深度对比——2026年6月最新发布 - 一步到家
  • 3步解锁老旧Mac新生命:OpenCore Legacy Patcher终极升级指南

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号