在区块链的世界里,代币(Token)是构建去中心化应用(DApps)、进行社区融资和实现数字资产化的重要工具,以太坊作为最智能合约平台,其上发行的代币大多遵循ERC20标准,本文将带你一步步了解如何编写一个基础的ETH发币合约(即ERC20代币合约)。

什么是ERC20标准

ERC20是以太坊社区提出的一个代币标准接口(Interface),它定义了一套规则和函数,使得所有遵循该标准的代币都能在以太坊生态中无缝兼容,比如支持主流的钱包(MetaMask)、交易所等,主要包括以下核心函数和事件:

  • 函数 (Functions):
    • name(): 返回代币名称,"MyToken"。
    • symbol(): 返回代币符号,"MTK"。
    • decimals(): 返回代币小数位数,通常为18。
    • totalSupply(): 返回代币总供应量。
    • balanceOf(address owner): 查询指定地址的代币余额。
    • transfer(address to, uint256 amount): 转代币到指定地址。
    • transferFrom(address from, address to, uint256 amount): 从指定地址转代币到另一地址(通常需要授权)。
    • approve(address spender, uint256 amount): 授权某个地址可以花费你的代币。
    • allowance(address owner, address spender): 查询某个地址被授权花费的代币数量。
  • 事件 (Events):
    • Transfer(address indexed from, address indexed to, uint256 value): 代币转移事件。
    • Approval(address indexed owner, address indexed spender, uint256 value): 授权事件。

准备工作:开发环境搭建

在编写合约之前,你需要准备以下工具和环境:

  1. Solidity 编译器:Solidity是以太坊智能合约的编程语言,你可以使用 Remix IDE(在线,无需安装)或本地安装 solc (Solidity Compiler)。
  2. 以太坊钱包:如MetaMask,用于测试和部署合约,以及管理私钥。
  3. 测试网ETH:在以太坊测试网(如Ropsten, Goerli, Sepolia)上部署合约需要消耗ETH作为Gas费,你可以通过水龙头(Faucet)获取测试网ETH。
  4. 文本编辑器:如VS Code,配合Solidity插件(如Hardhat或Truffle的插件)能提供更好的开发体验。

对于初学者,Remix IDE 是最友好的选择,它集成了编译、部署、测试等功能。

编写一个简单的ERC20代币合约

下面是一个基于OpenZeppelin库的ERC20代币合约示例,OpenZeppelin是一个提供安全、可审计的智能合约库的社区,强烈建议在实际开发中使用,以避免安全漏洞。

步骤1:在Remix IDE中创建新文件

打开Remix IDE,点击左侧文件图标,创建一个新文件,MyToken.sol

步骤2:编写合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        // 在部署时向合约创建者(msg.sender)发行100万个代币
        // 假设小数位数为18,所以100万 * (10 ** 18) = 1000000 * 10^18
        _mint(msg.sender, 1000000 * 10**decimals());
    }
}

代码解析:

  1. // SPDX-License-Identifier: MIT:指定Solidity文件的许可证标识符,MIT是常用的开源许可证。
  2. pragma solidity ^0.8.20;:指定Solidity编译器版本,^0.8.20表示使用0.8.20到0.9.0(不含0.9.0)之间的版本。
  3. import "@openzeppelin/contracts/token/ERC20/ERC20.sol";:导入OpenZeppelin的ERC20标准合约,在Remix中,你可以通过"File Explorers"下的"Import"按钮搜索并导入,或者直接使用这个路径(确保Remix配置了合适的npm包源)。
  4. contract MyToken is ERC20 { ... }:定义一个名为MyToken的合约,它继承自OpenZeppelin的ERC20合约,因此自动获得了所有ERC20标准的实现。
  5. constructor(string memory name, string memory symbol) ERC20(name, symbol) { ... }
    • constructor是合约的构造函数,只在部署时执行一次。
    • 它接收两个参数:name(代币名称)和symbol(代币符号)。
    • ERC20(name, symbol)调用父类(ERC20)的构造函数,初始化代币名称和符号。
  6. _mint(msg.sender, 1000000 * 10**decimals());
    • _mint是ERC20合约中用于增发代币的内部函数。
    • msg.sender是部署合约的地址,也就是合约的创建者。
    • 1000000 * 10**decimals()是发行的数量。decimals()返回ERC20默认的小数位数18,所以10**18相当于1个代币的最小单位(如1 ETH = 10^18 wei),这里发行了100万 * 10^18个最小单位,即100万个代币。

编译合约

  1. 在Remix IDE左侧,点击"Solidity Compiler"图标(第二个)。
  2. 确保编译器版本(如0.8.20)与你代码中的pragma版本一致。
  3. 点击"Compile MyToken.sol"按钮,如果编译成功,
    随机配图
    会出现一个绿色的勾。

部署合约

  1. 在Remix IDE左侧,点击"Deploy & Run Transactions"图标(第三个,像以太坊的标志)。
  2. ENVIRONMENT:选择"Remix VM (Shanghai)" - 这是在Remix内置的模拟环境中部署,无需真实ETH,如果你想部署到真实测试网或主网,可以选择"Injected Provider - MetaMask",并确保MetaMask连接到对应的网络。
  3. CONTRACT:选择"MyToken - contracts/MyToken.sol"。
  4. DEPLOY:点击"Deploy"按钮。
  5. 如果使用的是"Remix VM",会直接部署成功,如果使用"MetaMask",MetaMask会弹窗确认交易,你需要支付Gas费,点击"Confirm"。
  6. 部署成功后,你可以在"Deployed Contracts"列表中看到你的MyToken合约实例。

测试合约

部署成功后,你可以与合约进行交互测试:

  1. 查看代币信息:点击合约实例下的"name", "symbol", "decimals", "totalSupply"等按钮,查看返回值是否符合预期。
  2. 查看余额:点击"balanceOf",输入你的地址(如msg.sender),查看你拥有的代币数量,应该是100万。
  3. 转账测试
    • 点击"transfer",输入接收地址和转账数量(注意数量是带小数的,比如转100个代币,输入100 * 10**18或使用科学计数法1e26,因为decimals()是18,100 * 10^18 = 1e20,这里注意数量单位)。
    • 点击"transact",MetaMask会弹出确认,确认后查看接收地址的余额是否增加。
  4. 授权和转账From测试
    • 你可以部署另一个地址(或在Remix中切换账户)。
    • 首先在原地址(拥有代币的地址)调用"approve",授权给另一个地址一定的代币数量。
    • 然后在另一个地址调用"transferFrom",从原地址转移代币到目标地址。

重要注意事项

  1. 安全性永远不要直接在生产环境中使用未经审计的合约代码,即使是OpenZeppelin的合约,也要确保你理解其行为并根据你的需求正确使用,对于生产级代币,建议进行专业的安全审计。
  2. Gas费:在以太坊主网部署和执行合约操作都需要消耗ETH作为Gas费,测试网ETH没有实际价值,但部署过程与主网一致。
  3. 代币经济学:简单的增发合约可能不适合所有场景,如果需要更复杂的代币经济模型(如燃烧、锁