firebase deploy直前にcpコマンドを使ってjsonファイルをコピーする
最初に
会社(Gaiax)の人に教えてもらったやり方です。自分で考えたわけではないのですが、firebaseをよく使う時に便利だったので記事にさせてもらいました。
使う状況(ブロックチェーン上のアプリケーションの場合)
自分がSolidityという言語を使ってよくスマートコントラクトを書くので、具体例として以下のような構成を例に考えます。
- contracts(スマートコントラクト関係)
- artifacts
- EXAMPLE.sol(ディレクトリ)
- EXAMPLE.json
- contracts
- EXAMPLE.sol(solidityファイル)
- front(フロント関係)
- functions(バックエンド関係)
- lib(ディレクトリ)
- src(ディレクトリ)
- index.ts
- package.json
artifactsディレクトリとは?
Solidityだと、まずcontractsディレクトリ以下に何かしらのSolidityファイルを作ります。そのファイルをコンパイルすると生成されるのが、artifacts以下のjsonファイルです。
今回だとartifacts以下のEXAMPLE.jsonにabiの情報が書かれており、スマートコントラクトをfunctions内のindex.tsでインスタンス化して使う時に必要なファイルになります。
artifactsのEXAMPLE.jsonをfunctionsディレクトリ内で使いたい
たとえば、functionsディレクトリ以下(バックエンド側)で、contractsディレクトリ以下のEXAMPLE.solファイルで定義した何かしらの関数を使いたいとします。
そのためには、EXAMPLE.sol内で定義されているスマートコントラクトをインスタンス化する必要があります。その際に、EXAMPLE.solのabiファイルが必要です。そこで、artifactsディレクトリのEXAMPLE.jsonが必要になります。
Firebase functionsにdeployするときに対象となるファイル群は?
firebase functionsをデプロイする時に、デプロイする範囲のファイル群はfunctionsディレクトリ以下に限定されています。
そうなると、functions内のindex.tsでスマートコントラクトをインスタンス化したいとしても、その際に必要なEXAMPLE.jsonがfunctionsディレクトリ内に、contractsディレクトリのartifactsからコピーされている必要があります。
具体的にコピーする方法
functionsディレクトリのpackage.jsonを開きます。
"scripts": {
~~~他のスクリプトコマンド省略~~~
"deploy": "cp ../contracts/artifacts/EXAMPLE.sol/EXAMPLE.json ./lib/ && firebase deploy --only functions",
}
上記のようにdeployコマンドの部分を書き換えれば、functionsをデプロイする前に、毎回functionsディレクトリのlibディレクトリにEXAMPLE.jsonをコピーしてくれます。
補足)index.tsファイル(バックエンド側)でスマートコントラクトをインスタンス化する
new ethers.Contract( address , abi , signerOrProvider )
// libからjsonファイルをよぶ
const exampleSol = require("./EXAMPLE.json")
// スマートコントラクトをインスタンス化する
const exampleInstance = new ethers.Contract(コントラクトアドレス, exampleSol.abi, サイナー)
Discussion