web3探索之旅--ERC20

192 阅读7分钟

web3探索

大家好,我是有接近四年的区块链相关工作经验的开发人员,但我日常的工作主要接触的是区块链以及去中心化存储的底层技术,对web3的应用和玩法知之甚少。

web3探索之旅系列文章将记录我对web3各种应用的学习和思考,我的目标是从比较基础的东西开始直到时下最流行的东西。

我将以ERC标准作为第一个学习主题。

什么是ERC

在了解ERC之前需要了解EIP.

EIP(Ethereum Improvement Proposal)意为以太坊改进提案,是为以太坊提出改进方案的标准。以太坊中任何人都可以创造一个EIP。EIP标准的编写准则在EIP 1 中提供。EIP的创作者负责在社区内建立共识并记录不同意见。

而ERC(Ethereum Request for Comment)是EIP的一个子集,主要包含了应用程序的标准或约定。

ERC20

ERC20是以太坊上的一种同质化代币合约标准,同质化意味着同一种代币之间可以像法币一样可以相互兑换。在技术层面上是在合约中维护账户和余额的映射关系,实现了转账等功能。

ERC20包含了2个事件,2个可选函数和6个必选函数

2个事件为:

event Transfer(address indexed from, address indexed to, uint256 value); 
event Approval(address indexed owner, address indexed spender, uint256 value);

Transfer事件应在调用transfer函数时触发

Approval事件应在调用approve函数时触发

2个可选函数是:

function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)

name()是一个只读函数,返回代币的名称

symbol()也是一个只读函数,返回代币的符号

decimals()还是一个只读函数,返回代币小数位数,这个参数主要用于客户端展示,如在合约中余额为111,decimals为2时,用户端应展示为1.11

接下来分别介绍6个必选函数

function totalSupply() external view returns (uint256); 

该只读函数应返回代币的供应总量

function balanceOf(address account) external view returns (uint256);  

该函数返回在入参 account上的代币的数量

function transfer(address to, uint256 value) external returns (bool); 

该函数将从调用者的地址(msg.sender)转移 value 个代币到地址 to上,并返回bool值来表示转账是否成功,如果转账成功应该触发事件Transfer

function transferFrom(address from, address to, uint256 value) external returns (bool);  

该函数允许调用者从入参from上转移入参value个代币到入参to上,返回bool值表示转账是否成功,如果转账成功应该触发事件transfer

需要注意,调用者转移其他账户上的代币的数量是由账户的实际拥有者通过接下来会介绍的函数approval指定的

function approve(address spender, uint256 value) external returns (bool);

该函数声明了入参spender可以通过函数transferFrom转移函数调用者(msg.sender)的代币的数量,并返回bool值表示是否操作成功,操作成功应触发事件Approval。

需要注意的是,使用该方法重置代币数量时有一定的安全风险。比如spender可操作调用者的余额为50时,调用者需要将50重置为100以满足一些需求。但spender可能将一笔transferfrom交易,插在调用者发送approve交易之前,从而提取出重置前的50个代币,并且仍然拥有重置后的100个代币余额,这可能与调用者的本来想要的效果不一致。为了避免这个风险,调用者可以先将spender的余额置为0,然后再置为100

function allowance(address owner, address spender) external view returns (uint256);

该只读函数返回owner允许spender通过transferFrom转移代币的数量

ERC20接口总体如下:

interface IERC20 {    
    event Transfer(address indexed from, address indexed to, uint256 value);  
  event Approval(address indexed owner, address indexed spender, uint256 value);     function totalSupply() external view returns (uint256);  
    function balanceOf(address account) external view returns (uint256);  
    function transfer(address to, uint256 value) external returns (bool);  
    function allowance(address owner, address spender) external view returns (uint256);  
    function approve(address spender, uint256 value) external returns (bool);  
    function transferFrom(address from, address to, uint256 value) external returns (bool);  
}

除了上述介绍的函数之外,ERC20往往包含

function mint(address account, uint256 amount) 
function burn()

mint函数用于在指定地址account凭空生成amount数量的代币,该函数需要严格的权限控制

burn函数用于销毁地址account上的amount数量的代币。

总结来说,ERC20标准定义了一套规则,使得以太坊上的代币具有统一的接口和交互方式,大大提高了不同代币间的兼容性和互操作性。通过实现这些接口,开发者可以确保他们的代币能在钱包、交易所和其他DApp中顺畅地被识别、发送和接收,促进了以太坊生态系统的繁荣发展。

ERC20扩展

在基础的ERC20之上还有许多扩展

ERC20Burnable

该扩展为ERC20新增了两个函数

function burn(uint256 value) public 
function burnFrom(address account, uint256 value) public

这两个函数增加了销毁代币的能力

ERC20Capped

该扩展为合约能够供应的代币数量总数做了一个限制,该限制可以使用只读函数function cap() public view returns (uint256)读取

ERC20Pausable

该扩展为ERC20的transfer,mint,burn增加了暂停选项,可以用于需要周期性开放转账的场景或者在合约实现出现重大bug时紧急冻结以防更大的损失产生

ERC20Permit

该扩展新增了方法

function permit(  address owner, address spender,  uint256 value,  uint256 deadline,  uint8 v,  bytes32 r,  bytes32 s  ) public

该方法允许owner的只进行签名(而不是实际发起交易)在deadline之前委托value数量的代币给spender 。该交易可以由任何人发起。

该扩展在owner只拥有代币而没有原生币付gasfee时非常便利。

ERC20Votes

该扩展将拥有代币和投票的权限做了关联

ERC20Wrapper

该扩展支持代币持有者质押underlying代币来获取相当数量的wrapped代币

ERC20FlashMint

该扩展在ERC20的基础上实现了ERC3156(闪电贷)标准,为ERC20增加了代币级别的闪电贷支持。

后续我将对ERC3156进行进一步的学习

ERC4626

ERC4626 协议是一种用于代币化保险库的标准,它可以优化和统一收益保险库的技术参数。收益保险库是指使用不同策略来为用户提供最佳收益的合约,例如借贷市场、聚合器或本身具有利息的代币。ERC4626 协议提供了一个标准的 API,用于表示单个底层 ERC-20 代币的收益保险库份额。

用户通过存入 ERC20 Token,从而获取一定比例的 vToken。在erc20 Token 存入的过程中,会在一定的时间内产生收益。在收益到期后,用户可以通过持有的vToken个数,获得一定比例的收益汇报。

此外ERC4626继承了ERC20,具有ERC20所具有的所有功能,而且还必须实现 IERC20Metadata接口。

后续我将对ERC4626进行进一步的学习

总结

ERC20基本可以说是以太坊上最重要的一个标准,通过对其合约接口标准和相关扩展的学习,我目前肤浅的将ERC20等同于在链上使用智能合约实现的货币系统,是许多金融相关的应用或标准的基础。在对ERC标准有了一个总体的认知之后,我将对ERC20的具体实现做进一步的学习。

在学习过程中我也发现了其与许多其他标准和应用(比如ERC3156,ERC4626 ,uniswap等等有着许多的关联,后续我也将对这些标准或应用进行学习。