当前位置: 首页 > news >正文

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

一、什么是代币(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

http://www.jsqmd.com/news/45037/

相关文章:

  • NCHU-OOP-前三次大作业总结 - AC
  • Yanhua Mini ACDP-2 BMW CAS Package: Advanced CAS ISN Module Programming for N20/N55/B38
  • NCHU-OO-前三次大作业总结 - AC
  • Postman关于AES的加解密
  • 汉诺塔问题详解
  • 20232307 2025-2026-1 《网络与系统攻防技术》实验七实验报告
  • 《R语言医学数据分析实战》学习记录--第一章 R语言介绍
  • 251119明天就要去适应比赛场地了
  • 【数据结构】哈希表的理论与实现 - 教程
  • pip安装第三方包
  • 李克特量表(Likert scale)
  • java---maven
  • 新来的外包,在大群分享了它的限流算法的实现
  • 状语从句学案
  • 用 Rust 与 Tesseract 进行英文数字验证码识别
  • 详细介绍:开源AI大模型、AI智能名片与S2B2C商城系统:个体IP打造与价值赋能的新范式
  • ThreadLocal 源码解析
  • 黑马程序员SpringCloud微服务开发与实战- Docker项目部署-03
  • C# 和 Tesseract 实现英文数字验证码识别
  • contig 和 scaffold的区别和联系
  • linux ftp自动
  • linux ftp脚本
  • 实用指南:【案例实战】鸿蒙分布式智能办公应用的架构设计与性能优化
  • Yanhua Mini ACDP-2 BMW ECU Package: EUC Clone License with Modules 3/8/27 Bench Interface Board
  • Yanhua Mini ACDP-2 BMW ECU Package: EUC Clone License with Modules 3/8/27 Bench Interface Board
  • 根据图片路径将文件下载到本地
  • 2025雅思一对一提分攻略:5家靠谱机构适配不同基础学员
  • redis-RDB/AOF-主从复制整理 - 指南
  • A few basic changes in PyQt6 and PySide6 regarding shader-based OpenGL graphics
  • 身份认证与信息管理:简单实验模拟钓鱼网页