0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【solidity】コントラクトのABIファイル及びjavaクラスファイルの作成方法

Posted at

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
// 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は下記のような形式になっているかと思います。
(少々長いので「...」で一部オミットしています)

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から作成すると下記のようなファイルになります。

SampleContract_abi.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ファイルへ貼り付け
  「””」は除き、要素のみコピーして貼り付けます。

SampleContract.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プロジェクトへ移動させればコントラクトの関数が使用できるようになります。

参考記事

・solidityのコントラクトをJavaのコントラクトクラスに変換する方法

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?