【钱包协议】 EIP1193 和 EIP6963 详解

在web3中钱包是一个非常重要的概念,除了要了解常见的MetaMask这种浏览器钱包、硬件钱包等,对钱包的一些标准对开发来讲也是必须掌握的知识点,其中EIP-1193和EIP-6963是以太坊生态中关于钱包与应用交互的重要标准,下面我们来详细说说它们的核心内容以及区别。

在 web3 中钱包是一个非常重要的概念,除了要了解常见的 MetaMask 这种浏览器钱包、硬件钱包等,对钱包的一些标准对开发来讲也是必须掌握的知识点,其中 EIP-1193 和 EIP-6963 是以太坊生态中关于钱包与应用交互的重要标准,下面我们来详细说说它们的核心内容 以及区别。

EIP1193

它定义了浏览器环境中钱包与 DApp 交互的统一 JavaScript API,解决早期不同钱包(如 MetaMask、Coinbase Wallet)API 不兼容的问题。

通常来说,在 DApp 中你应该使用类似 web3.jsethersviem 这样的 SDK 来和钱包进行交互,这些 SDK 会帮你封装好一些方法,让你更方便的和钱包进行交互。

EIP1193 的规范地址

特点

  • 标准化接口:EIP-1193 规范化了 window.ethereum 对象,定义了钱包与 dApp 交互的标准方法和事件。这使得 dApp 开发者可以使用统一的接口与不同钱包进行通信。
  • 最小化设计:API 设计为最小化、事件驱动,并且与传输和 RPC 协议无关。这使得它易于扩展,通过定义新的 RPC 方法和消息事件类型来增加功能。
  • 安全性:采用 “请求 - 响应” 模式,所有敏感操作(如签名、转账)需用户明确授权。

示例:

const ethereum = window.ethereum;

ethereum
  .request({ method: "eth_chainId" })
  .then((chainId) => {
    console.log(`hexadecimal string: ${chainId}`);
    console.log(`decimal number: ${parseInt(chainId, 16)}`);
  })
  .catch((error) => {
    console.error(`Error fetching chainId: ${error.code}: ${error.message}`);
  });

应用场景

  • 所有现代以太坊钱包(MetaMask、WalletConnect、Brave Wallet 等)均实现 EIP-1193。

限制

尽管 EIP-1193 在一定程度上解决了钱包与 dApp 之间的兼容性问题,但它也存在一些局限性:

  • 多钱包冲突:当用户安装了多个钱包时,window.ethereum 对象会被覆盖,导致只有最后一个加载的钱包能够被识别。

EIP6963

EIP-6963 是为了解决 EIP-1193 的局限性而提出的改进方案。它引入了一种新的机制,允许在网页中发现多个注入的钱包提供者,通过 window 事件驱动的方式,优化了钱包与 dApp 之间的交互。

技术上来讲其实就是通过浏览器的 window.addEventListener 来监听消息,通过 window.dispatchEvent 来发送消息。所有消息的 type 都有 eip6963: 前缀,具体的消息内容定义可以参考规范文档。

对于开发者来说,和 EIP1193 一样,你使用一些社区的库即可,这样可以免去对细节的关注。比如你如果使用 wagmi,那么通过配置 multiInjectedProviderDiscovery 即可接入 EIP6963。

如果你使用了 Ant Design Web3,通过配置 WagmiWeb3ConfigProvider 的 eip6963 即可在 DApp 中使用 EIP6963。它的连接钱包的弹窗会自动添加检测到的钱包。

使用 wagmi 的示例:

export default function Web3() {
  return (
    <WagmiWeb3ConfigProvider
      config={config}
      wallets={[MetaMask()]}
+     eip6963={{
+       autoAddInjectedWallets: true,
+     }}
    >
      <Address format address="0xEcd0D12E21805803f70de03B72B1C162dB0898d9" />
      <NFTCard
        address="0xEcd0D12E21805803f70de03B72B1C162dB0898d9"
        tokenId={641}
      />
      <Connector>
        <ConnectButton />
      </Connector>
      <CallTest />
    </WagmiWeb3ConfigProvider>
  );
}

其中配置了 eip6963 使得使用通过 EIP6963 协议连接钱包,避免了多个钱包之间可能出现的冲突。另外添加了 autoAddInjectedWallets 配置使得自动添加检测到的钱包到 Ant Design Web3 的 UI 中,提升用户体验,让用户可以自由选择他已经安装的钱包。

特点

  • 钱包发现机制:* DApp 通过浏览器扩展 API 或 window 对象自动扫描已安装的兼容钱包。EIP-6963 允许多个钱包同时注入提供者,解决了 window.ethereum 的单提供者限制。
  • 事件驱动:通过 eip6963:announceProvider 和 eip6963:requestProvider 事件,钱包和 dApp 可以在没有固定执行顺序的情况下相互发现并进行交互。
  • 钱包元数据:EIP-6963 允许钱包提供更丰富的元数据,如钱包名称、图标等,帮助 dApp 更好地识别和显示钱包信息。

事件机制

  • eip6963:announceProvider:钱包通过此事件宣布自己的存在,包含钱包的元数据和提供者接口。
  • eip6963:requestProvider:dApp 通过此事件请求与钱包进行交互。

应用场景

  • 移动端钱包(如 Trust Wallet)与 DApp 的无缝连接。
  • 浏览器扩展钱包(如 MetaMask)在 DApp 中的自动发现。

总结

特性 EIP-1193 EIP-6963
解决的问题 钱包与 DApp 的通信协议不统一 钱包发现与连接流程不便捷
核心功能 标准化 API 方法和事件系统 自动扫描钱包、统一连接界面
技术实现 浏览器 window.ethereum 对象 window.ethereum.providers 数组
依赖关系 独立标准 依赖 EIP-1193 实现
现状 已广泛支持(MetaMask、WalletConnect) 2023 年提出,逐步被钱包和 DApp 采纳
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
mengbuluo222
mengbuluo222
0x9Ff1...FaA5
前端开发求职中... 8年+开发经验,拥有丰富的开发经验,擅长VUE、React开发。