ERC-1438 的通用钱包:把 ERC-20 装进一个组件化合约的旧尝试 图 1
ERC-1438 的通用钱包:把 ERC-20 装进一个组件化合约的旧尝试 · 图 1

ERC-1438 的通用钱包:把 ERC-20 装进一个组件化合约的旧尝试

买过一个 NFT 头像又发现它在钱包里只是个占位符?2018 年就有人设想过更彻底的玩法:头像直接以 SVG 形式存进区块链的事件日志,任何应用都可以来读,社交徽章同理。这就是 ERC-1438 的头像组件。同一份提案的另一半——通用钱包,则要解决一个更枯燥的麻烦:大量 ERC-20 代币没实现 approveAndCall,应用收币必须两步走。标准创建于 2018 年 9 月 21 日,作者 Jet Lim,仓库记录状态为 Stagnant。

组件化的主张

提案的批评对象很具体:大家拿了开源合约改改就上,每个项目重新发明一遍轮子,等于把公共资源做成了中心化孤岛。它的药方是让合约像组件一样可复用——头像商店、徽章系统、通用钱包都按统一接口发布,谁的项目都能直接接。头像这条线的技术选择相当有年代感:资产用 gzip 压缩的 SVG 格式,用户数据用 msgpack 压过的 JSON,统统写进事件日志部分。以今天的视角看,事件日志作为存储既省不了多少 Gas,也没有统一的读取规范,这条路后来被链下元数据加 tokenURI 的主流方案彻底绕过。

ERC-1438 的通用钱包:把 ERC-20 装进一个组件化合约的旧尝试 图 2
ERC-1438 的通用钱包:把 ERC-20 装进一个组件化合约的旧尝试 · 图 2

approveAndCall 的补丁逻辑

钱包侧的核心是一个补位合约。标准流程里,代币合约若实现了 approveAndCall,一次调用就能完成授权加回调通知;但原文直说,很多 ERC-20 没有准备这一手。ERC-1438 的通用钱包于是充当中间人:用户先把余额 approve 给它,再由钱包代付并调用目标,等效达成一步支付。配套的 ApproveAndCallFallBack 接口定义了接收方该实现的回调签名。站在防御视角,这个设计的软肋恰好也是它的机制——钱包拿到的是无限或大额授权,任何一个代付合约的漏洞都会波及全部授权用户。这正是当年同类一步支付方案反复出事的原因。

为什么值得回头看

头像组件那条线的技术细节放到今天看更有史料价值:资产以 gzip 压缩的 SVG 写进事件日志,用户资料以 msgpack 压缩的 JSON 写进同一位置,商店允许自定资产分区与查看脚本——整条链上存身份的链路,比 ERC-721 元数据规范成熟还要早。它很快撞上的问题也是链上生成艺术的宿命问题:事件日志按字节收费却不承担长期可用性,头像一多,部署与交易成本都压不住,而当时的钱包没有能力在本地重组 SVG 分片,渲染负担全推给前端。提案还大方地注明了示例素材来自 Avataaars 开源项目并给出原作者署名,这个细节反而凸显了它的认真。组件化理想落空后,通用钱包要解决的两步支付问题则由别家接管:ERC-2612 把授权做成离线签名,ERC-4337 与智能账户让应用可以代用户组装动作,组件化没有复活,但一步支付的体验最终实现了——旧提案死于形态,活下来的机制换了宿主。

提案的事件日志存放设想还留下一个常被忽视的提醒:把资产塞进事件日志,等于把长期读取责任外包给所有未来客户端——今天没有任何钱包承担解析 gzip SVG 分片的义务,当年的头像自然就从所有界面消失了。这个教训对今天的链上项目同样锋利:任何把重要内容塞进非主流载体(事件日志、冷门字段、私有格式)的资产,都要假定未来读它的代码不存在;能选标准格式与标准字段时不必创新,创新省下的Gas,迟早用可见性付回去。

这个提案没有活下来,但它圈定的两个问题至今仍在:链上数字身份的轻量存放,和代币支付的两步摩擦。前者被压缩 NFT 与链上渲染接过了火炬,后者由 ERC-2612 permit 签名授权与各类路由解决。对读者的实际提醒有一条通用的:任何要求你把代币无限 approve 给某个合约以换取少点一次确认的方案,都应当先查合约的持有人权限与源码验证状态;少一步确认省的是操作成本,多出的敞口是全部余额——这笔账 2018 年就要算,今天更要算。本文为机制说明,不构成任何投资建议。