:2026-03-30 13:12 点击:1
在区块链的世界里,特别是以太坊生态系统中,代币(Token)扮演着至关重要的角色,无论是去中心化金融(DeFi)的应用、非同质化代币(NFT)的基础,还是社区治理,都离不开代币的身影,而ERC20(Ethereum Request for Comments 20)是以太坊上最著名、应用最广泛的代币标准,它定义了一套统一的接口,使得不同的代币可以在以太坊网络上兼容地交互,本文将带你一步步了解如何编写一个基本的以太坊ERC20代币合约。
在动手编写之前,我们首先要明白ERC20标准要求实现哪些核心功能,一个符合ERC20标准的合约,通常需要包含以下几个部分:
事件 (Events):
Transfer(address indexed from, address indexed to, uint256 value): 当代币从某个地址转移到另一个地址时触发。Approval(address indexed owner, address indexed spender, uint256 value): 当所有者授权某个地址可以花费其一定数量的代币时触发。状态变量 (State Variables):
name: 代币名称,"MyToken"。symbol: 代币符号,"MTK"。decimals: 代币小数位数,通常为18,类似于以太坊的主币ETH。totalSupply: 代币总供应量。balances: 一个映射,记录每个地址拥有的代币余额。allowances: 一个映射,记录一个地址(所有者)授权给另一个地址(花费者)的代币数量。函数 (Functions):
transfer(address to, uint256 amount): 将一定数量的代币从调用者地址转移到指定地址。transferFrom(address from, address to, uint256 amount): 从指定地址转移代币到目标地址(需要先调用approve进行授权)。approve(address spender, uint256 amount): 授权某个地址可以花费调用者指定数量的代币。balanceOf(address account): 查询指定地址的代币余额。allowance(address owner, address spender): 查询指定地址(所有者)授权给另一个地址(花费者)的代币数量。我们将使用Solidity语言,这是在以太坊上编写智能合约最常用的语言,为了简化开发并确保符合标准,我们通常会继承OpenZeppelin库提供的ERC20合约实现,它已经实现了ERC20标准的核心逻辑,并经过了安全审计。
@openzeppelin/contracts。MyToken.sol// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// 导入OpenZeppelin的ERC20合约
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/**MyToken
* @dev 一个简单的ERC20代币合约,继承自OpenZeppelin的ERC20实现。
*/
contract MyToken is ERC20 {
/**
* @dev 构造函数。
* @param name_ 代币名称
* @param symbol_ 代币符号
*/
constructor(string memory name_, string memory symbol_)
ERC20(name_, symbol_)
{
// 在部署时,将初始供应量(例如10000个代币)铸造给合约部署者
// _msgSender() 返回调用者地址,即部署者地址
// 乘以10的decimals次方,因为ERC20的amount是整数,小数部分由decimals控制
_mint(_msgSender(), 10000 * 10**decimals());
}
}
SPDX-License-Identifier: MIT:许可证标识符,表明该合约遵循MIT许可证。pragma solidity ^0.8.20;:指定Solidity编译器版本,^0.8.20表示使用0.8.20或更高但不包括0.9.0的版本。import "@openzeppelin/contracts/token/ERC20/ERC20.sol";:导入OpenZeppelin库中的ERC20合约。contract MyToken is ERC20:定义一个名为MyToken的合约,它继承自ERC20合约,从而获得了所有ERC20的标准功能。constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_):name_(代币名称)和symbol_(代币符号),并传递给父合约ERC20的构造函数进行初始化。_mint是ERC20合约内部的一个函数,用于铸造新的代币。_msgSender()返回当前调用者(即合约部署者)的地址。10000 * 10**decimals()计算初始供应量,由于decimals()默认为18,所以实际铸造的代币数量是10000 * 10^18,即10000个带有18位小数的代币,表示为"10000"个完整代币单位。编译: 使用Truffle或Hardhat命令编译合约,在Truffle项目中,运行:
truffle compile
编译成功后,会在build/contracts目录下生成MyToken.json文件,其中包含合约的ABI(应用程序二进制接口)和字节码。
部署:
编写一个部署脚本(例如Truffle的2_deploy_contracts.js或Hardhat的scripts/deploy.js),然后部署到以太坊测试网(如Ropsten, Goerli)或本地开发网络(如Ganache)。
// Truffle示例部署脚本
const MyToken = artifacts.require("MyToken");
module.exports = function (deployer) {
deployer.deploy(MyToken, "My Awesome Token", "MAT");
};
部署后,你会获得合约的地址,这个地址就是你代币的唯一标识。
部署到测试网或主网后,你可以:
transfer函数进行代币转账。approve和transferFrom函数在去中心化交易所(DEX)或其他DeFi协议中进行代币交易。
编写一个以太坊ERC20代币合约,尤其是借助OpenZeppelin这样的成熟库,已经变得相对简单,理解ERC20标准的接口和核心功能是基础,而掌握Solidity编程和智能合约开发流程则是实践的关键,本文提供了一个入门级的示例,希望能帮助你开启自己的代币创作之旅,在实际应用中,请务必进行充分的测试,并重视合约的安全性。
本文由用户投稿上传,若侵权请提供版权资料并联系删除!