在web3中钱包是一个非常重要的概念,除了要了解常见的MetaMask这种浏览器钱包、硬件钱包等,对钱包的一些标准对开发来讲也是必须掌握的知识点,其中EIP-1193和EIP-6963是以太坊生态中关于钱包与应用交互的重要标准,下面我们来详细说说它们的核心内容以及区别。
在 web3 中钱包是一个非常重要的概念,除了要了解常见的 MetaMask 这种浏览器钱包、硬件钱包等,对钱包的一些标准对开发来讲也是必须掌握的知识点,其中 EIP-1193 和 EIP-6963 是以太坊生态中关于钱包与应用交互的重要标准,下面我们来详细说说它们的核心内容 以及区别。
它定义了浏览器环境中钱包与 DApp 交互的统一 JavaScript API,解决早期不同钱包(如 MetaMask、Coinbase Wallet)API 不兼容的问题。
通常来说,在 DApp 中你应该使用类似 web3.js
、ethers
、viem
这样的 SDK 来和钱包进行交互,这些 SDK 会帮你封装好一些方法,让你更方便的和钱包进行交互。
示例:
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}`);
});
尽管 EIP-1193 在一定程度上解决了钱包与 dApp 之间的兼容性问题,但它也存在一些局限性:
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 中,提升用户体验,让用户可以自由选择他已经安装的钱包。
window
对象自动扫描已安装的兼容钱包。EIP-6963 允许多个钱包同时注入提供者,解决了 window.ethereum 的单提供者限制。特性 | EIP-1193 | EIP-6963 |
---|---|---|
解决的问题 | 钱包与 DApp 的通信协议不统一 | 钱包发现与连接流程不便捷 |
核心功能 | 标准化 API 方法和事件系统 | 自动扫描钱包、统一连接界面 |
技术实现 | 浏览器 window.ethereum 对象 |
window.ethereum.providers 数组 |
依赖关系 | 独立标准 | 依赖 EIP-1193 实现 |
现状 | 已广泛支持(MetaMask、WalletConnect) | 2023 年提出,逐步被钱包和 DApp 采纳 |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!