3、ERC-1155标准与半同代币:核心接口、批量铸造与转账、与ERC-721的对比、应用场景分析

好,咱们今天聊聊ERC-1155。说实话,这个标准刚出来的时候,我第一反应是:这不就是把ERC-20和ERC-721揉在一起了吗?后来在项目里真正用上了,才发现自己太天真了。

ERC-1155,官方叫它“半同质化代币标准”。你想想看,它既不是完全同质化的(像ETH那样你一个我一个没区别),也不是完全非同质化的(像CryptoPunks那样每个都独一无二)。它处在中间地带——同一个ID下的代币是可互换的,但不同ID之间完全不同。

嗯,我打个比方你就明白了。游戏里的“金币”是ERC-20,“传奇武器”是ERC-721。那“药水”呢?同一种药水,你喝一瓶和我喝一瓶效果一样,但药水和剑不能混为一谈。这就是ERC-1155的典型场景。

核心接口:一个合约搞定所有

ERC-1155最让我欣赏的一点,就是它的接口设计极其精简。你只需要部署一个合约,就能管理无限多种代币。这在Gas费上省了多少,做过NFT项目的人都懂。

核心接口就这几个:

  • balanceOf(address account, uint256 id) —— 查某个账户有多少个ID为id的代币
  • balanceOfBatch(address[] accounts, uint256[] ids) —— 批量查询,一次查多个账户的多个代币
  • safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) —— 单种代币转账
  • safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) —— 批量转账,一次转多种代币
  • setApprovalForAll(address operator, bool approved) —— 授权操作员管理你的所有代币
  • isApprovedForAll(address account, address operator) —— 查询授权状态

我个人习惯,在实现safeTransferFrom时,一定会加上对接收合约的onERC1155Received检查。为什么?因为如果不检查,代币可能被转到一个不支持ERC-1155的合约里,那就永远锁死了。我在项目中遇到过两次这种情况,后来养成了条件反射。

关键点:ERC-1155的授权机制是“全量授权”——你授权一个操作员,他就能动你所有种类的代币。这和ERC-721的按Token授权完全不同。设计业务逻辑时一定要注意这个差异。

批量铸造与转账:Gas费省到让你笑

这才是ERC-1155的王牌功能。你想想,如果用ERC-721发1000个NFT,你得调用1000次mint,每次都要付一次Gas。而ERC-1155的mintBatch一次搞定。

代码示例:

// 批量铸造
function mintBatch(
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
) public onlyOwner {
    _mintBatch(to, ids, amounts, data);
}

// 批量转账
function batchTransfer(
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts
) public {
    safeBatchTransferFrom(from, to, ids, amounts, "");
}

我记得有一次帮一个游戏项目做迁移,他们原来用ERC-721管理装备,每次批量发放装备要花掉将近0.5 ETH的Gas费。换成ERC-1155后,同样的操作只需要0.03 ETH。老板当场就拍板了。

为什么会这么省?因为ERC-1155在底层做了优化——它把多个转账操作合并成一次状态变更。你想想看,一次SSTORE操作和十次SSTORE操作,Gas差了多少倍?

实战技巧:批量转账时,ids数组和amounts数组的长度必须一致。我曾经因为数组长度不匹配,debug了一整个下午。Solidity不会报错,只会默默revert,然后你一脸懵逼。

与ERC-721的对比:各有千秋

很多新手问我:“老师,到底该用ERC-721还是ERC-1155?”我的回答是:看场景。

对比维度 ERC-721 ERC-1155
代币类型 每个Token都独一无二 同ID下可互换,不同ID不可互换
批量操作 不支持原生批量,需自己实现 原生支持批量铸造和转账
Gas效率 单次操作Gas较低,批量操作Gas极高 单次操作Gas略高,批量操作Gas极低
合约数量 通常一种NFT一个合约 一个合约管理所有代币类型
元数据 每个Token有独立URI 每个ID有独立URI
适用场景 数字艺术品、收藏品 游戏道具、门票、混合资产

说白了,如果你的项目里每个NFT都是独一无二的艺术品,那ERC-721更合适。但如果你在做游戏,有成百上千种道具,每种道具又有成千上万个副本,那ERC-1155就是为你量身定做的。

避坑指南:我曾经在一个项目里试图用ERC-1155管理艺术品,结果发现每个艺术品都需要独立的ID,而且元数据URI还得单独设置。虽然技术上可行,但管理起来非常别扭。后来我换回了ERC-721,世界清净了。

应用场景分析:不止是游戏

很多人一提到ERC-1155就想到游戏,其实它的应用范围远不止于此。

1. 游戏道具系统
这是最经典的应用。武器、防具、药水、材料……每种道具一个ID,数量可叠加。批量发放、批量回收,Gas费省到飞起。

2. 混合资产NFT
比如一个“盲盒”里包含多种代币。你可以用ERC-1155把整个盲盒打包成一个ID,里面包含多少种道具、各多少个,一目了然。

3. 门票系统
同一场演唱会的门票,座位不同但票种相同。用ERC-1155管理,一个ID代表一种票价,数量就是可售张数。批量转赠也方便。

4. 供应链溯源
同一批次的产品,用同一个ID管理。每个ID代表一个批次,数量代表该批次的产品数量。流转记录清晰可查。

5. DeFi中的LP代币
嗯,这个有点进阶。你可以用ERC-1155来代表不同池子的LP份额。每个池子一个ID,数量就是你的份额。比ERC-20更灵活,比ERC-721更高效。

我个人最看好的其实是“混合资产”这个方向。你想想看,未来元宇宙里,一个角色可能同时拥有多种装备、多种货币、多种身份凭证。用ERC-1155一个合约全搞定,多清爽。

总结一下:ERC-1155不是ERC-721的替代品,而是补充。它解决的是“批量管理多种可互换资产”的问题。选标准的时候,别跟风,看需求。你的项目需要什么,就用什么。

好了,这一章就到这里。下一章我们聊聊跨链桥接,那才是真正让人头秃的东西。做好准备。