ERC-1203 多类别代币:一个合约里的以物易物怎么记账 图 1
ERC-1203 多类别代币:一个合约里的以物易物怎么记账 · 图 1

ERC-1203 多类别代币:一个合约里的以物易物怎么记账

2018 年 7 月 1 日,ERC-20 如日中天,一份编号 ERC-1203 的提案试图回答一个当时颇显自然的问题:一个组织发行的凭证往往不止一种,积分、优惠券、库存提货权,能不能不部署三个 ERC-20,而在一个合约里按类别记账?提案给这类资产起的名字是多类别代币,缩写 MCT,动机部分顺手带出一个古典概念:实物之间的转换本质上就是以物易物,barter,引入一个公共中介类别,货币的角色就在这里。这份提案停在 Stagnant,但它与 ERC-1155 的分岔路口,恰好是理解今天资产标准格局的一块路标。

每个函数都多背一个参数

接口的写法人人眼熟:totalSupplybalanceOftransferapproveallowancetransferFrom,全套 ERC-20 动作后面都追加一个 _class 参数,账本从地址到余额的映射升级为地址加类别的二维表,Transfer 与 Approval 事件同样带上类别字段。合约同时保留一套无参数的 ERC-20 原版函数,原文说明它们只对所谓默认类别生效,老工具因此至少能读到其中一类而不报错。类别之上的第二个创新是换算:convert 按发行方定好的比率,把某个类别的价值熔换成另一个类别,成功即发一个 Convert 事件;在此之上还有一组全类别汇总视图——fullyDilutedTotalSupplyfullyDilutedBalanceOffullyDilutedAllowance,把每种持有量按比率折算成最低公分母类别再求和,让一个投资组合能用一个数字报总账。

拿今天的透镜回看,这个设计与 1155 站在同一需求的两侧。1155 把同质与不可同质装进一个合约,每个编号各自记账,一枚 001 号永远是一枚 001 号;1203 让类别之间可以按比率熔铸互换,抹掉个体身份换取兑换自由。一个保个性、一个保流通,后来市场按需要选了前者做多资产合约的主流,1203 的 barter 理想停在纸面。细想这个结局并不偶然:收藏与游戏场景要的是不许掉包的唯一性,convert 恰恰会把唯一性熔掉重铸;金融折算场景确实需要比率互换,但那更像交易所或做市合约的工作,塞进代币合约等于让每个发行方自造一台小型兑换机。1203 两头都差一口气,位置就被挤没了。

ERC-1203 多类别代币:一个合约里的以物易物怎么记账 图 2
ERC-1203 多类别代币:一个合约里的以物易物怎么记账 · 图 2

比率即汇率

1203 真正的复杂点藏在 convert 的比率治理里。类别之间的兑换率是发行合约的业务参数,比率一改,fullyDiluted 系列查询的全局读数跟着漂移——同一堆持仓,在一次参数调整后折算出的总账数字可能就变了,每一类单独看余额没动,合起来的口径却已换了一副眼镜。提案文本没有规定比率的修改权限在谁手里、有没有延迟生效、旧数字是否存档,它把 convert 定义成一个返回真假的函数加一个事件,治理细节完全交给实现方,这在后来任何一次安全审视里都是明显的空格。更要紧的是 Convert 事件本身只带来源类别、目标类别与数量三个字段,折算率要读者自己去两个类别的历史参数里推,事件流因此并不构成完整的审计轨迹,工具想复算某一天的折算价还得配上快照。

给读者的经验分两层。读合约层:看到多类别记账的合约,先分清类别之间是否可互换,再看汇总是走 fullyDiluted 的折算路线还是逐类相加,两个口径在比率调整后会对不上账。读产品层:任何把多种资产折算成一个总值的功能,都值得问一句折算率由谁定、多久变一次、上一版数字还能不能查。一个数字越简洁,背后的汇率结构越值得摊开看,这条从 2018 年的失败提案里读出来的常识,放到今天的组合估值面板上依然成立。本文为机制说明,不构成任何投资建议。