ABIファイル、javaクラスファイルについて
それぞれフロントエンド、バックエンド等でコントラクトを操作する際に必要となる場合があります。
ABIファイル:
コントラクトのインターフェース情報となる.jsonファイル。
ethers.jsなどでコントラクトを操作する場合やコントラクトクラスファイル作成時に必要。
javaクラスファイル:
コントラクトをjavaクラス化し、java環境で扱えるようにするため.javaファイル。
これによりJavaからコントラクトの関数を直接呼び出せるようになる。
web3jでコントラクトを操作する場合に必要。
開発環境
hardhat 2.24.1
solidity 0.8.0
ABIファイル作成方法
手順1:作成したコントラクトをコンパイルしArtifactファイルを用意
今回は下記のサンプルを使用します。
// contracts/SampleContract.sol
pragma solidity ^0.8.0;
contract SampleContract {
uint public value;
function set(uint _value) public {
value = _value;
}
function get() public view returns (uint) {
return value;
}
}
作成したコントラクトをcmdからhardhatでコンパイルします。
>npx hardhat compile
hardhatの場合、コンパイルを行うと下記ディレクトリにコントラクトのArtifactファイルとなる.jsonが出力されます。
.
└── artifacts/
└── contracts/
└── SampleContract.sol/
├── SampleContract.dbg.json
└── SampleContract.json
基本的にはコントラクトの.solファイル名のフォルダが作成され、その中にコントラクト名が入った2種類の.jsonファイルが作成されます。
ABIファイルの作成には、SampleContract.jsonファイルを使用します。
手順2:ABIファイルとなる空の.jsonファイルを用意
ファイル名はわかりやすくSampleContract_abi.jsonなどが良いでしょう。
手順3:"abi"情報から必要な箇所をコピーし、用意した.jsonファイルへ貼り付ける
コンパイル時に出力されたSampleContract.jsonは下記のような形式になっているかと思います。
(少々長いので「...」で一部オミットしています)
{
"_format": "hh-sol-artifact-1",
"contractName": "SampleContract",
"sourceName": "contracts/SampleContract.sol",
"abi": [
{
"inputs": [],
"name": "get",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
...
}
],
"bytecode": "0x123456789...",
"deployedBytecode": "0x...",
"linkReferences": {},
"deployedLinkReferences": {}
}
ここから、"abi": 以降の[からabi情報終端の]までをコピーして、用意した.jsonファイルへ貼り付けます。
上記の、SampleContract.jsonから作成すると下記のようなファイルになります。
[
{
"inputs": [],
"name": "get",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
...
}
]
これにてABIファイルの作成は完了です。
これをデシリアライズすることで、ethers.js等でcontractInterfaceとして使用できるようになります。
javaクラスファイル作成方法
※前項のSampleContract.jsonを使用して解説しています。
手順1:web3jをダウンロード
下記URLからクラスファイル作成ツール「web3j」が提供されているので、zipファイルをダウンロードし解凍する。
https://github.com/LFDT-web3j/web3j/releases/tag/v4.5.0
(javaで使用するモジュール名と混同してわかりにくい…)
手順2:コントラクトのABIファイルとbinファイルを用意する
ABIファイルは前項の「ABIファイル作成方法」を参照してください。
・binファイルの作成方法
1:空の.binファイルを用意する
今回はSampleContract.binという名前で空の.binファイルを用意します。
2:SampleContract.jsonから"bytecode"情報をコピーし、用意した.binファイルへ貼り付け
「””」は除き、要素のみコピーして貼り付けます。
0x123456789...
手順3:web3jのbinファイルへ用意したABIファイルとbinファイルを配置
下記のようなディレクトリになります。
.
├── bin/
│ ├── web3j
│ ├── web3j
│ ├── SampleContract_abi.json
│ └── SampleContract.bin
└── lib
手順4:web3jのコマンドを実行しクラスファイルを作成
web3j-4.5.0/binでcmdを開き、下記コマンドを実行しましょう。
web3j solidity generate -a=SampleContract_abi.json -b=SampleContract.bin -o=src -p=ethereum.contracts
コマンドの各オプション解説
-a=SampleContract_abi.json:使用するABIファイルの指定
-b=SampleContract.bin:使用するbinファイルの指定
-o=src:出力先となるディレクトリ
-p=ethereum.contracts:javaで使用する際のパッケージ名 生成されるクラスはこの名前空間に属する
実行する際は、ご自身の環境に合わせてオプションを変更してください。
web3j-4.5.0\bin>web3j solidity generate -a=SampleContract_abi.json -b=SampleContract.bin -o=src -p=ethereum.contracts
_ _____ _ _
| | |____ (_) (_)
__ _____| |__ / /_ _ ___
\ \ /\ / / _ \ '_ \ \ \ | | | / _ \
\ V V / __/ |_) |.___/ / | _ | || (_) |
\_/\_/ \___|_.__/ \____/| |(_)|_| \___/
_/ |
|__/
Generating ethereum.contracts.SampleContract_abi ... File written to src
実行後このように表示されていれば作成成功です。
今回の場合は下記ディレクトリのように出力されていると思います。
.
├── bin/
│ ├── web3j
│ ├── web3j
│ ├── SampleContract_abi.json
│ ├── SampleContract.bin
│ └── src/
│ └── ethereum/
│ └── contracts/
│ └── SampleContract_abi
└── lib
src以下のディレクトリをjavaプロジェクトへ移動させればコントラクトの関数が使用できるようになります。