Web3:使用MetaMask快捷鍵開啟錢包


在Web3世界中,連結錢包是用戶使用DApp網站的關鍵步驟。然而,用戶常常會遇到連接錢包時的混亂和困擾。當新入門的Web3用戶造訪DApp網站並嘗試連接錢包時,可能會發現被彈出的錢包與其選擇的不符,導致困惑和恐慌。為了解決這個問題,以太坊社群提出了EIP-6963標準,提倡使用約定事件來解決金鑰註冊和發現問題。錢包Standard提供了一套標準函數,幫助錢包和DApp之間更順暢地互動。雖然各個區塊鏈生態對標準的態度各不相同,但EIP-6963和錢包Standard對於改善用戶體驗和促進Web3發展具有重要作用。

緊急呼救混亂

連結錢包是進入Web3 世界的一步,Web3 用戶經常需要使用DApp 的網站連接錢包。但是,你的這個簡單的操作,可能會給用戶造成嚴重的不便。

聯絡幫

面臨著這樣一個場景:一位新入門的Web3用戶(出於好奇,他安裝了好幾個插件錢包),訪問了某個DApp網站,並且想要使用自己的瀏覽器插件錢包來連接它,但是當點擊網站提供的「Connect錢包」按鈕時,找到某個錢包以便想使用它來連接DApp時,可能會發現彈出的錢包並不是自己選定的。這很可能會讓他感到慌張和窒息,以為自己的電腦中了病毒,所以才執行了意料之外的操作。

區塊鏈錢包是連接區塊鏈重要入口,而為了鼓勵這個入口,區塊鏈錢包使用了它們能想到的各種方式。其中最讓DApp 以及DApp 用戶頭的數各錢包對全域變數的改造。

在目前的瀏覽器網址列中,透過向瀏覽器注入全域變數來呼叫介面(即,將介面注入到windows.ethereum上),以便DApp可以與伺服器互動。

只是,由於許多錢包都會將自己注入到同一個視窗.ethereum 變數上,就導致在後面註冊的錢包會覆蓋註冊的錢包,以便透過該方法結束註冊。

: DApp 用戶為了能夠正常使用自己使用的錢包,有時還需要臨時安裝一個錢包,或是直接安裝一個新錢包。最終用戶只需要輸入一個錢包位址,就可以使用這個新錢包。

有朋友可能知道,為什麼一定要把錢包注入本地?假設A和B,其實只要A將自己注入到「window.a」 ,B將自己注入到「window.b」 ,想要呼叫對應的帳戶名,就可以了。這樣一來,就無需再調用A了。 正確答案:假設A和B,其實只要A注入到「window.a」 ,B將自己注入到「window.b」 ,想要呼叫對應的帳號名,就可以了。

解決

為了脫離上述的兩難困境,社區中存在著相似的標準。

以太坊解決方案:EIP-6963

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

其中堅持邏輯相信,就是拋棄全域變量,而使用約定的事件,解決金鑰註冊與發現問題。

具體來說,插件錢包載入成功後,觸發統一的「eip6963:announceProvider」事件,通知DApp有新的錢包可用。而DApp則透過監聽此事件,來得知自己目前可用的錢包有哪些。

這使得它可以在不破壞邏輯的情況下,自動發現並銷毀用戶程式。

社群標準:錢包標準

EIP-6963 是以太坊標準,但不只以太坊,其他鏈平台也有類似的問題。例如Solana 鏈的錢包,使用者會將自己注入到「window.solana」變數上,並創造競爭對手的情況。

雖然EIP-6963 應該可以解決以太坊中的錢包發現問題,但其中蘊含的想法其實可以套用在所有鏈平台中。那我們能否再進一步,提供一套通用的標準,讓所有鏈平台的開發者與使用者都能享受到EIP-6963 它們便利?理論上是完全沒有問題的,而且已經有開發者在變換了,也就是錢包Standard。

錢包Standard 所做的核心工作,在於提供了兩個函數:「registerWallet」和「getWallets」,前者用於錢包,後者用於DApp。

