钱包连的是主网还是某条测试网,在 Cardano 的钱包接口里原本只有一个很粗的答案。CIP-142 想做的是把这个答案变精确:让 dApp 能问到具体网络的魔数。它自身的定位也写在文档第一句里——这是一份对 CIP-30 的扩展。
CIP-30 只回答”主网还是测试网”
被连接的钱包在 CIP-30 接口里提供 api.getNetworkId(),规范原文是:返回当前连接账户的网络标识,0 是测试网、1 是主网,钱包也可能返回其他网络 ID,但这些其他值不受该文档约束;除非连接账户发生变化,结果保持不变。
问题在于生态里不止两条网。CIP-142 的动机部分说明:Cardano 生态存在多条测试网(preview、preprod 等),每条有自己的魔数,而 dApp 常常需要知道具体是哪一条才能正确配置与交互。换句话说,getNetworkId 返回 0 只告诉你”不是主网”,不足以判断该去哪个接口领测试币、该用哪套脚本。

扩展怎么开、返回什么
CIP-142 使用固定标识 { "cip": 142 }。启用后,接口的 cip142 命名空间下多出 api.cip142.getNetworkMagic(),返回当前所连网络的魔数:主网 764824073、preview 测试网 2、preprod 测试网 1,自定义测试网则是其他值;同样的规则——除非连接账户改变网络,返回值不变。调用形态是两步:先在 enable 时带上 extensions: [{ cip: 142 }],再调用该方法取值。
官方在理由部分强调设计取向:通过新增扩展而不改动现有接口来保持向后兼容,已按 CIP-30 实现的钱包不会因为这份规范而被迫改变既有行为。
错误码沿用 CIP-30
该函数复用 CIP-30 的 APIError 类型,文档列出四种情况:InvalidRequest(-1)请求格式错误;InternalError(-2)取魔数过程中出错;Refused(-3)拒绝访问魔数;AccountChange(-4)账户已变更。这四种错误的处置方式不同:前两种偏实现问题,第三种是用户或钱包拒绝授权这类信息访问,第四种意味着请求期间连接的账户换了,任何基于旧账户得出的结论都要作废——对钱包侧的界面表现通常是”请重新连接”。
为什么用扩展而不是改老接口
规范在理由部分写得很清楚:getNetworkId() 只提供了基本的网络识别,而生态在发展,尤其是开发与测试场景需要更精确的网络判定;这份扩展采取的姿态是不改动既有接口、以扩展形式追加能力,从而保持向后兼容。对普通用户来说,这个选择的直接后果是:能力是”可选项”,同一个 dApp 在两个钱包上能读到的网络信息精度可能不一样,一个能明确说”你连的是 preprod”,另一个只能说”测试网”。
实操上怎么用这两个数
把魔数当成一道交叉核对更合适。已知主网是 764824073、preview 是 2、preprod 是 1,那么 dApp 报出的数字如果与钱包界面显示的网络名不一致,就该停下来核对,而不是继续领测试币或发交易;反过来,只看到”测试网”三个字时,也不要假定自己连的一定是平时用的那条。测试网之间资产互不相通,把 preprod 的地址贴到 preview 的浏览器上查不到东西,是很常见的情况,而不是币丢了。
这类”以清单核对网络”的思路并非某条链独有,钱包搜不到某条 Cosmos 链?去 Chain Registry 核对 chain_id、前缀与 RPC 讲的是另一套网络标识体系下的同类问题。至于钱包授权本身能看到哪些信息、能代签什么,让普通网页能指挥一笔 Cardano 交易:CIP-30 的钱包接口 讲得更完整。
它现在处在什么阶段
CIP-142 的元数据要如实看待:类别 Wallets,状态 Proposed,创建于 2024 年 1 月 17 日,许可 CC-BY-4.0,实现者列表里列的是 Lace。也就是说它不是所有 Cardano 钱包都已经提供的能力,读不到 getNetworkMagic 不代表钱包有问题。dApp 侧现实的做法是把 getNetworkId 当基线判断,把 getNetworkMagic 当作”能取到则更精确”的补充,取不到时退回展示网络名并请用户确认。本文只做机制说明,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。