Web3 新手系列:点击 MetaMask 误唤起其他钱包?钱包冲突解决方案现状

时间:2024-09-22 编辑: 浏览:(305)

钱包唤起时的混乱

连接钱包是进入 Web3 世界的关键一步,Web3 用户经常需要在一些 DApp 网站上连接钱包。但是,仅仅是这个简单的动作,也可能对用户造成严重的不便。

连接钱包

想象一下这样一个场景:一位新入门的 Web3 用户(出于好奇,他安装了许多个插件钱包),访问了某个 DApp 网站,并且想要使用自己的浏览器插件钱包来连接它,但是当他们点击网站提供的“Connect Wallet”按钮,并选择某个钱包以便想使用它来连接 DApp 时,可能会发现弹出的钱包并不是自己选择的。这很可能会让他感到慌乱和窒息,以为是自己的电脑中了病毒,所以才执行了自己意料之外的操作。

区块链钱包是连接区块链的重要入口,而为了占据这个入口,各个钱包使用了它们能想到的各种方式。其中最让 DApp 开发者以及 DApp 用户头疼的要数各钱包对全局变量的篡改。

在当前的浏览器钱包实现逻辑中,都有通过向浏览器注入全局变量来暴露钱包提供的功能(例如以太坊平台的钱包会将其提供的功能注入到「 window.ethereum 」上),以便 DApp 可以调用钱包提供的方法来与之交互。

只是,由于很多钱包都会将自己注入到同一个 window.ethereum 变量上,就导致在后面注册的钱包会覆盖之前注册的钱包,以至于只能通过这种方式只能唤起最后注册的那个。

有时候 DApp 用户为了可以正常使用自己想要用的钱包,不得不临时将其他钱包插件禁用,或者直接只安装某一个钱包。这样一来,反而与钱包开发者最初的想法大相径庭了。并且新钱包哪怕做的更出色,也很难吸引到已经使用其他钱包的用户。

有朋友可能奇怪,为什么一定要注入到同一个变量中呢?假设有两个钱包:A 和 B,其实只要 A 将自己注入到「 window.a 」,B 将自己注入到「 window.b 」,想要唤起哪个钱包,就调用其对应的对象中提供的方法,就不会发生上述想要调用 A 却反而将 B 唤起的问题。这样确实可以解决竞争问题,但是,问题在于,如此以来,假如 DApp 将要支持多个钱包连接,就必须将开发者想要适配的所有钱包名称全部预先定义在代码中,并且在用户选中某个钱包时,调用该钱包的相关方法。导致相关代码维护起来相当麻烦。而统一将钱包注入到同一个对象上,则可以免于这个麻烦。

解决方案

为了脱离上述的两难困境,社区中有两个相似的标准。

以太坊的解决方案:EIP-6963

以太坊社区在 2023 年 5 月份提出了 EIP-6963 提案。

其中的基本逻辑很简单,就是舍弃全局变量,转而使用约定的事件,来解决钱包注册与发现的问题。

具体来说,插件钱包加载成功后,触发统一的「 eip6963:announceProvider 」事件,通知 DApp 有新的钱包可用。而 DApp 则通过监听此事件,来得知自己目前可用的钱包有哪些。

这样,通过一套抽象的事件监听逻辑,避免了直接使用全局变量所造成的问题,且能够自动发现目前用户环境中可用的钱包。如此一来,两难自解。

社区标准:Wallet Standard

EIP-6963 是以太坊生态标准,但是不止以太坊,其他链平台也会有类似的问题。例如 Solana 链的钱包,普遍会将自己注入到「 window.solana 」变量上,同样会造成竞争情况。

那么可否让 Solana 生态也实现这个标准呢?虽然 EIP-6963 只是为了解决以太坊生态中的钱包发现问题,但是其中所蕴含的思路其实可以套用在所有链平台。那么,我们能否再进一步,提供一套通用的标准,让所有区块链平台的钱包和 DApp 实现,让所有链平台的开发者和用户都能享受到 EIP-6963 所提供的便利?理论上是完全没有问题的,而且已经有开发者在这么做了,也就是 Wallet Standard。

Wallet Standard 所做的核心工作,在于提供了两个函数:「 registerWallet 」和「 getWallets 」,前者用于钱包,后者用于 DApp。

钱包调用「 registerWallet 」,传入一个钱包对象,这个对象上封装了钱包提供的功能(例如 Connect 方法,用于连接钱包)。函数内部会先触发一个 RegisterWalletEvent 事件,事件的参数其实是一个回调函数,用于让 DApp 监听到 RegisterWalletEvent 事件时调用,而这个回调函数实际上会将 wallet 对象传入,于是 DApp 就可以拿到钱包对象引用,也就可以与钱包进行交互了。

