Alert Source Discuss
🚧 Stagnant Standards Track: Interface

EIP-3326: Wallet Switch Ethereum Chain RPC 方法 (`wallet_switchEthereumChain`)

Authors Erik Marks (@rekmarks)
Created 2021-03-04
Discussion Link https://ethereum-magicians.org/t/eip-3326-wallet-switchethereumchain
Requires EIP-155, EIP-695

简单总结

一个用于切换钱包激活的以太坊链的 RPC 方法。

摘要

wallet_switchEthereumChain RPC 方法允许以太坊应用程序(”dapps”)请求钱包切换其激活的以太坊链(如果钱包具有此概念)。 调用者必须指定链 ID。 钱包应用程序可以任意拒绝或接受该请求。 如果激活链已切换,则返回 null,否则返回错误。

有关此方法的实现者的重要注意事项包含在安全考虑部分中。

动机

所有 dapps 都需要用户与一个或多个以太坊链交互才能运行。 某些钱包仅支持一次与一条链交互。 我们称之为钱包的”激活链”。 wallet_switchEthereumChain 使 dapps 能够请求钱包将其激活链切换为 dapp 所需的任何一条链。 这为 dapps 和钱包带来了 UX 改进。

规范

本文档中使用的关键字“MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”,“RECOMMENDED”,“MAY”和“OPTIONAL”应按照 RFC-2119 中的描述进行解释。

wallet_switchEthereumChain

该方法接受一个带有 chainId 字段的单对象参数。 如果钱包切换了其激活链,则该方法返回 null,否则返回错误。

该方法假定钱包具有单个“激活链”的概念。 激活链定义为钱包将 RPC 请求转发到的链。

参数

wallet_switchEthereumChain 接受一个单对象参数,该参数由以下 TypeScript 接口指定:

interface SwitchEthereumChainParameter {
  chainId: string;
}

如果某个字段不符合此规范的要求,则钱包 MUST 拒绝该请求。

  • chainId
    • MUST 按照 eth_chainId Ethereum RPC 方法,将链的整数 ID 指定为十六进制字符串。
    • 链 ID MUST 是钱包已知的。
    • 钱包 MUST 能够切换到指定的链并为其提供 RPC 请求服务。

返回

如果请求成功,则该方法 MUST 返回 null,否则返回错误。

如果钱包没有激活链的概念,则钱包 MUST 拒绝该请求。

示例

这些示例使用 JSON-RPC,但是可以使用其他 RPC 协议来实现该方法。

切换到主网:

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "wallet_switchEthereumChain",
  "params": [
    {
      "chainId": "0x1",
    }
  ]
}

切换到 Goerli 测试链:

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "wallet_switchEthereumChain",
  "params": [
    {
      "chainId": "0x5",
    }
  ]
}

理由

wallet_switchEthereumChain 的目的是为 dapps 提供一种请求切换钱包激活链的方式,否则他们必须手动请求用户执行此操作。

该方法接受一个单对象参数,以便在几乎不花费实现者和使用者任何成本的情况下实现未来的可扩展性。

有关相关工作,请参见 EIP-3085: wallet_addEthereumChainEIP-2015: wallet_updateEthereumChainwallet_switchEthereumChain 有意放弃了这些 EIP 中包含的链元数据参数,因为它纯粹关注于切换激活链,而与 RPC 端点或与之相关的任何其他元数据无关。

安全考虑

对于具有激活链概念的钱包,切换激活链对未决的 RPC 请求和用户体验具有重要影响。 如果激活链在用户不知情的情况下切换,则 dapp 可能会诱使用户对非预期的链采取操作。

鉴于此,钱包应:

  • 每当收到 wallet_switchEthereumChain 时,显示一个确认信息,清楚地标识请求者和将要切换到的链。
    • EIP-1102 中使用的确认信息可以用作参考。
  • 切换激活链时,取消所有未决的 RPC 请求和特定于链的用户确认信息。

保护用户隐私

自动拒绝钱包不支持或尚未添加的链的请求,这使请求者可以推断出钱包支持哪些链。 钱包实现者应考虑此通信渠道是否违反钱包的任何安全属性,如果违反,则应采取适当的措施来缓解它。

版权

通过 CC0 放弃版权和相关权利。

Citation

Please cite this document as:

Erik Marks (@rekmarks), "EIP-3326: Wallet Switch Ethereum Chain RPC 方法 (`wallet_switchEthereumChain`) [DRAFT]," Ethereum Improvement Proposals, no. 3326, March 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3326.