Web3学习之ERC20ERC20ERC20是以太坊上的一种代币标准,它定义了一组接口(方法和事件),使得代币可以在不同的应用程序、钱包和交易所之间进行互操作。ERC20标准使得创建和使用代币变得简单和一致,是最广泛采用的代币标准之一。EIP/ERC标准标准:降低沟通协作成本
ERC20 是以太坊上的一种代币标准,它定义了一组接口(方法和事件),使得代币可以在不同的应用程序、钱包和交易所之间进行互操作。ERC20 标准使得创建和使用代币变得简单和一致,是最广泛采用的代币标准之一。
EIP(Ethereum Improvement Proposal,以太坊改进提案)是以太坊社区提出和讨论对以太坊平台进行改进和变更的正式流程。EIP 分为几个主要分类,每个分类有不同的目的和用途。以下是 EIP 的主要分类:
核心(Core):
接口(Interface,ERC):
网络(Networking):
元(Meta):
信息(Informational):
你所提到的区别是区分原生币(Coin)和代币(Token)的关键概念。以下是更详细的解释:
以下是一个简单的将 ETH 转换为 WETH 的合约示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IWETH {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
contract ETHToWETH {
IWETH public weth;
constructor(address _weth) {
weth = IWETH(_weth);
}
function convertEthToWeth() external payable {
require(msg.value > 0, "Must send ETH to convert to WETH");
weth.deposit{value: msg.value}();
}
function convertWethToEth(uint256 amount) external {
require(amount > 0, "Must specify WETH amount to convert to ETH");
weth.withdraw(amount);
payable(msg.sender).transfer(amount);
}
receive() external payable {
revert("Send ETH directly to this contract is not allowed");
}
}
https://eips.ethereum.org/EIPS/eip-20
标准接口允许以太坊上的任何代币被其他应用程序重复使用:从钱包到去中心化交易所。
必备技能:不适用任何库的情况下,纯手撸ERC20
不要死记硬背
第一性原理
从区块链的角度出发实现一个数字货币一个链上的数字货币
思考:在技术层面需要什么接口
任何一个货币系统都有一个余额表,知道用户名是谁、余额是多少,在ERC20里面叫 balanceOf
它接收一个地址作为参数,返回这个地址的余额
知道总量是多少,在ERC20里面叫 total supply
用户之间需要转账,在ERC20里面叫 transfer
还有approve
、allowance
可以用于:
两个普通用户之间的一个约定,也可以用于一个普通用户和一个合约用户之间的一个约定。
例如 A 和 B ,其中A有1万元,但是它不想经常使用,因为没有很好的管理习惯,使用的越多,风险越大。所以A 新建了一个 B 账户,B 账户最多可以使用 A 账户中1万元的100块钱。
这就是 approve
、allowance
、transferFrom
所服务的一个场景
6 + 3 + 2
6 个必备的方法
3个可选的方法
2个必备的事件
思考:获取 USDT 合约的所有地址和地址的持币数量
通过事件获取合约的所有持币地址
https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#balances
ERC20 还有很多插件:mint 、burn ...
https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20
以太坊 USDT 没有完全遵循 ERC20 标准,它transfer没有返回值
参考:
1 安装USDT 修改你的 interface
2 使用 SafeERC20
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract BaseERC20 {
string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;
mapping(address => uint256) balances;
mapping(address => mapping(address => uint256)) allowances;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
constructor() {
// 设置代币的名称、符号、小数位数和总供应量
name = "BaseERC20";
symbol = "BERC20";
decimals = 18;
totalSupply = 100000000 * (10 ** uint256(decimals));
// 初始供应量分配给合约部署者
balances[msg.sender] = totalSupply;
}
function balanceOf(address _owner) public view returns (uint256 balance) {
return balances[_owner];
}
function transfer(address _to, uint256 _value) public returns (bool success) {
require(balances[msg.sender] >= _value && _value > 0, "ERC20: transfer amount exceeds balance");
require(_to != address(0), "ERC20: transfer to the zero address");
unchecked {
balances[msg.sender] -= _value;
}
unchecked {
balances[_to] += _value;
}
emit Transfer(msg.sender, _to, _value);
return true;
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(balances[_from] >= _value && _value > 0, "ERC20: transfer amount exceeds balance");
require(_to != address(0), "ERC20: transfer to the zero address");
require(allowances[_from][msg.sender] >= _value, "ERC20: transfer amount exceeds allowance");
unchecked {
balances[_from] -= _value;
}
unchecked {
balances[_to] += _value;
}
unchecked {
allowances[_from][msg.sender] -= _value;
}
emit Transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool success) {
require(_spender != address(0), "ERC20: approve to the zero address");
allowances[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
return allowances[_owner][_spender];
}
}
OpenZeppelin
]<https://www.openzeppelin.com/contracts>OpenZeppelin 是一个开源的区块链开发工具和智能合约库,旨在帮助开发者安全地构建和部署智能合约。它提供了一系列经过审核和验证的智能合约实现,包括代币标准、访问控制、支付通道等,极大地简化了以太坊和其他区块链平台上的开发工作。
OpenZeppelin 是区块链开发中不可或缺的工具,提供了安全、可靠和高效的智能合约实现。通过使用 OpenZeppelin,开发者可以更专注于业务逻辑的实现,而不必担心底层合约的安全和稳定性。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!