1. 简易代币系统简介(ERC-20 Token)
目标 :部署一个可以"增发、转账、查询余额"的代币系统。
内容:
-
使用 Solidity 编写一个简化版 ERC-20 合约。
-
提供 API(如通过 NestJS + web3.js 或 ethers.js):
-
GET /balance/:address
:查询地址余额 -
POST /mint
:管理员地址增发代币 -
POST /transfer
:从某地址向另一地址转账
-
你将学习:
-
如何部署智能合约
-
钱包签名与转账流程
-
与合约交互的基本 API 编写
2需要API如下
变量名 | 获取方式 |
---|---|
ETHEREUM_RPC_URL |
你已经有了(Alchemy / Infura 给的) |
ADMIN_PRIVATE_KEY |
打开 MetaMask → 设置 → 安全与隐私 → 导出私钥(输入密码) |
TOKEN_CONTRACT_ADDRESS |
你需要先部署一个代币合约(我可以教你用 Remix 部署 ERC20) |
以metamask为例(Infura已并入metamask)
https://developer.metamask.io/
3获得测试网api节点
https://sepolia.infura.io/v3/你的_INFURA_API_KEY
4钱包切换网络,获得钱包地址
一定要切换到测试网,别拿真实网络的钱包地址去测试了。

钱包公钥地址
下图中可以直接复制的钱包公钥地址

钱包私钥地址
点击account1右边的↓,再点新窗口的三个点,再点击账户详情。点击detail,点击显示私钥。


5如何获得 Sepolia 测试币?
以下是一些常用的 Sepolia 水龙头网站,你可以通过它们免费领取测试币:docs.scroll.io
-
Alchemy 水龙头:每天可领取 0.5 Sepolia ETH,需注册并登录 Alchemy 账户。
-
QuickNode 水龙头:每 12 小时可领取 0.05 Sepolia ETH,分享推文可再领取 0.05 ETH。
-
Google Cloud 水龙头:无需注册,直接输入钱包地址即可领取。
-
PK910 水龙头:需通过 Gitcoin Passport 验证后领取。
以Google Cloud水龙头为例子
https://cloud.google.com/application/web3/faucet/ethereum/sepolia
进入后如下

6获得合约地址
很好!我来一步步教你在 Sepolia 测试网 上部署一个简单的 ERC-20代币合约(完全免费,只需一些测试ETH)。
🧱 部署 ERC-20 代币合约步骤(使用 Remix + MetaMask)
🛠️ 准备工作
-
确保你已安装并登录 MetaMask
-
网络切换到
Sepolia
测试网。 -
没测试币?可以来这个水龙头领取:Ethereum Sepolia Faucet
-
-
打开 Remix IDE(在线智能合约编辑器)
🧾 第一步:创建合约文件
-
在 Remix 左侧点击 📄 文件 → 新建一个文件,例如:
MyToken.sol
-
复制以下代码粘贴进去 👇
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
_mint(msg.sender, initialSupply * (10 ** decimals()));
}
}
⚙️ 第二步:编译合约
-
左侧点击「🛠️ Compiler」
-
选 Solidity 0.8.x(确保与你合约版本一致)
-
点「Compile MyToken.sol」
-
🚀 第三步:部署合约
-
左侧点击「Ethereum 部署环境图标」▶️
-
在 Environment 里选择:
Injected Provider - MetaMask
- Remix 会连接你的 MetaMask 钱包
-
在 Deploy 栏看到
initialSupply
,输入你想发的总量(例如1000
) -
点击「Deploy」,MetaMask 弹窗 → 签名确认



填 1000
作为 initialSupply
本身不会消耗你的测试币(SepoliaETH) ,真正消耗的是"部署合约"的 Gas 费用,和你填多少 supply 没直接关系。
✅ 部署一个标准 ERC20 合约的消耗量(大致):
-
大约 0.003 ~ 0.015 SepoliaETH
-
也就是 3 万 ~ 15 万 gas
-
你钱包有 0.05 SepoliaETH,完全够用来部署几次
❗注意:
-
initialSupply
是合约初始化时铸造的代币数量(ERC20 代币),不是 ETH,也不影响 ETH 消耗。 -
所有的初始代币会自动进入你当前钱包地址,成为你拥有的
MTK
代币。
✅ 示例:
你填 initialSupply = 1000
:
-
会创建一个代币总量为
1000 * 10^18
的MyToken
合约。 -
消耗 0.005 ETH 左右(仅部署 gas)
-
你部署完之后,可以在 Remix 或 MetaMask 看到你钱包地址持有
1000 MTK
(如果添加了代币地址)。
点击部署后的样子

