空谷に吼える

ブロックチェーン/DLTまわりのなにかしらを書いていく所存

WindowsでHyperledger Fabric Client SDK for Node.jsを使ってクライアントアプリケーションを開発するときの注意点

最近Node.jsの勉強をしており、「おっそういえばHyperledger FabricにはNode.js用のSDKがあったな、よしいっちょなんかアプリでも作ったろ!」と思ったところまではよかったのじゃが、Windows上で開発を始めてしまったために初手からめちゃくちゃ苦労してしまったとさ……ということでハマりポイントをメモっておきます。

結論

絶対にWindowsを使わないとならない理由(そのようなものがどこかにあるとして)を抱えていない限りはWindows上でHyperledger Fabric SDK for Node.jsを使って開発を行うのはやめておいたほうがいいと思います。MacLinuxを使って開発するか、クラウド上などに別途Linux環境を構築し、そこにWindows上からVisual Studio CodeのRemote Development機能を使ってアクセスしてリモート開発をするのをおすすめします。

それでも俺はWindowsで開発するんだ!というアツい想いを持ったひとは以下をよく読んでから着手すると良いでしょう。

留意しておくべきポイントと必要な対処

前提

  • Hyperledger Fabric Client for Node.js SDKのバージョン:1.4.7
  • IDEVisual Studio Codeを利用
  • Node.jsは1週間前に勉強を始めた初心者(なので変なこと書いていたらご指摘ください)

windows-build-toolsが必要

Fabric Client SDK for Node.js(以下、fabric-client)の依存モジュールのいくつかをビルドするためにC++コンパイラPython(2.7系)が必要です。windows-build-toolsを入れるとこのへんをコマンド一発でセットアップできるのでnpm install -g windows-build-toolsで入れておきましょう。

Nodeのバージョン

fabric-client v1.4のドキュメントにはサポートするNodeのバージョンは10.13+, 12.13+と記載があります(2021/2/21時点)。が、どうもWindows環境特有の制約があるのか、12.20.2ではfabric-clientをnpm installすると、pkcs11jsという依存モジュールのビルドの中でエラーが大量に出てしまいビルドが通りませんでした。

Nodeのバージョンを切り替えて10.23.3にしたところ(pkcs11jsのビルドでdeprycatedの警告が大量に出るものの)ビルドが通るようになりました。こういうこともあるのでそもそもnodistを導入しておくなどしてNodeのバージョンを簡単に切り替えられるようにしておいたほうがよいですね。

grpc-nodeのビルド前の準備

何も対処せずふつうにnpm install fabric-clientとかでビルドを行うとfabric-clientの依存モジュールであるgrpc-node(gRPC for Node.js)のビルドの際に問題が出ます。

一部ソース修正を行ってからのビルドが必要なので、①いったんnode_modules配下を削除してまっさらな状態から、②まずnpm install --ignore-scripts fabric-clientしてfabric-clientとその依存モジュールのソースだけ導入し、③以下のgrpc-nodeに以下の修正を入れたうえで、④npm rebuild --unsafe-perm --build-from-sourceなどでビルドし、⑤エラーが出ていないことを確認してから他のモジュールを入れていくと良いでしょう。

openssl関連(常に必要)

Windows環境ではビルド時に含まれるOpenSSLのヘッダーとライブラリでの不整合が生じる問題があり、その解消のために予め<Nodeのルートフォルダ>/include\node\opensslを削除したあとでgrpc-nodeをビルドする必要があります。

手元の環境ではC:\Users\<ユーザー名>\AppData\Local\node-gyp\Cache\10.23.3\include\node\opensslに存在しており、このopensslフォルダをリネームしておくことでエラーを解消できました。このフォルダの場所がわからない場合はいったんそのままnpm rebuild --unsafe-perm --build-from-sourceするとエラーがめちゃめちゃ出てきてそのエラーメッセージにフォルダの場所が書いてあるのでやってみましょう(その後上記①からやり直し)。

ALPN関連(場合によっては必要)

ALPN(Application-Layer Protocol Negotiation)を無効にしておく。これは常に必要な対応ではないですが、クライアントアプリケーションからFabricのネットワーク(Orderer、Peer、Fabric CA)に対してgRPCで通信を行う際、間にLoad Balancerなどを挟んでそこでTLSを終端させるような経路になっている場合に必要となる可能性があります。このあたりの記事を参照のこと。

npm install --ignore-scripts fabric-clientしたことでnode_modules/grpc/binding.gypが作成されているはずなので、その中から該当箇所を以下の通り修正します:

  • 修正前:'_WIN32_WINNT=0x0600',
  • 修正後:'_WIN32_WINNT=0x0600','TSI_OPENSSL_ALPN_SUPPORT=0',

その後……あるいは#PR

以上のポイントを対処することでfabric-clientのインストール(およびビルド)がなんとか完了し、ようやくfabric-clientを用いるクライアントアプリケーションをガリガリ書いていく準備ができました。ひらたく言うとNode.jsアプリケーション開発初手のnpm installができましたということです。

……が、わたしはここまででちょっともう疲れてしまったので、Windows上での開発を諦め、クラウド上にLinux環境を作成してそこでVisual Studio CodeのRemote Development機能を使ってリモート開発をする方針に切り替えました。いや~~クラウドって本当に便利ですね~~~~。なので、Windows上でのHyperledger Fabric SDK for Node.jsを利用したアプリケーション開発で以降に別の問題が出ないかどうかはわかりません。ガッツがあるひとはトライしてみてください。

なお、Linux環境にはOracle Cloud Developer Imageを使い、てっとり早く開発環境のセットアップができました。最初からこうすればよかったんだよな。こういった開発環境用途程度ならOracle Cloudの無料リソース(=Free Tier)に含まれる仮想マシンで十分なので、よろしければこちらのブログなどを参考にOracle CloudのFree Trialに登録し、Free Tierの仮想マシンをゲットしてみてください。