錢包呼叫“register錢包”,傳入一個錢包對象,這個對像上封裝了錢包提供的功能(即Connect方法,用於連接錢包)。函數內部會先觸發一個RegisterWalletEvent事件,事件的參數其實是一個回呼函數,用來讓DApp監聽到RegisterWalletEvent事件時調用,而這個回調函數實際上會將錢包物件傳入,因此DApp可以取得錢包物件引用,也可以與錢包互動了。

Web3:點選MetaMask快捷鍵開啟錢包

DApp 開發者自己來寫監聽、接收錢包物件的程式碼,這部分也已經被錢包Standard 內建到「getWallets」當中。但是,getWallets 只是監聽了事件,具體要處理事件,還是需要開發者考慮。有些錢包在DApp 中可以先加載,而另一些錢包可能在才加載,這些錢包如何維護?錢包Standard 針對細節問題,同時提供了“@wallet-standard/react”包,開發者直接使用提供的React Hooks 就可以獲取到想要的數據,包括錢包列表、當前連接的錢包、錢包提供的方法等。

錢包標準功能

除了最基本的取得錢包物件外,錢包Standard 還定義了一些Features 格式。

實際上,錢包都具有一些最基本的功能,例如連接、監聽錢包事件等。錢包Standard 提供了「 standard:connect 」、「 standard:events 」等功能,錢包供應商實現這些特性後,DApp 可以直接根據這些值來判斷錢包是否支援某些操作。

上面提到的”standard:*” 是它內建定義的特性,實際上它們的值並沒有特別強硬的要求,所以可以隨意擴展。不同的鏈結平台也會有其獨特的特性,例如Solana,直接約定”solana:*”即可。 Solana平台常見的功能包括「solana:signTransaction」、「solana:signMessage」等。

錢包標準現狀

目前實現了錢包Standard標準的專案其實不多,值得一提的是Solana和Sui。

在Ant Design Web3 的Solana 適配器中,也支援適合了錢包Standard 的錢包的自動檢測,開發者基本上只需要透過一個「autoAddRegisteredWallets」開啟即可,不需要配置一大堆的錢包元數據,開發體驗和用戶使用體驗直線上升。

ZAN.TOP 連接錢包的邏輯在早期同樣遇到相同的問題,不過現在,得益於Ant Design Web3提供的配置,很輕鬆就適應了EIP-6963 標準。大家在https://zan.top/personal/account?chInfo=ch_wxdyh綁定位址時應該已經體驗到這一點。

各區塊鏈生態的實現

目前各個區塊鏈平台對Walt Standard(或EIP-6963)標準的態度並不相同,這裡舉了幾個例子:

比特幣

到目前為止,似乎沒有類似標準,一個已經實現了錢包Standard 標準項目,但並沒有引起太多關注,現在也沒有提交新的程式碼。

: 其實,這並不意味著庫姆塞無法啟動,所以只能手動維護一個帳號,然後使用一些開發包來輔助工作。

以太坊

以太坊平台已經有了EIP-6963 標準,相關庫和錢包也大多提供了支援。

索拉納

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

Sui 目前已經對錢包Standard 提供了實現,在官方文件上可以找到使用方法:https://docs.sui.io/standards/wallet-standard

DApps 開發庫簡介

瓦格米

wagmi 透過mipd (https://github.com/wevm/mipd) 庫對EIP-6963 提供了支持,具體方式可以查看wagmi 的文檔。

彩虹套件

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 行:

Web3:點選MetaMask快捷鍵開啟錢包

如果你是Solana 生態的DApp 開發者,也可以試試看。它提供了autoAddRegisteredWallets 屬性:

Web3:點選MetaMask快捷鍵開啟錢包

總結

EIP-6963 和錢包Standard 可以大幅改善用戶連接錢包的體驗,並降低新錢包供應商的進入門檻。希望以後能有更多的鏈平台以及錢包、DApp 開發者可以實現或實現相關標準,這有利於Web3 朝向更好的方向發展。

本文由ZAN Team(X官方帳號@zan_team)的gin-lsl撰寫。

資訊來源:0x資訊編譯自網際網路。版權歸作者ZAN Team所有,未經許可,不得轉載

Total
0
Shares
Related Posts