✅ 第四步:获取代币合约地址
部署成功后:
-
Remix 底部会出现「Deployed Contracts」区域
-
复制它的地址,例如:
0xABC123...
-
这个地址就是你
.env
中的TOKEN_CONTRACT_ADDRESS


补充说明
合约地址部署可能的错误
Value记得填0
报错原因总结
你在 Remix 部署时设置了:
-
Value = 1,单位 = Wei
-
但部署的是一个 ERC20 代币合约(不是 payable 合约)
🚨 这个部署报错的本质原因是:你往合约里转了 1 Wei(最小单位的 ETH),但这个合约的 constructor 并没有 payable
,所以 Solidity 默认拒绝了这笔转账。
✅ 正确做法
✔ 在部署时:
-
Value 设置为
0
(或者直接不填) -
单位 默认是 Wei,但因为是 0,就无所谓了
-
只填
initialSupply
,比如1000000
不要往代币合约部署时发送 ETH,因为 ERC20 合约不是一个接收 ETH 的 payable 合约
❗扩展说明:什么时候用 Value?
场景 | 是否填 Value |
---|---|
部署 ERC20、NFT 合约 | ❌ 不需要,留空或填 0 |
调用 payable 函数(如买 NFT) | ✅ 需要,填入实际数值 |
转账 ETH 给地址或合约 | ✅ 需要 |
✅ 解决你的问题操作步骤(Remix)
-
打开 Remix 的部署面板
-
在
Value
输入框中,改成0
-
只在 Constructor 参数中填写:
initialSupply: 1000000
-
点击
Deploy
即可成功部署
如果你愿意,我可以直接为你写一个完整的 Remix 部署操作步骤截图或视频级别指南。是否需要?
那我填1Ether呢
如果你在 Remix 部署合约时填了:
Value = 1
,单位选择ether
(即你尝试发送 1 ETH 给合约)
❌ 结果是:部署 仍然会报错
🚨 为什么?
因为你部署的是一个标准的 ERC20 合约,而它的构造函数(constructor)是这样的:
constructor(uint256 initialSupply) { _mint(msg.sender, initialSupply); }
它 没有加 payable
,也就是说:
这个合约在部署时 拒绝接收 ETH(无论是 1 Wei 还是 1 Ether)
Solidity 默认行为是:如果你往一个 不带 payable
的构造函数转账 ETH,那么部署会直接失败,报错信息类似:
constructor is not payable
✅ 正确方式
除非你明确想让部署过程接收 ETH(这很罕见),否则部署时 Value 应该设为 0。
部署步骤如下:
-
部署面板 中,Value 设置为
0
-
填入构造函数的参数:
1000000
(举例) -
单位无所谓,默认是 Wei
-
点 Deploy 即可
✅ 如果你真要部署时接收 ETH,怎么办?
你必须修改合约,把 constructor 改成这样:
constructor(uint256 initialSupply) payable { _mint(msg.sender, initialSupply); }
这样部署时才允许你带 ETH,但:
⚠️ 这通常 没有必要,ERC20 合约通常不需要接收 ETH
✅ 小结
Value 设置 | 单位 | 是否报错 | 合约需要什么 |
---|---|---|---|
1 | Wei | ❌ 报错 | constructor 不是 payable |
1 | Ether | ❌ 报错 | constructor 不是 payable |
0 | 无所谓 | ✅ 不报错 | constructor 不需要 payable |
✅ 什么是 "Publish to IPFS"?
这表示 Remix 在你部署合约时,会将合约源码和元数据上传到 IPFS(去中心化存储网络),这样别人可以:
-
查看你的合约源码
-
验证合约在链上的部署和源码是否一致
-
方便第三方服务(如 Etherscan)识别、验证你的合约
🤔 是否需要勾选?
你要做什么 | 是否建议勾选 Publish to IPFS |
---|---|
学习 / 本地测试 | ❌ 不需要,节省时间 |
练习部署 ERC20 等代币合约 | ❌ 一般不需要,除非你想试试 |
部署正式合约到主网 / 测试网供他人使用 | ✅ 建议勾选,有利于开源透明 |
要通过 Etherscan 验证源码 | ✅ 建议(也可以手动提交) |
📝 需要注意的点
-
勾选后 Remix 会花几秒钟上传数据到 IPFS,有时稍慢
-
上传的内容是合约的源码和 ABI,不包含你部署的状态
-
上传不会自动同步到 Etherscan,你还需要手动在 Etherscan 验证合约(或通过 Remix 插件操作)
✅ 小结建议
你的目的 | 建议是否勾选 |
---|---|
初学者、本地测试 | ❌ 不勾 |
做公开项目或开源合约 | ✅ 勾上 |
要 Etherscan 自动识别合约 | ✅ 勾上(但不是必须) |
如果你只是测试 ERC20 或练习 Remix 合约部署,可以不勾 。但如果你打算以后把合约分享给别人或用在正式项目上,最好勾上。
代币系统项目最终效果展示:

