天天看點

常用ERC标準學習

最近看了一些智能合約,發現用的最經常的ERC标準為ERC-20、ERC-165、ERC-721,以此學習一下做個筆記

ERC-20标準接口主要是在智能合約中實作了代币的标準api,也就是通過函數來為代币提供基本的功能:例如代币轉賬、授權等等。

ERC-20标準接口中有三個可選函數,主要是傳回代币的基本資訊,是以也可以稱為中繼資料。我們來看某個智能合約中的代碼:

其中,函數<code>name()</code>:傳回的是代币的名稱,例如Binance Coin

函數<code>symbol()</code>:傳回的是代币的代号,例如BNB

函數<code>decimals()</code>:傳回的是代币的使用的小數位數,例如8(意味着将代币總量除以100000000來擷取表現的形式)

繼續看上一個智能合約中标準定義的ERC20的必要函數

其中,函數<code>totalSupply</code>:傳回總令牌供應量

函數<code>balanceOf</code>:傳回賬戶的餘額

函數<code>transfer</code>:向<code>to</code>位址轉移<code>value</code>數量的代币,函數必須觸發事件<code>Transfer</code>

函數<code>transferFrom</code>:從<code>from</code>向<code>to</code>位址轉移<code>value</code>數量的代币,函數必須觸發事件<code>Transfer</code>

transferFrom函數,可以允許第三方代表我們轉移代币。 如果 _from 賬号沒有授權調用帳戶轉移代币,則該函數需要抛出異常。

函數<code>approve</code>:授權<code>spender</code>可以從我們在賬戶最多轉移代币的數量<code>value</code>,可以多次轉移,但總量不超過<code>value</code>

這個函數可以再次調用,以覆寫授權額度 <code>_value</code>,調用者可以在調整授權額度時,先設定為0,然後在設定為一個其他額度

函數<code>allowance</code>:查詢<code>owner</code>授權給<code>spender</code>的額度

事件<code>Transfer</code>:當有代币轉移時,必須觸發<code>Transfer</code>事件

如果是新産生代币,觸發 Transfer 事件的 <code>from</code> 應該設定為 <code>0x0</code> 。

事件<code>Approval</code>:<code>approve</code>函數成功執行時,必須觸發<code>Approval</code>事件

ERC-165隻是一個标準,要求使用一種标準的方法去釋出或者檢測(supportsInterface)一個智能合約所實作的接口。

我們可以看到接口的<code>supportsInterface</code>函數需要一個參數,為接口id

函數選擇器:可以使用 <code>bytes4(keccak256('function_name(bytes4)'));</code> 計算得到,或者使用合約函數的<code>selector</code>方法

接口ID:為接口中所有函數選擇器的異或(XOR)

例如:

實作ERC-165标準的合約:

相容 ERC-165的合約應該實作接口 ERC165.sol(上面的IERC165.sol)

這個接口的接口ID 為 <code>0x01ffc9a7</code>

是以,若合約實作supportInterface函數将傳回:

true:當接口ID<code>interfaceID</code>是<code>0x01ffc9a7</code>(EIP165标準接口),傳回true

false:當<code>interfaceID</code>是<code>0xffffffff</code>,傳回false

true:任何合約實作了接口的<code>interfaceID</code>都傳回true

false:其他的傳回false

以上是檢測合約是否采用ERC-165接口的方法,那麼如何檢測合約是否實作了某個接口呢?

若不确定合約是否實作ERC-165,則按上面的檢測步驟檢測

如果沒有實作ERC-165,則不得不檢視它采用哪種老式方法

如果實作了ERC-165,則直接調用supportInterface(InterfaceID)來确定它是否實作了對應的接口

ERC-721:非同質化(Non-Fungible Token,以下簡稱 NFT 或 NFTs)代币标準

是智能合約中實作 NFT 的标準API。 标準提供了跟蹤和轉移NFTs的基本功能。

NFT可以代表對數字或實體資産的所有權。非同質代表獨一無二,NFT是可區分的

ERC20代币是可置換的,且可細分為N份(1 = 10 * 0.1), 而ERC721的Token最小的機關為1,無法再分割。

每個符合ERC-721的合同都必須實作 <code>ERC721</code> 和 <code>ERC165</code> 接口

如果接收NFT的是合約,則需要實作以下接口:

可選擴充函數-元資訊:

ERC721 中繼資料 JSON Schema描述:

ERC-721标準的枚舉擴充資訊(可選):

參考資料:https://learnblockchain.cn/docs/eips/