最近看了一些智能合約,發現用的最經常的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/