記事を投稿しなさすぎて広告が表示されるようになってしまったので、久しぶりの投稿を兼ねて困ったことの吐き出し。
主にこちらの件について
ThirdWebのsdk、クライアント側は整って使いやすいけど、サーバー側(nodejs、Python)は、依存ライブラリが古くて他のパッケージとコンフリクト起きたり、ドキュメントが古かったりしてかなり厳しい
— せいうち (@sey3233) November 12, 2023
決してアンチthirdwebではなく、Web3開発でめちゃくちゃ使い勝手が良く、もっと良くなって欲しいの意図と、同じ箇所で引っかかった人に向けて記事です。
thirdweb-sdkは最高なので、Web3開発の際はぜひみなさんご利用ください。
こちらの内容は2023年11月25日現時点での情報になります。今後のアップデートによりこの事象が発生しなくなることはあります。
Nuxt3のケース
フロントエンド開発にNuxt3を採用した時の出来事。Nuxt3でフロントエンドとBFF的な用途でバックエンドAPIを開発しており、そこでthirdweb-sdkを利用した。
インストールは簡単。
npm i @thirdweb-dev/sdk ethers@^5
フロントエンドのコードはほぼ問題なく実装可能、素晴らしい。
問題が発生したのはサーバAPIを実装していた時。thirdweb-sdkにはコードスニペット機能があり、デプロイしたコントラクトを実行するサンプルのソースコードを提供してくれる。
それに従ってサーバAPIに以下の実装しコントラクト情報を取得する処理を書いてみる。
import { Goerli } from "@thirdweb-dev/chains"; import { ThirdwebSDK } from "@thirdweb-dev/sdk"; // If used on the BACKEND pass your 'secretKey' const sdk = new ThirdwebSDK(Goerli, { secretKey: "YOUR_SECRET_KEY", }); const contract = await sdk.getContract( "コントラクトアドレス" ); await contract.metadata.set({ name: "My Contract", description: "My contract description", });
するとターミナル側で下記のエラーが発生。
ReferenceError: require is not defined
Nuxt3はViteでビルドされているのだが、Viteはrequire()
を利用したインポートに対応していない為発生したエラーとなる。どうやら依存ライブラリの一部でrequire()
を利用したインポートを利用している様子。
本家のIssueには上がっており、その通りに対応してみたが、今度はasTree
がないとエラーが発生。
SyntaxError: The requested module 'node_modules/treeify/treeify.js' does not provide an export named 'asTree'
ここら辺色々試したがしばらくして解決しなかったので断念。Pythonにもthirdweb-sdkがある為、PythonをThirdwebのプロキシサーバとして建て、そちらに対してリクエストを行う方針に変更。
Pythonのケース
現時点でthirdweb-sdkのバージョンは3.1.1
必須のPythonのバージョンが3.7以上とのことで「だいぶ古いバージョンからサポートしており大丈夫か」と思ったが、とりあえずインストールしてみる。
pip install thirdweb-sdk
インストールは問題なく完了。今回はFirebaseも利用したかったので、追加でfirebase-adminもインストールしてみる。
するとprotobufのバージョンでコンフリクトが発生し、以下のエラーが表示された。
pip install firebase-admin ~~ 省略 ~~ ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. web3 5.27.0 requires protobuf<4,>=3.10.0, but you have protobuf 4.25.1 which is incompatible.
まとめると以下の表の感じ。正確にはthirdweb-sdkではなく、thirdweb-sdkが利用しているweb3pyが要求するprotobufのバージョンが低すぎてコンフリクトが発生している。
ライブラリ | 要求するprotobuf のバージョン |
---|---|
thirdweb-sdkのweb3py | 3.10.0以上、4未満 |
firebase-admin | 4以上 |
thirdweb-sdkが利用しているweb3pyのバージョンは5系だが、一方で最新のweb3pyは現在バージョン6系までリリースされている。しかもweb3pyの系では、protobufは4.21.6
以上を利用している。
そのため、thirdweb-sdkもweb3pyのバージョンを6系まで上げてくれれば、firebase-adminとのコンフリクトは発生しなさそう。
しかし現時点ではそうなっておらず、対応方法がなかったので、firebase-adminをprotobufの3系を利用しているバージョン4.5.3
まで下げることで対応した。
pip install firebase-admin==4.5.3
Pythonのthirdweb-sdkはリリースが8月以降行われていないので、バージョンが古いまま放置されている様子。利用者が少ないのか、、しかしweb3pyのバージョンくらいはメジャーバージョンは最新に合わせて欲しいなと思います。
まとめ
ここまで書きましたが、決してアンチthirdwebではないです(2回目)。
途中で軽く紹介したコードスニペット機能やSDKはとても便利で、スクラッチで開発していた時と比較して半分以上開発の時間を短縮できている印象がある。
こういう時に困った本人がコミットして改善していくのがOSSのあるべき姿だなあとか思い、時間があればプルリクとか出してみようと思った最近でした。