Open19

何もわからんから始めるWallet Connect

kokukumakokukuma

DAppの、「wallet接続したらアプリ使えます」って感じが面白いので、どうやって動かすのかをちょっと調べてみる。。

kokukumakokukuma

なんかみた感じ、DAppとWallet両方つくることができるものぽい。

kokukumakokukuma

Useful LinksのところにあるExampleで、
Walletを、スマホのブラウザで開く
DAppを、PCのブラウザで開く

  1. DApp側でConnect to Wallet Connectボタンを押す
  2. DApp側でQRコードやWalletの一覧みたいなのが出る。
  3. Wallet側で「SCan」を選択して、DApp上のQRコードを読む
  4. Wallet側で、Approve / Reject が表示される。
  5. Wallet側で、Approveを選択すると、DAapp上でWalletのAddressや持ってるEtherとかが表示される。
kokukumakokukuma

QRコードをMetamaskで読み込んでも、同様に接続できた。

kokukumakokukuma

https://docs.walletconnect.com/tech-spec
この辺読んでたりしておもったこととか疑問とか。

  • Bridge Serverってのが必要なのか....サンプルではこの辺がそれらしい。。
  • WalletConnect Standard URI formatは、EIP-1328で定義されているとか
    • だから、walletをmetamaskに変えてもちゃんと動くのかな。
    • でもここに定義しているのwcの部分だけで、WalletがBridge Serverと同やり取りしたら良いかとかはかいてないな。
  • 接続後にapp側でリロードしてもつながってる状態維持してるのどうやって?
    • 「どのDAppがどのWalletと接続してる」情報をどっかに保存しておかなきゃいけないよな?
    • Local Strageにでもいれてるだけかな..?
  • なぜDesktopの表示にmetamaskがでないか?
    • uniswapとかで「ウォレットに接続」を実行すると、MetaMaskとWalletConnectが並列してでているな。。
    • WalletConnectが、「ウォレットに接続する」共通の仕様ってわけじゃないのね。紛らわしい。
kokukumakokukuma

Metamaskをインストールすると、window.ethereumが使えるようになって、それ経由でMatamaskとやり取りできるぽい。

eth_requestAccountsを実行すると、Metamaskが立ち上がって、address渡していいかどうかとか聞いてくる。その後、Metamask上で接続先の解除しない限り、その画面はスキップされてDApp側でaddress取れる。

これを直接使ってもいいし、 ethers とか web3.js ってライブラリ経由で使ってもいい。

kokukumakokukuma

これ、Metamask固有のものなのにetherenumって名前になってるのか?

と思ったけど、EIP-1193で定義されてるものなのかな。
https://eips.ethereum.org/EIPS/eip-1193

welletconnectの実装で、web.jsにprovider渡してたけど、これもEIP-1193の実装か。

kokukumakokukuma

その他の疑問点...

  • window.ethereum.networkVersion/selectedAddress
    • これらって、domain毎に区別されるんだろうか?
    • networkVersionはわかれてない. これはMetamaskの現状の設定がどうなっているかを表示するもの
    • selectedAddressもそうかと思ったが, こっちは分かれてるぽい...
  • wallet 接続してない状態でも、 window.ethereum.isConnected()がtrueになるな...
  • eth_callってなんや
    • valueとかdataって引数も謎。
  • recoverTypedSignature_v4あたりなんかうまく動かないな...
kokukumakokukuma

この辺を読んでみた感じ。
https://docs.login.xyz/
https://docs.login.xyz/general-information/siwe-overview/eip-4361

  • walletが持っている秘密鍵で、サーバが作ったmessageを署名して、サーバーに送って検証する。
  • eth_requestAccountsでwallet接続しただけだと、send transactionとかwallet経由でやる必要のあることはwallet持ってる人しかできないけど、サーバ側はそれを検証することができないからこういう形を取る。
  • まぁ、FIDOのassertion検証の流れを同じ。
  • siweってライブラリを使っているがやっているのはmessage作成するだけで、署名を実行するのはMetamaskへのアクセス方法でやっているのと同じやり方。
kokukumakokukuma

疑問

  • サーバは送られてきたSignature検証のための公開鍵はどこから取得しているのか....?
    • FIDOやDPopのように, messageに乗ってるわけでもないし.
    • chainからとってるわけでもないよな...?
kokukumakokukuma

NFTの所有者確認してサービス使わせるというのはどういう仕組みなのか...

  • SIWEのチュートリアルでは、openseaのapiを使ってあるaddressが所有しているNFTを参照するぽいことやっていた。
  • 自分でethclientとか使ってchainにつないでContractの情報取るほうが正しいかな..?

シンプルにやりたいことはこういうことよな

kokukumakokukuma

このあたりの話から、
ContractのABIを準備して、abigenでGoのコードジェネレートしたら、繋げられるんじゃないか感がある。