ERC-20 token合约是什么?ERC-20 Token合约详解
ERC-20是一种以太坊(Ethereum)区块链上的代币标准,由以太坊创始人之一的Vitalik Buterin在2015年提出,ERC代表Ethereum Request for Comment,即以太坊征求修改意见,20则是该标准的编号,ERC-20定义了一种代币(Token)在以太坊区块链上如何被创建、管理和交易的一套规则,这些规则包括代币的总供应量、账户余额、交易和批准等基本功能。
ERC-20标准的制定,使得在以太坊上创建和管理代币变得更加简单和标准化,这不仅促进了代币经济的发展,也为去中心化应用(DApps)提供了更多的灵活性和创新空间,以下是ERC-20 Token合约的详细解释:
代币总供应量(Total Supply):ERC-20代币必须有一个名为
totalSupply
的函数,返回代币的总供应量,这个值应该是恒定的,一旦设定就不能再改变。账户余额(Balance):每个代币持有者都有一个账户余额,可以通过
balanceOf
函数查询,这个函数接受一个地址作为参数,并返回该地址的代币余额。转账(Transfer):代币持有者可以通过
transfer
函数将代币发送给其他人,这个函数接受两个参数:接收者的地址和要发送的代币数量,如果转账成功,发送者的余额会减少,接收者的余额会增加。批准(Approve):ERC-20代币允许用户批准另一个账户代表他们消费一定数量的代币,这是通过
approve
函数实现的,它接受两个参数:被批准账户的地址和被批准消费的代币数量。转账从(Transfer From):这个函数允许一个账户代表另一个账户发送代币,它接受三个参数:发送者的地址、接收者的地址和要发送的代币数量,在执行转账之前,这个函数会检查发送者的账户是否有足够的余额,并且接收者的账户是否有足够的批准额度。
事件(Events):ERC-20标准定义了几个必须被触发的事件,包括
Transfer
和Approval
,这些事件允许外部监听者(如钱包或区块浏览器)跟踪代币的流动和批准状态的变化。符号和名称(Symbol and Name):ERC-20代币应该有一个符号(通常是3-4个字符)和一个名称,这些信息可以通过
symbol
和name
函数查询。代币精度(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标准所要求的所有函数和事件,开发者可以根据需要修改这个合约,例如改变代币的名称、符号或初始供应量。