ERC-4824 注册接口:DAO 用一个 daoURI 回答我是谁、成员在哪、提案在哪 图 1
ERC-4824 注册接口:DAO 用一个 daoURI 回答我是谁、成员在哪、提案在哪 · 图 1

ERC-4824 注册接口:DAO 用一个 daoURI 回答我是谁、成员在哪、提案在哪

一个 DAO 迁了前端、换了治理工具、成员名册挪了家,成员和工具怎么第一时间知道新地址?靠公告帖的话,钓鱼者最乐意替官方回答这个问题。2022 年 2 月 17 日起草、目前处于 Review 状态的 ERC-4824 把答案收进一个函数:让 DAO 合约或一个替它登记的注册合约暴露 daoURI() 查询,指向一份 JSON 名片,组织的全部入口从名片出发逐层可寻。提案明确不标准化 DAO 如何投票或如何花钱,动机部分写得很克制,只想解决发现性问题。

一个 URI 和它的分身

接口面小得罕见:一个视图函数 daoURI,外加 DAO 更新时发出的 DAOURIUpdate 事件。全部结构住在 URI 指向的 JSON-LD 里:顶层 type 为 DAO,带 name 与 description,往下分五个入口字段——membersURI 指向成员名册、proposalsURI 指向提案流、activityLogURI 指向活动日志、governanceURI 指向治理规则文件(原文建议用 Markdown),contractsURI 指向合约清单。每个子入口的内容可以是一份独立 JSON,也可以直接内联进顶层,内联时字段去掉 URI 后缀,例如 membersURI 改名 members。名册里每位成员用 CAIP-10 的跨链地址表达,以太坊主网形如 eip155:1:0x 开头的串,也可以写成 DID 形式。原文还有一条讲究的卫生规定:没有值的字段建议直接删掉,而不是留空或 null——名片宁可缺项,不可留白。

部署形态有两条路:DAO 主合约自己实现这个接口,或者另立外部注册合约,后者必须存住 DAO 的主地址,通常是主治理合约。为方便全网检索,还配了一个索引合约,任何人可调用 logRegistration 提交某 DAO 的登记,合约先用 supportsInterface 核实目标真的兼容 4824,不通过就抛 ERC4824InterfaceNotSupported,通过则发 DAOURIRegistered 事件。索引由此获得一条可被动扫描的注册流水,而伪冒地址过不了接口核验这一关。

ERC-4824 注册接口:DAO 用一个 daoURI 回答我是谁、成员在哪、提案在哪 图 2
ERC-4824 注册接口:DAO 用一个 daoURI 回答我是谁、成员在哪、提案在哪 · 图 2

部署形态与索引的讲究

值得补一句的是两种部署形态的取舍。主合约直接实现接口,好处是名片与组织同一个地址、一次查询直达,代价是升级治理合约时接口必须始终带在身上;外部注册合约则像给老组织补办的登记处——旧合约一行代码不改,由新合约替它回答 daoURI,注册合约再存住主地址完成反向索引,迁移成本几乎为零。索引合约的 logRegistration 允许任何人调用,看起来激进,其实靠 supportsInterface 把关:目标没实现 4824 接口就当场回滚,登记噪声被协议层掐住,剩下的误报责任落在链上可查的登记者身上。这套设计的每一处权限都小得可以核验,是它作为发现性标准的本分。

通讯录改变的攻击面

以前提到 DAO 钓鱼,剧本多半是伪造前端域名配一个假金库地址。ERC-4824 想改变的是信任落点:工具先解析 DAO 主地址,由合约在链上回答该去哪份文件找什么入口——域名与前端从信任根降格成名片上一条可更新记录,换地址不再靠公告拼运气,事件流水本身就是变更记录。对 DAO 成员和藏品社群的普通一员,日常自检也从此有了标准动作:拿到组织名先查它的 daoURI,把 contracts 指向的地址与你要交互的地址逐字比对;对不上的签名提示,默认它是通讯录之外的信息源在说话。

边界同样讲得清。URI 指向的链下内容不受链上共识保护,DAOURIUpdate 只证明合约在某高度说过某个 URI,内容此刻是否诚实要靠哈希、来源与人的复核;索引事件人人可发,它的价值不在授权而在留痕。这份提案的哲学其实是给 DAO 世界立一块链上黄页:黄页不产生信任,但它让每个不和谐音都有了对照物。本文为机制说明,不构成任何投资建议。