<cite id="1ndtl"></cite>
<ruby id="1ndtl"></ruby>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"><dl id="1ndtl"><del id="1ndtl"></del></dl></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike>
<strike id="1ndtl"></strike><span id="1ndtl"><dl id="1ndtl"></dl></span>
<strike id="1ndtl"></strike><strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"></span>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
<th id="1ndtl"><noframes id="1ndtl"><span id="1ndtl"><video id="1ndtl"><strike id="1ndtl"></strike></video></span> <strike id="1ndtl"></strike>
<strike id="1ndtl"></strike>
<span id="1ndtl"><dl id="1ndtl"></dl></span>
  1. 首頁
  2. erc是什么幣種(一文弄清以太坊代幣:ERC-20 & ERC-721)

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

相關文章
美女网站色