﻿---
title: "ERC-1155"
description: "ERC-1155 是以太坊的多代幣標準：一個合約可依 ID 記錄多種同質化、非同質化或混合代幣，並在一次批次轉帳中轉移多個 ID。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ERC-1155

> 僅供教育參考，不構成投資建議；投資可能產生損失。

<a id="answer"></a>

## 直接答案

ERC-1155 是以太坊的多代幣標準。單一合約可以維護多種代幣類型，每個 `token ID` 都可代表同質化餘額、非同質化物品，或由具體實作選擇的其他供應量設計。因此，資產的識別鍵是 `contract address + token ID`，而不是只有代幣 ID。

該標準定義了單項與批次餘額查詢、單項與批次安全轉帳、操作員全域授權、接收方回呼、轉帳事件，以及選用的中繼資料 URI 行為。它不規定誰可以鑄造、供應量是否設有上限、中繼資料是否永久不變、代幣賦予何種法律權利，也不規定任何代幣的價值。這些屬性必須結合具體合約、角色權限及其外部相依項目逐一核實。

<a id="mechanism"></a>

## 運作方式

1. **識別餘額。** `balanceOf(account, id)` 回傳某帳戶持有一個 ID 的數量。`balanceOfBatch(accounts, ids)` 查詢成對的帳戶與 ID 項目。兩個合約都可能用 ID `1` 表示彼此無關的資產，因此完整身分仍由鏈、合約位址和 ID 共同確定。
2. **授權呼叫方。** 持有人可以轉移自己的餘額，也可以呼叫 `setApprovalForAll(operator, true)`。該授權涵蓋持有人在該合約內擁有的全部 ERC-1155 ID；`isApprovedForAll(owner, operator)` 回傳授權狀態。ERC-1155 沒有提供僅限一個 ID 或一個數量的原生授權方式。
3. **執行單項或批次轉帳。** `safeTransferFrom` 轉移一個 ID 及其數量。`safeBatchTransferFrom` 轉移平行的 `ids` 與 `values` 陣列，兩者的長度和順序必須對應。批次處理可以減少重複的交易開銷，但不能保證對每種實作或工作負載都更便宜。
4. **檢查合約接收方。** 更新餘額並發出相關事件後，向合約進行的合規轉帳會呼叫 `onERC1155Received` 或 `onERC1155BatchReceived`。不支援回呼、回傳值錯誤或拒絕接收通常會使轉帳回復。這項接收檢查可降低資產意外鎖死的風險，但不能證明接收合約值得信任或提供了取回路徑。
5. **根據事件重建狀態。** 每次鑄造、轉帳和銷毀都必須透過 `TransferSingle` 或 `TransferBatch` 體現。鑄造以零位址作為 `from`，銷毀則以零位址作為 `to`。索引器可以從這些日誌推導餘額及每個 ID 的淨鑄造供應量，但必須正確處理完整歷史、鏈重組和合約遷移。
6. **解析中繼資料。** 選用的 URI 擴充功能可以回傳包含 `{id}` 的共用範本。用戶端會將其替換為小寫、左側補零至 64 個字元且不帶 `0x` 前綴的十六進位代幣 ID。除非具體實作和儲存保證另有說明，否則中繼資料仍可能被修改、無法存取或具有誤導性。

<a id="example"></a>

## 實例

某遊戲合約將 ID `1` 分配給金幣，將 ID `7` 分配給通行證，將 ID `42` 分配給一把獨一無二的寶劍。Alice 持有 `balanceOf(Alice, 1) = 500`、`balanceOf(Alice, 7) = 3` 和 `balanceOf(Alice, 42) = 1`。

- Alice 呼叫 `safeBatchTransferFrom`，傳入 `ids = [1, 7, 42]` 和 `values = [120, 1, 1]`。如果驗證成功，她的新餘額分別為 `500 - 120 = 380`、`3 - 1 = 2` 和 `1 - 1 = 0`；接收方取得對應數量。
- 合約發出 `TransferBatch`。如果接收方是合約，就必須透過 `onERC1155BatchReceived` 接受該批次；否則整筆交易回復，三項餘額變化都不會保留。
- ID `42` 之所以表現為非同質化代幣，只是因為其發行和轉帳邏輯將供應量維持在 `1`。ERC-1155 本身並不強制這項規則。同一合約之後仍可根據自身存取控制增發 ID `1`。

<a id="risks"></a>

## 風險與控制

- **操作員權限範圍廣。** 透過 `setApprovalForAll` 獲得授權的惡意或已遭入侵操作員，可以轉移持有人在該合約內擁有的每一個 ID。核對操作員位址和合約，適當時使用獨立錢包，並撤銷過時授權。
- **鑄造、暫停和升級權限。** 這些是具體實作的功能，而不是標準保證。檢查角色持有人、代理管理員、時間鎖、供應量擴充功能，以及升級能否改變餘額或轉帳規則。
- **中繼資料與資產不一致。** URI 或託管的 JSON 可以變更，而鏈上 ID 保持不變。核實內容雜湊、儲存持久性、發行方承諾，以及代幣合約之外所代表的權利。
- **整合錯誤。** 錢包和索引器可能錯誤配對批次陣列、遺漏歷史事件、錯誤處理鏈重組，或混淆不同合約及鏈上的相同 ID。應對照合約呼叫、日誌和最終餘額進行核驗。
- **接收方與重入風險。** 接收方回呼會在轉帳流程中執行外部程式碼。具體實作和整合協定需要採用適當的狀態更新順序與重入防護；支援回呼本身不等於已經通過安全審查。
- **成本與流動性風險。** 批次轉帳仍會消耗 Gas，而且只要一個必要條件失敗就會整體回復。市場流動性、定價、版稅、跨鏈橋接、贖回和鏈下執行均不屬於 ERC-1155 的規範範圍。

<a id="misconceptions"></a>

## 常見誤解

- **「每個 ID 都是 NFT。」** 一個 ID 可以有任意數量；是否具有非同質化屬性取決於具體實作的供應量與語義。
- **「一個合約就代表一個系列。」** 一個合約可以容納許多彼此無關的代幣類型，而另一個合約中的相同數字 ID 識別的是不同資產。
- **「安全轉帳意味著資產安全。」** 回呼只檢查接收方相容性，不檢查合約品質、價格、中繼資料或資產能否取回。
- **「批次處理總能節省 Gas。」** 它通常能避免重複開銷，但實際結果取決於具體實作、ID 數量、儲存變化、呼叫資料和網路費用模型。

<a id="related"></a>

## 相關主題

- [ERC-20](/zh-tw/crypto/erc20/)
- [ERC-721](/zh-tw/crypto/erc721/)
- [NFT](/zh-tw/crypto/nft/)
- [代幣標準](/zh-tw/crypto/token-standard/)

<a id="sources"></a>

## 來源

- [ERC-1155：多代幣標準](https://eips.ethereum.org/EIPS/eip-1155)
- [ERC1155 API](https://docs.openzeppelin.com/contracts/5.x/api/token/erc1155)

Source: https://wiki.fcontext.com/zh-tw/crypto/erc1155/index.mdx
