僅供教育參考,不構成投資建議;投資可能產生損失。
直接答案
ERC-1155 是以太坊的多代幣標準。單一合約可以維護多種代幣類型,每個 token ID 都可代表同質化餘額、非同質化物品,或由具體實作選擇的其他供應量設計。因此,資產的識別鍵是 contract address + token ID,而不是只有代幣 ID。
該標準定義了單項與批次餘額查詢、單項與批次安全轉帳、操作員全域授權、接收方回呼、轉帳事件,以及選用的中繼資料 URI 行為。它不規定誰可以鑄造、供應量是否設有上限、中繼資料是否永久不變、代幣賦予何種法律權利,也不規定任何代幣的價值。這些屬性必須結合具體合約、角色權限及其外部相依項目逐一核實。
運作方式
- 識別餘額。
balanceOf(account, id)回傳某帳戶持有一個 ID 的數量。balanceOfBatch(accounts, ids)查詢成對的帳戶與 ID 項目。兩個合約都可能用 ID1表示彼此無關的資產,因此完整身分仍由鏈、合約位址和 ID 共同確定。 - 授權呼叫方。 持有人可以轉移自己的餘額,也可以呼叫
setApprovalForAll(operator, true)。該授權涵蓋持有人在該合約內擁有的全部 ERC-1155 ID;isApprovedForAll(owner, operator)回傳授權狀態。ERC-1155 沒有提供僅限一個 ID 或一個數量的原生授權方式。 - 執行單項或批次轉帳。
safeTransferFrom轉移一個 ID 及其數量。safeBatchTransferFrom轉移平行的ids與values陣列,兩者的長度和順序必須對應。批次處理可以減少重複的交易開銷,但不能保證對每種實作或工作負載都更便宜。 - 檢查合約接收方。 更新餘額並發出相關事件後,向合約進行的合規轉帳會呼叫
onERC1155Received或onERC1155BatchReceived。不支援回呼、回傳值錯誤或拒絕接收通常會使轉帳回復。這項接收檢查可降低資產意外鎖死的風險,但不能證明接收合約值得信任或提供了取回路徑。 - 根據事件重建狀態。 每次鑄造、轉帳和銷毀都必須透過
TransferSingle或TransferBatch體現。鑄造以零位址作為from,銷毀則以零位址作為to。索引器可以從這些日誌推導餘額及每個 ID 的淨鑄造供應量,但必須正確處理完整歷史、鏈重組和合約遷移。 - 解析中繼資料。 選用的 URI 擴充功能可以回傳包含
{id}的共用範本。用戶端會將其替換為小寫、左側補零至 64 個字元且不帶0x前綴的十六進位代幣 ID。除非具體實作和儲存保證另有說明,否則中繼資料仍可能被修改、無法存取或具有誤導性。
實例
某遊戲合約將 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 本身並不強制這項規則。同一合約之後仍可根據自身存取控制增發 ID1。
風險與控制
- 操作員權限範圍廣。 透過
setApprovalForAll獲得授權的惡意或已遭入侵操作員,可以轉移持有人在該合約內擁有的每一個 ID。核對操作員位址和合約,適當時使用獨立錢包,並撤銷過時授權。 - 鑄造、暫停和升級權限。 這些是具體實作的功能,而不是標準保證。檢查角色持有人、代理管理員、時間鎖、供應量擴充功能,以及升級能否改變餘額或轉帳規則。
- 中繼資料與資產不一致。 URI 或託管的 JSON 可以變更,而鏈上 ID 保持不變。核實內容雜湊、儲存持久性、發行方承諾,以及代幣合約之外所代表的權利。
- 整合錯誤。 錢包和索引器可能錯誤配對批次陣列、遺漏歷史事件、錯誤處理鏈重組,或混淆不同合約及鏈上的相同 ID。應對照合約呼叫、日誌和最終餘額進行核驗。
- 接收方與重入風險。 接收方回呼會在轉帳流程中執行外部程式碼。具體實作和整合協定需要採用適當的狀態更新順序與重入防護;支援回呼本身不等於已經通過安全審查。
- 成本與流動性風險。 批次轉帳仍會消耗 Gas,而且只要一個必要條件失敗就會整體回復。市場流動性、定價、版稅、跨鏈橋接、贖回和鏈下執行均不屬於 ERC-1155 的規範範圍。
常見誤解
- 「每個 ID 都是 NFT。」 一個 ID 可以有任意數量;是否具有非同質化屬性取決於具體實作的供應量與語義。
- 「一個合約就代表一個系列。」 一個合約可以容納許多彼此無關的代幣類型,而另一個合約中的相同數字 ID 識別的是不同資產。
- 「安全轉帳意味著資產安全。」 回呼只檢查接收方相容性,不檢查合約品質、價格、中繼資料或資產能否取回。
- 「批次處理總能節省 Gas。」 它通常能避免重複開銷,但實際結果取決於具體實作、ID 數量、儲存變化、呼叫資料和網路費用模型。