erc是什么幣種(一文弄清以太坊代幣:ERC-20 & ERC-721)
文章共2000字,預計閱讀時間10分鐘。
Web3是個令人眼花繚亂的地方,里面充斥著新穎的詞匯:幣、代幣、NFT、跨鏈橋、Defi、Cefi,這些都讓入門者感到非常困惑。
新手可能花好幾天時間,看了好幾個項目的白皮書,最終都不明白什么是代幣,什么是NFT。有人好不容易清楚了代幣的含義,依然會疑惑,以太坊不是已經有了主幣ETH,為什么還有個代幣wETH?
本文試圖從代碼角度幫助弄清以太坊上的各種代幣,他們有什么功能,以及通常是如何實現這些功能的,歡迎交流。
TL;DR
「ERC」全稱「Ethereum Request for Comment」,中文名為「以太坊意見征求稿」,目前經常使用的有ERC-20和ERC-721兩個標準,前者用于發行同質化代幣,后者用于發行非同質化代幣(即NFT,non-fungible token)。
滿足標準的合約所記錄的數據就被稱為代幣,代幣只是被記錄在合約中的數據,鑄造、轉賬、銷毀操作也只是在合約中修改記錄的數值。
ERC標準規定了合約的接口,其他應用(例如OpenSea)可以通過合約的接口來操作代幣。
容易誤解的是,ERC標準僅僅規定了合約的接口格式,至于合約具體怎樣實現這些接口,ERC標準是不做規定的,所以能有各式各樣的NFT。
ERC-20
ERC-20標準規定了以下6個函數和2個事件
interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, 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 from, address to, 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 );}
6個函數的含義分別是
totalSupply():獲取代幣的總發行量
balanceOf(address account):獲取account地址代幣的余額
transfer(address to, uint256 amount):函數的調用者直接向to地址發送amount數量代幣
allowance(address owner, address spender):獲取owner向spender地址批準了多少消費額度
approve(address spender, uint256 amount):函數的調用者向spender地址批準amount數量消費額度
transferFrom(address from, address to, uint256 amount):函數的調用者使用from地址給的消費額度向to地址發送amount數量代幣
2個事件的含義分別是
Transfer:轉賬時發出,記錄from地址向to地址發送了amount數量代幣
Approval:批準消費額度時發出,記錄owner地址向spender地址批準了value消費額度
其中approve、transferFrom和allowance可能比較難理解,一個簡單的例子就是父母給零花錢,花錢的雖然是子女,但錢是從父母錢包里面扣除的。
如果合約實現了以上6個函數和2個事件,我們就可以說滿足ERC-20標準。通常項目方還會在合約中添加mint函數和burn函數,用來增發代幣和銷毀代幣,這里是ERC-20合約的一種實現方式。
滿足ERC-20標準的合約所鑄造出來的代幣,就可以上線uniswap等去中心化交易所,用來交換別的虛擬貨幣了。因為去中心化交易所需要調用transferFrom 方法,而以太坊的主幣ETH并沒有這個接口,所以查看ETH在uniswap中具體的交易情況,能發現ETH總是先被存入wETH合約轉換成同等數量的wETH代幣,之后uniswap再調用transferFrom 進行各種代幣間的交換。
ERC-721
ERC-721標準規定了以下10個函數和3個事件
interface IERC165 { function supportsInterface(bytes4 interfaceID) external view returns (bool);}interface IERC721 is IERC165 { event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId ) external; function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function getApproved(uint256 tokenId) external view returns (address operator); function setApprovalForAll(address operator, bool _approved) external; function isApprovedForAll(address owner, address operator) external view returns (bool);}
ERC-721標準是繼承了ERC-165標準的,其中ERC-165標準規定了函數supportsInterface(bytes4 interfaceID) 用于發布并檢測合約實現了什么接口。
ERC-165標準使得外部可以查詢合約是否支持接口,如果支持,查詢接口的版本,以便用戶可以調整與合約交互的方式。
剩下9個函數的含義分別是
balanceOf(address owner):獲取owner地址代幣的余額
ownerOf(uint256 tokenId):獲取tokenId號代幣的owner地址
safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) :安全地將tokenId號代幣從from地址發送到to地址并附加data信息(data信息在token發送到合約賬戶時會用到,可以用data來操作接收的合約,安全發送指的是合約會檢查to地址是不是合法的token接收者)
safeTransferFrom(address from, address to, uint256 tokenId):同上,data信息為空
transferFrom(address from, address to, uint256 tokenId):將tokenId號代幣從from地址發送到to地址,一般用于發送給他人賬戶,如果to地址是合約賬戶則可能出錯
approve(address to, uint256 tokenId):函數調用者將tokenId號代幣批準給to地址
getApproved(uint256 tokenId):獲取tokenId號代幣被批準給了哪個地址
setApprovalForAll(address operator, bool _approved):函數調用者管理第三方operator地址的權限,_approved表示是否給第三方批準
isApprovedForAll(address owner, address operator):獲取owner地址是否批準第三方operator地址操作自己所有的代幣
3個事件的含義分別是
Transfer:轉賬時發出,記錄from地址向to地址發送了tokenId 號代幣
Approval:批準時發出,記錄owner地址向approved批準了tokenId號代幣
ApprovalForAll:管理第三方權限時發出,記錄owner地址將第三方operator地址的管理權限設置為approved
由于合約中含有tokenId ,所以每個代幣都是不盡相同的,這正是「非同質化」的含義。ERC-721和ERC-20在設計思路上沒有太大差別,只不過由于ERC-721的代幣是非同質化的,所以既可以通過tokenId 進行單個批準,也可以將owner地址的代幣全部進行批準,而ERC-20只能批準固定數量。
在實際使用中,不一定需要把九個函數全部實現,這里是ERC-721合約的一種實現方式。
尾記
知道了ERC-20和ERC-721有什么用呢?
知道了標準,我們就可以通過ERC標準提供的接口直接操作各類代幣和NFT,例如,無聊猿是NFT,那么他的合約肯定也符合ERC-721標準。
可以通過以太坊瀏覽器,直接調用ownerOf接口查看2022號無聊猿的擁有者(當然使用代碼調用接口也可以,只是以太坊瀏覽器比較直觀)
我們再在最大的NFT交易市場OpenSea上查看一下2022號無聊猿,發現其擁有者確實是這個B44618開頭的賬戶
事實上,OpenSea這類應用,正是通過調用ERC標準提供的各種接口來實現交易的,當我們完全了解ERC標準之后,完全可以自己編寫應用來進行代幣的交易。
今天就到這里,再見。
參考文章
https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/
https://ethereum.org/zh/developers/docs/standards/tokens/erc-721/
https://eips.ethereum.org/EIPS/eip-165