原文標題:《一文讀懂 WalletConnect》
作者:王榮強
文章概覽
- WalletConnect 能干什么
- WalletConnect 的市場支持情況
- WalletConnect 消息通訊工作原理
- WalletConnect 消息安全如何保障
- WalletConnect 如何快速接入推送
01 WalletConnect 能干什么
它是⼀個基于⼆維碼建立連接的基礎通訊設施。你可以在它的基礎上去建⽴各種交互,它默認的交互協議都是與以太坊的交互,當然你也可以做能夠想象到的各種事,可以不只局限于 Dapp 通訊交互,如果你把默認的以太坊協議改掉,也意味著你將與其他⽀持 WalletConnect 錢包、Dapp 脫離關系,互不兼容。
現在出現了很多針對電腦這種大屏幕的 Dapp 應用,在 WalletConnect 沒有出現之前,必須使用Chrome 插件或者桌面端錢包來授權操作,這讓原本使用移動端錢包的用戶操作和使用習慣出現了割裂感,還需另外操作下載插件或錢包,再將私鑰導⼊進去,很麻煩,
02 WalletConnect 的市場支持情況
最近較為常見的錢包都在支持,比如:
- imToken
- TokenPocket
- 麥子錢包
- Trust Wallet
03 WalletConnect 消息通訊工作原理
//WalletConnect 建立連接原理
Topic 名詞解釋:文本意思為“主題”,在 WalletConnect 中錢包端與 Dapp 端各有⼀個 Topic 主題,讓對方訂閱,這樣就形成了⼀個可以相互通信的通道。
- Dapp 端與中繼服務器建立 Socket 連接;
- Dapp 端⽣成 Dapp ClientID(監聽該 Topic 會得到發送給 Dapp 的消息),Dapp Topic(監聽該Topic 會得到 Dapp 發出的登陸請求),并訂閱 Dapp ClientID;
- Dapp 端向中繼服務器發送 Topic 為 Dapp Topic 的資訊,并攜帶 Dapp ClientID 資訊;
- Dapp 端展示⼆維碼包含 Dapp Topic 資訊,中繼服務器的地址,密碼;
- 錢包端掃描 Dapp 端的⼆維碼,解析出⼆維碼資訊獲得 Dapp Topic,中繼服務器地址,密碼;
- 錢包端與中繼服務器建立socket 連接,然后產生 Wallet PeerID(監聽該 Topic 可以獲得發送給錢包端的消息),并訂閱 Dapp Topic 和 Wallet PeerID ;
- 接下來錢包端將接收到中繼服務器轉發過來的 Dapp 的登陸請求;
- 錢包端處理是否同意 Dapp 的登陸,發送 Topic 為 Dapp ClientID 的消息,并把處理結果和Wallet PeerID 的資訊傳遞回去;
- 此時連接建立成功,如果「Dapp」想給「錢包端」發送消息,則發送 Topic 為 Wallet PeerID 的資訊即可;
- 如果「錢包端」想給「Dapp」發送消息,則發送 Topic 為 Dapp ClientID 的資訊即可,
錢包端 Topic 和 Dapp 端 Topic 兩方共同組成了 Session,WalletConnect 的 Session 生命周期才是 Dapp 與錢包雙方建立的連接的生命周期,WebSocket 只是它的“通訊⼯具”,WebSocket 的斷開不代表此次與錢包的連接斷開,
04 WalletConnect 通訊工作原理
- WalletConnect 只是⼀套通訊協議,雙⽅通信什么資訊都可以;
- WalletConnect 默認通過 WebHook 的⽅式來⽀持推送服務,你可以在⼿機 App 沒有打開的情況下來通知⽤戶處理資訊;
- 如果有⼀方 A 斷開 Socket 連接,另⼀⽅ B 發送消息會暫存在中繼服務中,當下⼀次 A 與中繼服務器建⽴ Socket 連接,并訂閱相關的 Topic,才會將中繼服務暫存的消息發送給 A,
05 WalletConnect 消息安全如何保障
- 使用 AES-256 對稱加密來加密通訊的資訊,HMAC-SHA256 做 Hash 簽名;
- Dapp 端⽣成的⼆維碼中包含對稱加密的密碼,⼿機端掃描該⼆維碼獲得密碼,所以 Dapp ⼆維碼不會過網傳遞,
06 WalletConnect 如何快速接入推送
//底層做支持的技術 WebHook
- WebHook 是⼀種 HTTP 回調:某些條件下觸發的 HTTP POST 請求;
- WalletConnect 的中繼服務中也有這個接受 WebHook URL 的 API 接⼝;
- WalletConnect 單獨提供了 Firebase 推送服務。
- 消息接收方將⼀個 URL 和想接收的消息發送給消息發送⽅;
- 消息發送方達成⼀定的條件,就會去調⽤ 消息接收⽅的 URL,來通知消息接收方接收消息,
//WalletConnect 推送使⽤流程
- ⼿機端收到 Dapp 的登陸請求,⼿機端如果同意登陸請求,可以使⽤ Topic Dapp ClientID 和Firebase ID 向「推送服務」訂閱消息;
- 「推送服務」收到 Topic 會繼續向「中繼服務」發送 WebHook 訂閱 Topic;
- 如果「中繼服務器」發現「推送服務」訂閱的 Topic 有資訊,它就會通知「推送服務」;
- 「推送服務」找到訂閱相關 Topic 的 fitebase ID 發起推送,
07 總結
WalletConnect 是⼀種通過掃描 QR 碼使⽤端到端加密技術將桌⾯ DApp 連接到移動設備的開放性協議,它開啟了整個曾經只有Metamask 錢包可⽤的 DApps 世界。⽤戶可以在不損害其私鑰安全的情況下與任何 DApp 交互,并能在其移動設備上收到通知,簽字同意任何交易請求,