DApp 开发者没有必要自己来写监听、接收钱包对象的代码,这部分也已经被 Wallet Standard 内置到「 getWallets 」当中。但是,getWallets 只是监听了事件,具体要怎样处理事件,还是需要开发者考虑。例如获取到的 Wallets 放到哪里?有些钱包在 DApp 加载前就已经加载,而另一些钱包可能在之后才加载,这些钱包的状态如何维护?Wallet Standard 针对以上细节问题,同时提供了「 @wallet-standard/react 」包,开发者直接使用它提供的 React Hooks 就可以获取到想要的数据,包括钱包列表、当前连接的钱包、钱包提供的方法等。

Wallet Standard Features

除了最基本的获取 Wallet 对象外,Wallet Standard 也定义了一些 Features 格式。

实际上,钱包都具有一些最基本的功能,例如连接、监听钱包事件等。Wallet Standard 提供了「 standard:connect 」、「 standard:events 」等 features,钱包供应商实现这些特性后,DApp 可以直接根据这些值来判断钱包是否支持某些操作。

上面提到的 "standard:*" 是它内置定义的特性,实际上它们的值并没有特别强硬的要求,所以可以随意扩展。不同的链平台也会有其独特的特性,例如 Solana,直接约定 "solana:*" 即可。Solana 平台常见的 features 包括「 solana:signTransaction 」, 「 solana:signMessage 」等。

Wallet Standard 现状

目前实现了 Wallet Standard 标准的项目实际上并不多,值得一提的有 Solana 和 Sui。

在 Ant Design Web3 的 Solana 适配器中,也支持适配了 Wallet Standard 的钱包的自动检测,开发者基本只需要通过一个「 autoAddRegisteredWallets 」开启即可,不需要配置一大堆的钱包元数据,开发体验和用户使用体验直线上升。

ZAN.TOP 连接钱包的逻辑在早期同样遇到相同的问题,不过现在,得益于 Ant Design Web3 提供的配置,很轻松就适配了 EIP-6963 标准。大家在 https://zan.top/personal/account?chInfo=ch_wxdyh 绑定地址时应该已经体验到这一点了。

各区块链生态的实现

目前各个区块链平台对 Wallet Standard(或 EIP-6963)标准的态度并不相同,这里举几个例子:

Bitcoin

比特币目前为止似乎没有类似的标准,有一个实现了 Wallet Standard 标准的项目,但是并没有引起太多关注,现在也很久没有提交新的代码。

目前开发者只能手动维护状态,或者使用一些开发包来辅助工作。例如在 Ant Design Web3 中的 Bitcoin 适配器实现中,针对不同的钱包,会从不同的全局变量上获取,并存到统一的状态中。这其实是等于库开发者将繁琐的状态维护工作接手了。而且,这仅仅解决了钱包冲突问题,无法自动感知可用钱包的问题依然存在。

Ethereum

以太坊平台已经有了 EIP-6963 标准,相关库和钱包也大多提供了支持。

Solana

如上文,官方提供了实现:https://github.com/solana-labs/wallet-standard

Sui

Sui 目前已经对 Wallet Standard 提供了实现,在官方文档上可以找到使用方法:https://docs.sui.io/standards/wallet-standard

DApps 开发库的支持

wagmi