你做这个代币的意义和能干的事情,取决于你的目标和场景,简单来说,做代币通常有以下几个主要用途:
1. 发行数字资产(资产代币化)
你可以把代币当做一种数字资产,比如:
-
游戏中的金币、道具
-
社区积分、奖励
-
代表某种权益或证书的凭证
2. 构建去中心化应用(DApp)
代币可以作为你DApp里核心的经济激励工具,比如:
-
用代币奖励用户贡献内容
-
用代币作为访问某些服务的"门票"
-
做投票治理,持币者有投票权
3. 融资工具(ICO、IDO)
你可以发行代币给投资者,筹集资金,用于项目开发或运营。
4. 试验和学习
很多开发者自己做代币,是为了理解智能合约开发、区块链经济学、或者实验某些新的想法。
5. 打造社区经济
代币可以促进社区互动和价值传递,比如:
-
激励社区成员参与讨论
-
作为贡献奖励发放
-
用代币进行兑换和交易
具体你可以做的事情举例:
-
发行自己的稳定币或积分,让用户在你平台使用。
-
做游戏内货币,买卖游戏道具。
-
搭建NFT生态的支付媒介。
-
创建治理代币,让持币者决定项目方向。
-
搭建去中心化交易所的流动性代币。
总结
代币本质是区块链上的数字"货币"或"资产",它的意义在于:
-
实现数字资产管理
-
搭建新的经济激励体系
-
让用户参与项目生态
-
支撑区块链上的多样化应用场景
1. 代币本身"没有花钱"
-
代币是智能合约里写的逻辑和数据,比如你写了"总共发行1000个代币",这只是链上合约的状态数据。
-
代币数量、转账、余额这些操作本身是数据变化,没有"直接花钱",只是改变区块链里的数据。
2. 花钱的地方是部署和交易的 gas 费
-
部署合约时,你需要向区块链支付"矿工费(gas费)",这是真实花掉的ETH(比如你说的0.0445 SepoliaETH)。
-
代币的转账、调用合约方法等操作,也需要支付 gas 费。
-
gas 费是给验证和打包你操作的矿工(或验证者)的报酬。
3. 代币是链上数据,不是ETH
-
代币数量不会直接消耗你的ETH。
-
你拥有的ETH是链上真正的"货币",代币是你合约中的"余额记录"。
举个通俗的比喻
-
你买了一台打印机(部署合约),花了钱买机器(gas费)。
-
打印机印出1000张票(代币),印票不额外花钱(链上数据变化),但每次用打印机(调用合约)都要消耗墨水(gas费)。
所以只要你不频繁操作代币转账,或者不频繁调用合约方法,一般不会额外花ETH。主要费用是在部署合约和交易时支付。
如果你想更省钱,建议:
-
用测试网(Sepolia)先试验,不花真钱
-
优化合约代码,减少调用的 gas 量
-
了解并选择合适的 gas 价格和时机