ab3株式会社で代表をやっています、菊池佑太(@yutakikuchi_)と申します。 Mirrorでのblog投稿は初めてになりますが、これからはガンガン利用していきたいと思っています。
ab3株式会社ではリアルライフのログに着目したtoC向けのアプリとPlatformを開発しています。開発中の「BeLife」というアプリで普段の行動に関するデータを登録すると、そのデータをBlockChainに書き込んだり、データからNFTアートを生成したり、纏めるとlog to earnのような世界を目指しています。
BeLifeというアプリはPC, Smartphoneなど、様々なデバイスからアクセス可能なアプリとして提供予定で、Flutterで開発しており、2022/06月中には正式にリリース予定となっています。
BeLifeはある意味Dappsという位置づけになり、(厳密に言うと違いますが) ユーザーがSmartPhoneで使うことを想定しています。このSmartPhone向けのDappsから任意のWalletをDeepLinkなどで呼び出して、NFTのmintなどをBlockChainに対して行う例をここでは紹介します。使うものはFlutterと関連Package、WalletConnect、Metamaskになります。下記ではWalletConnectとFlutterでの実装について書きます。
WalletConnectとは一言でいうとDappsとWalletを簡単に接続するためのプロトコルであると言えます。任意のDappsから任意のWalletを呼び出すことができ、Dappsからのsessionの中でWalletを経由したsendtransactionが可能です。
例えばWallet機能が無いDappsがBlockChainに対してデータの書き込みなどを行おうとすると、一般的には特定のWalletアプリを経由して行う必要がありますが、世の中の事例的にDappsがPC版で作られるケースが多く、Google検索してもSmartPhone向けの記事はほとんど出てこないです。特に日本語でのドキュメントはほとんど無いと言えます。(PC版ChromeからMetamaskの拡張機能を呼び出す仕組みはそれなりにドキュメントで見ますが、これがNativeのアプリからMetamaskを呼び出すとなるとほとんど事例が出てきません。)
WalletConnectは 下記 walletconnect.comにて展開されるプロトコルであり、自身でサーバーなどを立てる必要がありません。HTTPとWebsocketを活用して、DappsとWalletをsessionとして接続を確立させ、このsession上でDappsからの操作をWallet側に伝達をする仕組みになっています。
なぜWalletConnectを使うのかという背景はこちらのNoteにまとまっています。一言でいうとMetamaskへの一般的なDeepLinkは簡単なtransactionしか送れないため、これをwalletconnectでsessionにして、NFT mintなど複雑なtransactionにも対応可能にします。

FlutterでWalletConnectのsessionを活用してNFT mintなどのtransactionを送る場合は下記のpackageを必要とします。
walletconnect_dartでDappsとWalletとのsessionを確立し、web3dartでsession上でtransactionを送付します。挙動的には Dapps → walletconnect → Wallet(接続確認) → Dapps → Wallet(Transaction送付確認)となります。
これらの処理を実装する上では上記2点のpackageであるpub.devに公開されているexampleが参考になります。特にweb3dartは様々なトランザクションを作成、送付できるので、実装前に一度見ておくと良いと思います。SmartContractを呼び出す部分は下記が参考になります。
https://github.com/xclud/web3dart/blob/development/example/contracts.dart
**またサンプルとなるSessionの確立とsendtransactionのソースコードの一部(すみません、全部では無いので適宜補間が必要です)**を下記のgistに貼っておきました。下記の処理WalletConnectのsession上でPolygon(Mumbai)にDeployされた独自のSmartContractを呼び出し、NFTをmintしています。
https://gist.github.com/yutakikuchi/407e1e5fc4522c57d63fe16a46c633bf
一点だけ注意が必要なこととして、上記のコードを実行するに当たり、WalletConnectEthereumCredentialsのclassが必要になるので、左記のリンクからコピペします。
質問がある方は @yutakikuchi_ までDMでお願いいたします。全てには答えられないかもしれませんが、なるべく見ます。
