一、什么是 ERC-20?
ERC-20(Ethereum Request for Comments 20)是以太坊区块链上最广泛使用的代币标准,界说了智能合约发行可互换代币(Fungible Token)的通用规则。通过标准化接口,ERC-20 确保不同代币在钱包、生意业务所和 DeFi 协议中无缝交互。
核心代价:
互利用性
所有 ERC-20 代币兼容以太坊生态工具(如 MetaMask、Uniswap)。
简化开辟
开辟者无需从零设计代币逻辑,低落开辟成本。
生态基石
支撑了 90% 以上的以太坊代币(如 USDT、UNI、LINK)。
二、ERC-20 的六大核心功能
ERC-20 标准要求代币合约必须实现以下接口:
基础功能
totalSupply():返回代币总供应量。
balanceOf(address):查询指定地点的余额。
transfer(address, uint256):向目标地点转账代币。
授权与代理转账
approve(address, uint256):授权第三方地点使用一定数量的代币。
transferFrom(address, address, uint256):被授权地点代理转账(如生意业务所提币)。
变乱关照
Transfer(address, address, uint256):代币转账时触发。
Approval(address, address, uint256):授权利用时触发。
三、ERC-20 代币的典范应用场景
场景案例作用稳固币USDT、USDC、DAI代价存储与生意业务媒介管理代币UNI(Uniswap)、COMP(Compound)社区投票与协议控制实用代币LINK(Chainlink)、BAT(Brave 浏览器)支付网络服务费用ICO/IEO2017 年以太坊众筹潮(如 EOS、BNB 早期版本)项目融资与代币分发DeFi 底层资产Aave 的 aToken、Curve 的 LP 代币抵押借贷与运动性凭证 四、ERC-20 的技能优势与范围性
优势:
标准化兼容:钱包和生意业务所无需为每种代币单独开辟支持逻辑。
低成本发行:使用模板(如 OpenZeppelin 库)可在 10 分钟内创建代币。
机动扩展:可通过继续 ERC-20 合约添加功能(如代币销毁、分红机制)。
范围性:
转账安全性题目:
若向合约地点误转 ERC-20 代币(未实现 tokensReceived 的回调),代币将永久丢失(ERC-223 已修复此题目)。
无元数据支持:
代币名称、符号等需硬编码在合约中,ERC-20 未强制要求(导致部分代币显示异常)。
批量利用低效:
批量转账需多次调用 transfer,斲丧更多 Gas(ERC-1155 优化了此题目)。
五、ERC-20 代币的创建步骤
编写智能合约
使用 Solidity 继续 OpenZeppelin 的 ERC-20 模板:
- <SOLIDITY>
- // 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);
- }
- }
复制代码 摆设合约
通过 Remix IDE 或 Hardhat 摆设到以太坊网络(主网或测试网)。
验证与审计
在 Etherscan 验证合约源码。
进行安全审计(尤其涉及代币增发、权限控制逻辑)。
python 示例
==参考:https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/#web3py-example
让我们看看如此告急的一个标准是怎样使我们可以或许简朴地检查以太坊上的任何 ERC-20 代币合约。 我们只需要合约的应用程序二进制接口 (ABI) 来创造一个 ERC-20 代币界面。 下面我们将使用一个简化的应用程序二进制接口,让例子变得更为简朴。
 
- from web3 import Web3
- w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
- dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI
- weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # Wrapped ether (WETH)
- acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2
- # This is a simplified Contract Application Binary Interface (ABI) of an ERC-20 Token Contract.
- # It will expose only the methods: balanceOf(address), decimals(), symbol() and totalSupply()
- simplified_abi = [
- {
- 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}],
- 'name': 'balanceOf',
- 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
- 'stateMutability': 'view', 'type': 'function', 'constant': True
- },
- {
- 'inputs': [],
- 'name': 'decimals',
- 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}],
- 'stateMutability': 'view', 'type': 'function', 'constant': True
- },
- {
- 'inputs': [],
- 'name': 'symbol',
- 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
- 'stateMutability': 'view', 'type': 'function', 'constant': True
- },
- {
- 'inputs': [],
- 'name': 'totalSupply',
- 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
- 'stateMutability': 'view', 'type': 'function', 'constant': True
- }
- ]
- dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi)
- symbol = dai_contract.functions.symbol().call()
- decimals = dai_contract.functions.decimals().call()
- totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals
- addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals
- # DAI
- print("===== %s =====" % symbol)
- print("Total Supply:", totalSupply)
- print("Addr Balance:", addr_balance)
- weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi)
- symbol = weth_contract.functions.symbol().call()
- decimals = weth_contract.functions.decimals().call()
- totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals
- addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals
- # WETH
- print("===== %s =====" % symbol)
- print("Total Supply:", totalSupply)
- print("Addr Balance:", addr_balance)
复制代码 六、ERC-20 与其他代币标准的对比
标准特性典范用例代表代币ERC-20同质化代币,基础转账功能通用型代币USDT、UNIERC-721非同质化代币(NFT),唯一标识数字艺术品、游戏道具CryptoPunksERC-1155批量利用 + 同质/非同质混合游戏资产包、票务系统Enjin 游戏道具ERC-4626收益型代币标准,优化 DeFi 金库交互收益聚合协议Yearn 金库凭证 七、ERC-20 的安全风险与历史变乱
批量转账漏洞
案例:2017 年 Parity 多重签名钱包漏洞导致 1.5 亿美元 ETH 被冻结。
教训:代币合约需严酷限定权限(如禁用 approve 后门)。
假代币骗局
伎俩:骗子摆设同名 ERC-20 合约(如虚假 USDT),诱导用户充值。
防御:生意业务前需在 Etherscan 验证合约地点和代码。
重入攻击
案例:2016 年 The DAO 变乱(非 ERC-20 但影响生态)。
防护:使用 Checks-Effects-Interactions 模式编写合约逻辑。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |