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

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

とりあえずwallet connectって検索してでてきたぽいやつを読んで見る..

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

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

この辺読んでたりしておもったこととか疑問とか。
- 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が、「ウォレットに接続する」共通の仕様ってわけじゃないのね。紛らわしい。

uniswapの「ウォレットに接続」を実行してMetaMaskを選択したら、
Metamaskが開くみたいなのは、この辺をやってみたらわかりそう

Metamaskをインストールすると、window.ethereumが使えるようになって、それ経由でMatamaskとやり取りできるぽい。
eth_requestAccountsを実行すると、Metamaskが立ち上がって、address渡していいかどうかとか聞いてくる。その後、Metamask上で接続先の解除しない限り、その画面はスキップされてDApp側でaddress取れる。
これを直接使ってもいいし、 ethers
とか web3.js
ってライブラリ経由で使ってもいい。

これ、Metamask固有のものなのにetherenumって名前になってるのか?
と思ったけど、EIP-1193で定義されてるものなのかな。
welletconnectの実装で、web.jsにprovider渡してたけど、これもEIP-1193の実装か。

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

あと、Sign in with Ethereumと、「NFT持っていたら見れるサイト」みたいなのどっかでみた気がするしそれを調べる..

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

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

NFTの所有者確認してサービス使わせるというのはどういう仕組みなのか...
- SIWEのチュートリアルでは、openseaのapiを使ってあるaddressが所有しているNFTを参照するぽいことやっていた。
- 自分でethclientとか使ってchainにつないでContractの情報取るほうが正しいかな..?
シンプルにやりたいことはこういうことよな

Contractに定義されているBalanceOfを使えば、ユーザのaddressがそのNFTどれだけ持ってるか確認できそう?
contractのABIをどっからか取得しないといけない?
でもこれownerOfとか定義されてないけど、どうやって取得するんだろうか?

なんか、ERC721なのかERC1155なのかによって、balanceOfの引数変わってたりする...

全体を雰囲気まとめるとこんなかんじ

ERC-20はFungible Tokensで、ERC-721がNon Fungible Tokensなのね。
それでERC-20にはownerOfがないのか。