wagmi 通过 mipd (https://github.com/wevm/mipd) 库对 EIP-6963 提供了支持,具体方式可以查看 wagmi 的文档。

RainbowKit

RainbowKit(https://www.rainbowkit.com/)内部逻辑基于 wagmi,所以也已经对 EIP-6963 提供了内置支持。

Ant Design Web3

Ant Design Web3(https://web3.ant.design/) 的 Ethereum 和 Solana 适配器对这两个标准都进行了非常好的支持,并且开发者开启起来非常便携。

对以太坊 DApp 开发者而言,只需要添加 eip6963 配置即可,注意其中与 EIP-6963 相关的在 23-25 行:

而如果你是 Solana 生态的 DApp 开发者,方式也是类似的。它提供了 autoAddRegisteredWallets 属性:

总结

EIP-6963 和 Wallet Standard 可以极大改善用户连接钱包的体验,降低新钱包供应商的准入门槛。希望以后能有更多链平台以及钱包、DApp 开发者可以提供或实现相关标准,这有利于 Web3 向着更好的方向发展。

最新 更多 >
  • 1 比特币-抛弃FUD,因为BTC的价格仍在85000美元的轨道上!

    越来越多的出售比特币的呼声可能会推动比特币反弹至68600美元。一项重要指标显示,比特币尚未达到本周期的峰值 一个有趣的转折点是,比特币跌破63400美元,在市场上引发了许多恐惧、不确定性和怀疑。通过观察过去12-24小时的交易员情绪,可以支持这一说法。 使用Santiment的链上社交工具,AMBCrypto注意到,卖出的呼声远不止“逢低买入”的尖叫声。几周前,情况并非如此。这是因为加密货币价格

  • 2 比特币(BTC)跌至6300美元,Altcoins再次暴跌(周末观察)

    比特币从商业周开始的价格回升尝试已经停止,因为该资产早些时候跌至62400美元,截至目前反弹至63000美元左右。 altcoins的状况也好不到哪里去,今天大部分市场都变成了红色。加密货币总市值在两天内下降了1500亿美元。 BTC倾销至6300美元 比特币在上周五完成的第四次减半前后的价格走势相当平淡。伊朗-以色列袭击后,该资产收复了一些失地,当区块奖励减少时,该资产已超过6.5万美元。 它甚

  • 3 Shiba Inu价格预测,这2300万美元的信号能扭转局势吗?

    Shiba Inu(SHIB)的价格在4月26日巩固在0.000025美元的支持水平之上,此前该团队的1200万美元筹款在本周初引发了0.000029美元的重新测试。 SHIB价格在周内上涨41% Shiba Inu的价格在4月19日至4月22日期间飙升53%,达到每周0.000029美元的峰值,此前该团队宣布筹集1200万美元的资金,使世界上最大的模因币项目有了一个积极的开端。 Shiba I

  • 4 美国城市启动最新保障收入实验,2250000美元无限制发放

    经过三年的规划,据报道,美国一座城市距离启动以家庭为重点的保障收入计划还有几个月的时间。 据当地新闻媒体《每日公报》报道,加州波莫纳的“繁荣家庭”是一个为期18个月、耗资225万美元的项目,旨在支持陷入经济困境的年轻父母。 该计划于2021年首次提出,旨在寻找18岁至25岁之间有5岁以下孩子的父母。繁荣家庭最初将选择总共600个家庭,其中350个将被分配到对照组,其余250个将被指定到测试组。 测

  • 5 币安币价格分析与预测——BNB再次拒绝这一关键阻力线 跌破 600 美元

    币安币BNB已从月度下跌中恢复良好,但再次面临拒绝,现在每日表现疲软。然而,它已经形成了一种新的看涨模式——找到附近的支撑位以启动新的上涨。自市场从 3 月份的跌势中恢复以来,BNB 一直保持在 500 美元以上的水平。这一价格水平在月中出现反弹,本周价格重新回到 618 美元的区间。由于多周阻力线多次遭到拒绝,该资产未能推高并自昨天以来短暂下跌。在撰写本文时,它看起来很疲软,交易价格低于 600

  • 6 5种最值得投资的加密货币,为牛市爆发做好准备 !

    历史性的比特币减半后,投资者目睹了相对平静的市场,大多数代币的涨幅可以忽略不计。今天的市场走势反映了下跌趋势,恐惧/贪婪得分为 58 分。此外,整体市值和交易量分别下降了 2.01% 和 19.76%。 尽管如此,历史数据显示,QRA 影响市场走势,可能引发上涨趋势。在这一点上,市场参与者寻求顶级加密货币以利用可能的价格上涨。 5种最值得投资的加密货币NEONeo 的价格表现出显着的稳定性,维持在

  • 7 还有多少沉睡的比特币 180万枚BTC是永远消失还是伺机而动

    文章来源:佩佩梭哈4 月 15 日,一个沉睡了 14 年的比特币钱包苏醒。钱包所有者向 Coinbase 发送了 50 枚比特币,从这些曾经一文不值的比特币中获利超过 300 万美元。这样的交易不常见,但也并非独一无二。几乎每周都会有早期比特币钱包苏醒,这引发了一个问题:还有多少推测中已经丢失的比特币可以重新流通。《财富》和 Chainalysis 的一项新调查提供了一些见解。图表显示 2018 

  • 8 融资2000万美元之后 Polyhedra Network联合Nubit发力比特币链上生态

    作者:DeMan近期,一项重要的合作事项开始在加密圈启动,合作方为Polyhedra Network和Nubit。其中,Polyhedra Network完成了2000万美元的融资,Nubit也将重点发力ZKP证明。下面详细介绍一下合作情况。分别在比特币公链和ZKP技术领域具有核心优势,Polyhedra和Nubit值得关注首先分别介绍一下这两大合作方。作为区块链技术的先驱,正在通过尖端的零知识证

  • 9 区块链首个DEFI拆分——JUMP FINANCE正式上线

    JUMP FINANCE基于BTC-LAYER2生态最强龙头Merlin Chain打造全球领先的数字资产金融服务平台正式上线,共同赋能比特币二层网络生态!JUMP FINANCE生态1.0阶段拆分金融于2024年4月27日正式上线,在区块链行业中首次引入新金融模型——拆分机制,即将开创数字经济时代新机遇。据悉,JUMP FINANCE是由JUMP FUND基金会投资布局,旗下拥有强有力的资金支持

  • 10 Shiba Inu:自推出以来每月5美元,2024年达到900万美元

    Shiba Inu(SHIB)是过去四年中表现最好的资产之一。从2020年8月推出到2021年10月创下0.00008616美元的历史新高,SHIB的价格上涨了数百万%。 早期的Shiba Inu(SHIB)投资者成为了千万富翁,在某些情况下甚至成为了亿万富翁。只要每月投资5美元,你就可以成为SHIB的百万富翁。如果你自2020年8月推出SHIB以来每月向其投入5美元,那么到目前为止,你将投入22