
EIP-2015 详解wallet_updateEthereumChain钱包链切换 RPC 方法【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs导读EIP-2015 是 Ethereum Improvement Proposal 仓库EIPS 目录中定义的一条 Interface 类别标准提案它向钱包的 web3 provider API 新增了一个wallet_命名空间下的 RPC 端点wallet_updateEthereumChain用于在 EVM 兼容链之间进行切换并在钱包尚未识别该链时将其注册进去。读完本文你将掌握该方法的完整 TypeScript 参数结构、chainId等各字段的语义与约束、返回值与4001错误码约定以及 SSRF、钓鱼攻击等安全设计要点并了解它与wallet_addEthereumChainEIP-3085、wallet_switchEthereumChainEIP-3326等兄弟方法的定位差异。提案背景为什么需要切换链的标准化接口DApp 生态中钱包通常通过一个 JavaScript Provider 对象向页面暴露 API见 EIP-1193。不同的钱包对 Provider 的实现历史上存在接口与行为冲突而在 EVM 兼容链之间切换更是长期缺乏统一标准DApp 无法用一套通用的 JSON-RPC 调用要求钱包切换到某个指定网络。EIP-2015 正是为了填补这一空白而提出它定义了一个钱包命名空间下的 RPC 方法wallet_updateEthereumChain让 DApp 可以携带最少的必要参数请求钱包切换网络。该方法只要求chainId一个必填字段其余字段chainName、rpcUrls、nativeCurrency、blockExplorerUrl均为可选是设计得尽可能简单同时又能提供切换新链所需必要信息的产物——因为chainId是唯一保证全局唯一的参数其余字段本质上只是对钱包的建议suggestion。规范wallet_updateEthereumChain方法定义方法语义wallet_updateEthereumChain用于切换到一个网络如果该网络尚未被钱包识别则同时将其注册到钱包中。它接收一个参数——EthereumChainSwitchRequest对象其完整 TypeScript 定义如下原文出自 eip-2015.mdinterface NativeCurrencyData { name: string; symbol: string; decimals: number; } interface EthereumChainSwitchRequest { chainId: string; chainName?: string; rpcUrls?: string[]; nativeCurrency?: NativeCurrencyData; blockExplorerUrl?: string; }该规范的约束词MUST / MUST NOT / REQUIRED / SHALL / SHALL NOT / SHOULD / SHOULD NOT / RECOMMENDED / MAY / OPTIONAL按 RFC 2119 解释。参数语义逐字段解析chainId必填以0x为前缀、符合 EIP-155 的链 ID 字符串。EIP-155 规定交易签名时需将chainid纳入九元素 RLP 编码nonce, gasprice, startgas, to, value, data, chainid, 0, 0签名v值设为{0,1} CHAIN_ID * 2 35从而天然实现重放攻击防护各条链通过唯一的CHAIN_ID区分因此chainId是识别链的唯一可靠依据。主网为1Goerli 为5Geth 私有链默认1337完整列表见 eip-155.md。chainName可选建议的、人类可读的链名称用于向用户展示。rpcUrls可选针对该chainId的 RPC 端点列表。nativeCurrency可选建议原生币的展示方式其name、symbol、decimals三个字段的语义应参照 EIP-20ERC-20来解释——即name为代币全称、symbol为交易符号、decimals为小数位精度。blockExplorerUrl可选应指向与该chainId兼容的区块浏览器。关键行为约束除chainId外所有键均为可选且都是对钱包的建议钱包可以选择忽略或向用户展示其他数据。钱包在切换或添加链之前应提示用户并获得确认prompt the user。钱包应内置一份常用链的默认数据列表以避免钓鱼攻击。钱包在使用每个 RPC URL 发送其他请求之前必须对其进行净化sanitize包括确认它能正确响应net_version与eth_chainId方法——后者由 EIP-695 定义用于可靠地标识当前通信的链。只要当前活动链与请求的链一致方法即返回true无论该链此前是否已处于活动状态、还是本次才被添加到钱包中。若用户拒绝该请求必须返回错误码为4001的错误——该错误码对应 EIP-1193 中 Provider 错误标准表里的 User Rejected Request见 eip-1193.md。一次典型的 JSON-RPC 调用EIP-2015 原文未给出调用示例但作为wallet_系列方法其调用形态遵循标准 JSON-RPC 2.0 约定同类方法示例可参考 EIP-3326。以下为切到主网并携带元数据的示意请求{ id: 1, jsonrpc: 2.0, method: wallet_updateEthereumChain, params: [ { chainId: 0x1, chainName: Ethereum Mainnet, rpcUrls: [https://mainnet.infura.io/v3/YOUR-PROJECT-ID], nativeCurrency: { name: Ether, symbol: ETH, decimals: 18 }, blockExplorerUrl: https://etherscan.io } ] }成功时返回true活动链与请求链一致用户拒绝时返回code: 4001的错误对象。设计理由Rationale规范原文从三个方面阐述了设计动机极简但够用chainId是唯一必填参数因为它是唯一保证唯一的标识chainName提供人类可读名称rpcUrls提供 RPC 端点列表nativeCurrency提供原生币展示建议blockExplorerUrl提供区块浏览器链接。命名空间隔离方法挂在wallet_前缀下避免与其他方法冲突。该前缀被许多钱包专属方法使用如wallet_addEthereumChain与wallet_switchEthereumChain。与兄弟方法互补在仓库的 EIPS 目录中可以看到完整的wallet_家族——EIP-3085 的wallet_addEthereumChain负责添加链返回nullEIP-3326 的wallet_switchEthereumChain只负责切换活动链仅接收chainId单字段参数返回null而本 EIP-2015 的wallet_updateEthereumChain则将切换 必要时注册合二为一返回true。三者共用wallet_命名空间与0x前缀十六进制chainId约定DApp 可根据场景选用。向后兼容性该提案被判定为完全向后兼容fully backwards compatible它只是向钱包的 provider API 新增一个方法不改变任何既有 RPC 方法的语义也不影响已有的签名、交易格式或网络行为。值得注意的是本提案在仓库中状态为Stagnant停滞且作者后续通过 EIP-3085 / EIP-3326 将添加与切换拆分为两个更细粒度的方法这正体现了标准演进中先合并、后拆分的实践路径。安全考量服务端请求伪造SSRFrpcUrls参数携带的是链的 RPC 端点列表钱包在向这些端点发起任何请求之前必须逐一净化核心手段是确认端点能正确响应net_version与eth_chainId。这一约束的意义在于恶意请求者可能提交指向内网地址、本地主机或其他敏感目标的 URL诱导钱包充当代理发起请求即 SSRF 攻击面。EIP-2015 要求钱包先验证端点身份eth_chainId返回值应与请求的chainId匹配再将其用于后续请求从而阻断这一风险。可对照 EIP-3085 中更严格的同类要求钱包必须拒绝file:或http:协议的 URL且必须在任一 RPC URL 的eth_chainId与请求chainId不匹配时拒绝整个请求。钓鱼攻击由于chainName、nativeCurrency、blockExplorerUrl等展示类元数据完全由请求方提供恶意 DApp 可能伪造知名链的名称与图标来欺骗用户。为此规范要求钱包内置一份常用链的默认数据列表以已知可信数据覆盖或校验请求方提交的元数据从源头削弱钓鱼攻击的成功率。这与 EIP-3085 安全章节中维护已知链列表、校验请求、优先采用钱包自身元数据的建议一脉相承。用户确认与隐私钱包在切换或添加链之前应该提示用户prompt用户拒绝时返回4001错误确保任何链的变更都经过用户明确授权。结合 EIP-1193 的错误标准eip-1193.md4001属于 Provider 错误码体系的一部分与4100Unauthorized、4200Unsupported Method、4900Disconnected、4901Chain Disconnected并列DApp 端可按统一约定解析。与仓库其他文档的关联深入阅读本仓库可建立完整的wallet_方法知识图谱eip-2015.md本提案原文wallet_updateEthereumChain切换 注册返回trueeip-3085.mdwallet_addEthereumChain添加链并返回null含最严格的 URL 与chainId校验要求eip-3326.mdwallet_switchEthereumChain仅切换活动链参数只有chainId并明确引用本提案与 EIP-3085 作为相关工作eip-155.mdchainId的来源与重放攻击防护原理eip-695.mdeth_chainId方法RPC URL 净化的验证手段eip-1193.mdProvider API 与4001等错误码的标准来源eip-20.mdnativeCurrency字段语义的解释依据该文件在仓库中已移至 ERC 仓库链接指向 LICENSE.md 说明版权豁免。综上EIP-2015 为钱包生态提供了一种一键切换并注册 EVM 链的标准化入口其极简参数模型、以chainId为核心的唯一性设计以及对 SSRF、钓鱼攻击的防御要求至今仍是钱包实现多链切换能力时的重要参考。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考