ERC-3525 半同质化:slot 相同才能合并价值,transferSplit 怎么拆 图 1
ERC-3525 半同质化:slot 相同才能合并价值,transferSplit 怎么拆 · 图 1

ERC-3525 半同质化:slot 相同才能合并价值,transferSplit 怎么拆

先给直观含义

ERC-3525(Semi-Fungible Token,2020 年提出,已定稿)给 NFT 加了一个数量维度:每个代币除了编号,还带一个 value(数值)和一个 slot(槽位标识)。规则核心是:同一个 slot 下的 value 被视为可互换 fungible,不同 slot 的 value 不合并。标准还额外提供两种新的转账模型——代币之间转 value、代币向地址转 value,后者会自动“造”或“找”一个同 slot 的代币来接住这部分价值。

ERC-3525 半同质化:slot 相同才能合并价值,transferSplit 怎么拆 图 2
ERC-3525 半同质化:slot 相同才能合并价值,transferSplit 怎么拆 · 图 2

三个字段撑起“半”这个字

标准文档说明得很清楚:value 的含义类似 ERC-20 的 balance,slot 则保证“同 slot 的两笔 value 可以当成 fungible”。这样一张 NFT 可以既有唯一身份(编号),又有可拆分合并的数量(value),所以被叫做半同质化。

接口层面值得记住的几项:valueDecimals 声明 value 的小数位数——文档特意说明,为避免与 ERC-20 的 decimals 冲突,这个函数刻意命名为 valueDecimals 而不是 decimals,钱包读取时要知道两者不是一回事;balanceOf(tokenId) 查某编号携带多少 value;slotOf(tokenId) 查它的 slot。转 value 有两个版本的重载:fromto 都传 tokenId 时,要求两个代币 slot 相同,发出 TransferValue 事件;只传 from tokenId 加一个地址时,标准明确要求合约必须为该地址找到或新建一个同 slot 的代币来接收价值,并同时发出 TransferTransferValue 两个事件。另外还有 ApprovalValue 事件(授权别人操作某额度)与 SlotChanged 事件(改 slot 时必须发出)。

标准的 JSON 元数据模式在 ERC-721 基础上加了 slotvalueDecimals 两个字段;还有一个可选的枚举扩展(ERC-3525SlotEnumerable),让合约能公布自己一共有哪些 slot,方便发现。

设计意图:让“一部分”成为一等公民

这条标准解决的场景是:权益的一部分。假设一张会员 NFT 携带的额度可以给别人一段、可以拆分转让、可以合并归集,用 ERC-20 表达会丢掉唯一性,用 ERC-721 表达又拆不开,slot 与 value 的组合刚好落在中间。文档也把兼容思路写得很实在:为了让普通钱包能看懂,把数量精度函数借用了 ERC-20 的命名,接收方是合约时还提供 onERC3525Received 回调,其返回标识被规定为 0x009ce20b

读一枚 ERC-3525 资产时的核对点

一是它的 slot 是什么,同 slot 的资产在语义上等价——如果 slot 的含义含糊(一个 slot 混装不同权益),fungible 假设就不可靠。二是 value 与 decimals,钱包常按十进制小数显示,注意别把最小单位当成完整单位。三是 SlotChanged 历史:slot 被改过,意味着这件资产所属的可互换组别变过,这会影响它的可替代性判断。

常见误区

误区一:以为半同质化等于 ERC-1155。1155 是“一个合约多种编号、同编号可互换”;3525 是“每个代币是独立编号,但携带的 value 在同 slot 内可互换”。分组键一个是代币编号,一个是 slot。

误区二:以为带 value 就一定可交易出价格。value 只是合约里的数字,能不能变现取决于市场需求,与标准无关。

误区三:把不同 slot 的 value 相加统计总量。标准不认为它们 fungible,合计只是统计口径,不是等价关系。

接收方的态度也算规则

ERC-3525 给合约接收者留了一个否决口。规则是:当接收侧(转入版转账里的 _to 地址,或转给代币版的 _toTokenId 主人)是合约时,转账合约必须检查它有没有实现 onERC3525Received,有就必须调用,并且只有返回 0x009ce20b 才算成功,否则整笔交易回滚。这个返回值不是随便定的数——它正是该回调函数签名的哈希前四个字节,等于让接收合约用自己的函数标识亲口回答“我收到了”。标准还写了个特例:地址可以给自己转 value,这时自收也会触发回调,于是合约可以对“自己拆分自己”与“别人转入”执行不同的接受规则。往实现者视角看,这套“先查接口、再调用、看返回值”的模式与 ERC-721 的安全转账检查同源,做过 NFT 合约的人不需要重新学。顺带一提,slot 也有授权与枚举机制:ApprovalForSlot 事件配合可选的枚举扩展,让“某人可操作某个 slot 下全部代币”这类批量授权成为标准语义。

风险提示:本文为代币标准机制科普,不构成任何投资建议;“可拆分”“可合并”是合约状态语义,不代表任何变现能力或收益。