ERC-1155 多代幣標準
頁面最後更新時間: 2026年2月14日
介紹
用於多種代幣管理的合約標準介面 單一部署的合約可以包括同質化代幣、非同質化代幣或其他配置(例如半同質化代幣)的任意組合。
多代幣標準是什麼意思?
這個想法很簡單,旨在創建一個智慧型合約介面,可以表示和控制任意數量的同質化和非同質化代幣類型。 如此一來,ERC-1155 代幣可以執行與 ERC-20 和 ERC-721 代幣相同的功能,甚至可以同時執行兩者的功能。 它改進了 ERC-20 和 ERC-721 標準的功能,使其更有效率並修正了明顯的實作錯誤。
EIP-1155opens in a new tab 中對 ERC-1155 代幣有完整說明。
先決條件
為了更了解此頁面,建議您先閱讀有關代幣標準、ERC-20 和 ERC-721 的內容。
ERC-1155 函式和功能:
- 批次轉帳:在單次呼叫中轉帳多個資產。
- 批次餘額:在單次呼叫中取得多個資產的餘額。
- 批次授權:將所有代幣授權給一個地址。
- 掛鉤:接收代幣掛鉤。
- 支援 NFT:若供應量只有 1,則視為 NFT。
- 安全轉帳規則:一組用於安全轉帳的規則。
批次轉帳
批量傳送的工作原理與常規 ERC-20 傳送非常相似。 我們來看看標準的 ERC-20 transferFrom 函式:
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;顯示全部ERC-1155 中唯一的區別是我們將值作爲陣列傳輸,同時也傳輸了 ids 陣列。 例如,給定 ids=[3, 6, 13] 和 values=[100, 200, 5],轉帳結果將是
- 從
_from將 100 個 ID 為 3 的代幣轉帳到_to。 - 從
_from將 200 個 ID 為 6 的代幣轉帳到_to。 - 從
_from將 5 個 ID 為 13 的代幣轉帳到_to。
在 ERC-1155 中,我們只有 transferFrom,沒有 transfer。 若要像一般的 transfer 那樣使用,只需將來源地址設為呼叫此函式的地址。
批次餘額
對應的 ERC-20 balanceOf 呼叫,同樣也具有支援批次處理的對應函式。 作爲對比,這是 ERC-20 的版本:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) external view returns (uint256[] memory);對於餘額調用來說更簡單,我們可以在一次調用中取得多個餘額。 我們傳輸所有者的陣列,然後是代幣 ids 的陣列。
例如,給定 _ids=[3, 6, 13] 和 _owners=[0xbeef..., 0x1337..., 0x1111...],傳回值會是
1[2 balanceOf(0xbeef...),3 balanceOf(0x1337...),4 balanceOf(0x1111...)5]批次授權
1// ERC-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) external view returns (bool);顯示全部批准與 ERC-20 略有不同。 您可以透過 setApprovalForAll 將操作者設為已授權或未授權,而不是授權特定數量。
可以透過 isApprovedForAll 讀取目前的授權狀態。 如你所見,要么全部批准,要么不批准。 不能定義要批准代幣的數量,甚至代幣類型。
這是考慮到簡潔性而故意設計的。 你只能批准一個地址的所有代幣。
接收掛鉤
1function onERC1155BatchReceived(2 address _operator,3 address _from,4 uint256[] calldata _ids,5 uint256[] calldata _values,6 bytes calldata _data7) external returns(bytes4);因為支援 EIP-165opens in a new tab,ERC-1155 僅支援智能合約的接收掛鉤。 鉤子函數必須傳回一個事先預先定義的 4 位元組值,這個值被指定為:
1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))當接收合約傳回此值時,表示合約知道如何處理 ERC-1155 代幣並接受轉帳。 太好了,代幣不會再卡在合約中了!
支援 NFT
當供應量只有 1 時,該代幣本質上是非同質化代幣 (NFT)。 依照 ERC-721 標準,你可以定義一個元數據網址。 用戶端可以讀取和修改該 URL,請參閱此處opens in a new tab。
安全轉帳規則
在前面的解釋中,我們已經提到過一些安全轉帳規則。 現在我們來看看最重要的規則:
- 呼叫者必須已獲授權,可代表
_from地址花費代幣,或者呼叫者必須等於_from。 - 在以下情況下,轉帳呼叫將回退
_to地址為 0。_ids的長度與_values的長度不同。_ids中任何代幣持有者的餘額,低於_values中發送給接收者的對應數量。- 出現任何其他錯誤。
注意:所有批次函式 (包含掛鉤) 也都存在非批次版本。 這樣做是為了提高燃料效率,考慮到只轉移一種資產可能仍然是最常用的方式。 簡潔起見,我們在這裡沒有介紹這些非批次的版本,包括安全轉帳規則。 名稱是相同的,只需移除 'Batch'。