ERC1155
ERC1155 是以太坊的多代幣標準,允許單一合約同時管理同質代幣和非同質代幣,特別適合遊戲和批量 NFT 場景。
Last updated
三種標準的設計差異:
ERC20(同質代幣):
- balanceOf(address) → 餘額
- transfer(to, amount)
- 每個代幣完全相同
ERC721(NFT):
- ownerOf(tokenId) → 擁有者
- transferFrom(from, to, tokenId)
- 每個代幣唯一
ERC1155(多代幣):
- balanceOf(address, id) → 特定代幣餘額
- safeBatchTransferFrom(from, to, ids[], amounts[])
- 可以是同質或非同質
- 支援批量操作ERC1155 的批量能力:
場景:轉移 10 種不同物品
ERC721 做法:
- 呼叫 10 次 transferFrom
- 10 筆交易
- 10 倍 Gas 費
ERC1155 做法:
- 呼叫 1 次 safeBatchTransferFrom
- 1 筆交易
- 大幅節省 Gas
程式碼示例:
safeBatchTransferFrom(
from,
to,
[id1, id2, id3, id4, id5], // 多個物品 ID
[10, 5, 1, 100, 1], // 各自數量
data
)ERC1155 在遊戲中的應用:
一個 RPG 遊戲可能有:
同質資源:
- 金幣(每枚相同)
- 木材(可堆疊)
- 鑽石(通用貨幣)
非同質物品:
- 角色(每個獨特)
- 傳奇武器(限量唯一)
- 土地(位置唯一)
半同質物品:
- 普通劍(同款可換)
- 藥水(同類型相同)
- 箱子(同類別相同)
一個 ERC1155 合約全部搞定!{
"name": "Edward Snowden (Supporting Image 2)",
"description": "NFT 描述文字...",
"external_link": null,
"image": "https://lh3.googleusercontent.com/...",
"animation_url": null
}取得 NFT Metadata 的方式:
API 呼叫:
GET /api/v1/metadata/{contract}/{tokenId}
回傳內容:
- name: NFT 名稱
- description: 描述
- image: 圖片 URL
- animation_url: 動畫 URL
- attributes: 屬性陣列
重要提醒:
- Metadata 通常存在鏈下
- 使用 IPFS 更去中心化
- 中心化伺服器有風險ERC1155 合約範例結構:
contract MyGameItems is ERC1155 {
// 代幣類型常數
uint256 public constant GOLD = 0;
uint256 public constant SILVER = 1;
uint256 public constant SWORD = 2;
uint256 public constant SHIELD = 3;
constructor() ERC1155("https://game.example/api/item/{id}.json") {
// 初始化:鑄造一些代幣
_mint(msg.sender, GOLD, 10000, ""); // 10000 金幣
_mint(msg.sender, SILVER, 5000, ""); // 5000 銀幣
_mint(msg.sender, SWORD, 100, ""); // 100 把劍
_mint(msg.sender, SHIELD, 50, ""); // 50 個盾
}
}