钱包里的添加网络弹窗如何被标准化:EIP-3085的校验规则 图 1
钱包里的添加网络弹窗如何被标准化:EIP-3085的校验规则 · 图 1

在 dapp 里点击”连接到某某新链”,钱包会弹出一个框列出链名、原生币符号、RPC 地址和区块浏览器链接,让你确认添加。这个弹窗不是各家钱包自定规矩的产物,它对应一个标准化的 RPC 方法:EIP-3085 定义的 wallet_addEthereumChain。这份规范属于接口类别,创建于一层网络概念尚在混战的 2020 年,当前在 EIPs 仓库中的状态为 Stagnant——方法本身被主流钱包广泛实现,但文本本身早已不再推进。

参数表与必填项的玄机

方法接收单个对象参数,字段包括 chainIdchainNamenativeCurrency(内含 name、symbol、decimals)、rpcUrlsblockExplorerUrlsiconUrls。规范声明只有 chainId 是必填,其余全部可选。这种”名义可选”的设计是刻意的:链 ID 在以太坊系链条里等同身份证号——签名时使用的正是 EIP-155 定义的 chain ID,它决定交易在哪条链上合法——所以它必须出现;而钱包要把一条链呈现在界面上还缺什么,属于钱包实现细节,规范索性把其余字段都标成可选,同时允许钱包在实践中自行加码要求。换句话说,某个钱包要求必须提供 RPC 列表才算合规,并不违反这条规范。

钱包里的添加网络弹窗如何被标准化:EIP-3085的校验规则 图 2
钱包里的添加网络弹窗如何被标准化:EIP-3085的校验规则 · 图 2

必须拒绝的情形

规范给钱包列了一串拒绝义务。chainId 必须是合法的十六进制字符串,否则必须拒绝。rpcUrls 缺失或为空数组时必须拒绝,其中任何一项不是合法 URL 时同样必须拒绝。最关键的一条:钱包必须用请求里给出的每个 RPC 地址实际调用 eth_chainId,返回值与声称的 chainId 对不上就必须拒绝——这是防止有人用”链名是 A、实际端点指向 B”的钓鱼配置的核心闸门。此外规范明令拒绝 file:http: 两种 URL 方案,等于强制加密传输与本地文件系统隔离。字段存在但残缺也要拒绝:提供了 nativeCurrency 却缺少 name、symbol 或 decimals 中任何一项,或 decimals 为负数,请求整体作废。

关于重复添加:对已经添加过的链再次发起请求,规范要求应当成功(除非用户拒绝或校验失败),同时钱包不得让同一 chain ID 被重复登记两份。这条规则的现实意义是”钓鱼链”攻击的经典手法被堵住一角——攻击者无法用同一个 ID 悄悄覆盖或并列一条伪造配置的合法链记录。

添加不等于切换

规范还划了一条容易被忽略的边界:请求成功不代表钱包会把当前活动链切到新链上。“添加”和”切换”是两个动作,切换属于 EIP-3326 的范围,成功添加后用户往往仍停留在原来的链上,这也是很多”添加完还是显示旧网络余额”困惑的根源。

用户侧的核对清单

收到添加网络请求时,值得核对四项:链 ID 与你要访问的链的公开资料是否一致;RPC 域名是否属于该项目官方而非随机杂牌域名;原生币符号与实际链的经济参数是否对得上;区块浏览器能否用给出的 URL 正常打开。任何一项含糊,都应当取消请求,从官方文档单独获取参数手动添加。弹出请求本身出现在你并没有主动连接任何新链的时刻,更应直接视为危险信号。

本文仅描述接口规范与钱包行为边界,不构成投资建议;各钱包对规范字段的理解与额外校验深度不同,具体提示以所用钱包的官方说明为准。

弹窗之外的攻击面

把这套校验规则放回攻击场景里,能看到它分别封堵了哪些手法。伪造链名加合法端点的把戏,被 eth_chainId 实测这一关拦下:不管弹窗上写什么名字,端点自报的链 ID 不一致就拒绝。用 http: 明文 RPC 做中间人改写响应的路数,被 URL 方案黑名单直接封死。把恶意链伪装成已有主网身份的路数,则受”同一 chain ID 不得重复登记”约束。规范还提醒钱包在界面上对不同链做清晰消歧——颜色、图标、名称至少一项能明显区分,因为交易合法性只认链 ID,界面混淆就足以让用户在错误的链上完成一次不可撤回的签名。

值得补充的一点:这些规范文本都停留在 Stagnant 状态,不代表方法失效,而是钱包生态早已按各自理解实现并普遍超出规范底线。因此”我的钱包弹窗里多了一行警告”并不违反标准,标准给出的本来只是底线义务。