跳至主要内容
Change page

ERC-1155 多代幣標準

頁面最後更新時間: 2026年2月14日

介紹

用於多種代幣管理的合約標準介面 單一部署的合約可以包括同質化代幣、非同質化代幣或其他配置(例如半同質化代幣)的任意組合。

多代幣標準是什麼意思?

這個想法很簡單,旨在創建一個智慧型合約介面,可以表示和控制任意數量的同質化和非同質化代幣類型。 如此一來,ERC-1155 代幣可以執行與 ERC-20ERC-721 代幣相同的功能,甚至可以同時執行兩者的功能。 它改進了 ERC-20 和 ERC-721 標準的功能,使其更有效率並修正了明顯的實作錯誤。

EIP-1155opens in a new tab 中對 ERC-1155 代幣有完整說明。

先決條件

為了更了解此頁面,建議您先閱讀有關代幣標準ERC-20ERC-721 的內容。

ERC-1155 函式和功能:

批次轉帳

批量傳送的工作原理與常規 ERC-20 傳送非常相似。 我們來看看標準的 ERC-20 transferFrom 函式:

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
顯示全部

ERC-1155 中唯一的區別是我們將值作爲陣列傳輸,同時也傳輸了 ids 陣列。 例如,給定 ids=[3, 6, 13]values=[100, 200, 5],轉帳結果將是

  1. _from 將 100 個 ID 為 3 的代幣轉帳到 _to
  2. _from 將 200 個 ID 為 6 的代幣轉帳到 _to
  3. _from 將 5 個 ID 為 13 的代幣轉帳到 _to

在 ERC-1155 中,我們只有 transferFrom,沒有 transfer。 若要像一般的 transfer 那樣使用,只需將來源地址設為呼叫此函式的地址。

批次餘額

對應的 ERC-20 balanceOf 呼叫,同樣也具有支援批次處理的對應函式。 作爲對比,這是 ERC-20 的版本:

1// ERC-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) 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-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) 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 _data
7) 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

安全轉帳規則

在前面的解釋中,我們已經提到過一些安全轉帳規則。 現在我們來看看最重要的規則:

  1. 呼叫者必須已獲授權,可代表 _from 地址花費代幣,或者呼叫者必須等於 _from
  2. 在以下情況下,轉帳呼叫將回退
    1. _to 地址為 0。
    2. _ids 的長度與 _values 的長度不同。
    3. _ids 中任何代幣持有者的餘額,低於 _values 中發送給接收者的對應數量。
    4. 出現任何其他錯誤。

注意:所有批次函式 (包含掛鉤) 也都存在非批次版本。 這樣做是為了提高燃料效率,考慮到只轉移一種資產可能仍然是最常用的方式。 簡潔起見,我們在這裡沒有介紹這些非批次的版本,包括安全轉帳規則。 名稱是相同的,只需移除 'Batch'。

延伸閱讀

這篇文章對你有幫助嗎?