ERC-20 token合约是什么?ERC-20 Token合约详解

百科2025-09-01浏览(15)评论(0)

ERC-20是一种以太坊(Ethereum)区块链上的代币标准,由以太坊创始人之一的Vitalik Buterin在2015年提出,ERC代表Ethereum Request for Comment,即以太坊征求修改意见,20则是该标准的编号,ERC-20定义了一种代币(Token)在以太坊区块链上如何被创建、管理和交易的一套规则,这些规则包括代币的总供应量、账户余额、交易和批准等基本功能。

ERC-20标准的制定,使得在以太坊上创建和管理代币变得更加简单和标准化,这不仅促进了代币经济的发展,也为去中心化应用(DApps)提供了更多的灵活性和创新空间,以下是ERC-20 Token合约的详细解释:

  1. 代币总供应量(Total Supply):ERC-20代币必须有一个名为totalSupply的函数,返回代币的总供应量,这个值应该是恒定的,一旦设定就不能再改变。

  2. 账户余额(Balance):每个代币持有者都有一个账户余额,可以通过balanceOf函数查询,这个函数接受一个地址作为参数,并返回该地址的代币余额。

  3. 转账(Transfer):代币持有者可以通过transfer函数将代币发送给其他人,这个函数接受两个参数:接收者的地址和要发送的代币数量,如果转账成功,发送者的余额会减少,接收者的余额会增加。

  4. 批准(Approve):ERC-20代币允许用户批准另一个账户代表他们消费一定数量的代币,这是通过approve函数实现的,它接受两个参数:被批准账户的地址和被批准消费的代币数量。

    ERC-20 token合约是什么?ERC-20 Token合约详解

  5. 转账从(Transfer From):这个函数允许一个账户代表另一个账户发送代币,它接受三个参数:发送者的地址、接收者的地址和要发送的代币数量,在执行转账之前,这个函数会检查发送者的账户是否有足够的余额,并且接收者的账户是否有足够的批准额度。

  6. 事件(Events):ERC-20标准定义了几个必须被触发的事件,包括TransferApproval,这些事件允许外部监听者(如钱包或区块浏览器)跟踪代币的流动和批准状态的变化。

  7. 符号和名称(Symbol and Name):ERC-20代币应该有一个符号(通常是3-4个字符)和一个名称,这些信息可以通过symbolname函数查询。

  8. 代币精度(Decimals):ERC-20代币应该有一个decimals函数,返回代币的小数位数,这有助于标准化代币的显示和计算。

ERC-20 Token合约的代码通常使用Solidity编写,这是一种专门为以太坊智能合约设计的编程语言,一个典型的ERC-20 Token合约包括上述所有功能,并且遵循特定的编码风格和约定,以确保与其他基于以太坊的系统和工具的兼容性。

以下是ERC-20 Token合约的一个简化示例代码:

pragma solidity ^0.8.0;
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract MyToken is IERC20 {
    string public constant name = "MyToken";
    string public constant symbol = "MTK";
    uint8 public constant decimals = 18;
    uint256 public _totalSupply;
    mapping(address => uint256) balances;
    mapping(address => mapping(address => uint256)) allowed;
    constructor(uint256 initialSupply) {
        _totalSupply = initialSupply * (10 ** uint256(decimals));
        balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view override returns (uint256) {
        return balances[account];
    }
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(balances[msg.sender] >= amount, "Insufficient balance");
        balances[msg.sender] -= amount;
        balances[recipient] += amount;
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view override returns (uint256) {
        return allowed[owner][spender];
    }
    function approve(address spender, uint256 amount) public override returns (bool) {
        allowed[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        require(balances[sender] >= amount, "Insufficient balance");
        require(allowed[sender][msg.sender] >= amount, "Insufficient allowance");
        balances[sender] -= amount;
        balances[recipient] += amount;
        allowed[sender][msg.sender] -= amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }
}

这个合约定义了一个名为"MyToken"的ERC-20代币,具有18位小数的精度,它包括了ERC-20标准所要求的所有函数和事件,开发者可以根据需要修改这个合约,例如改变代币的名称、符号或初始供应量。

标签: