---
title: "スマートコントラクトのABIとは?"
description: "開発者向けの例と使い方"
---

# スマートコントラクトのABIとは?

スマートコントラクトのApplication Binary Interface（ABI）は、コントラクトが外部アプリケーションや他のスマートコントラクトと通信・連携する機能を提供する。外部ソースからデータを受け取ることは、アプリケーションとユーザーの目的を達成する上で重要になる場合がある。

従来のWeb開発では、データに関するやり取りはAPI（Application Program Interface）を通じてアプリケーションとサーバーの間で行われる。サーバーは情報の中央集権的なソースとして機能し、リクエストに応じてアプリケーションにデータを送る。

ブロックチェーン上には、このようなデータの中央集権化は存在しない。ノードは実質的にサーバーとして機能し、スマートコントラクトはオンチェーンで「ホスト」される関数である。ブロックチェーン外のアプリケーション（および他のスマートコントラクト）は、オンチェーン上のスマートコントラクトと通信する手段を必要とする。ここでABIが登場する。

## **なぜABIが必要か**

ABIとは何かを詳しく見ていく前に、なぜそれが存在するのかを理解しておくとよい。

スマートコントラクトは[EVM（Ethereum Virtual Machine）](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)の中核となるアプリケーションである。スマートコントラクトの目的は、コントラクト内で定義された特定の条件が満たされたときにトランザクションを実行することにある。これらの条件は、オンチェーン・オフチェーンいずれのイベントでもありうる。スマートコントラクトは[Solidity](https://www.alchemy.com/overviews/solidity)のような高級言語で記述されるが、EVM上にはバイナリ形式である実行可能バイトコードとして保存される。

<ImageBlock
  src="https://media.alchemy.com/1703767018-evm-executable-bytecode.jpeg"
  alt="スマートコントラクトのコードがEVM上に実行可能バイトコードとして保存される様子を示す図"
  width={1600}
  height={916}
  caption="EVM上の実行可能バイトコード"
/>

このバイトコードは人間には読めないため、理解するには解釈が必要になる。ABIによって、スマートコントラクトを書く人は誰でも、Javascriptのような高級言語で書かれたWebアプリケーションと、EVMが理解するバイトコードとの間で通信できるようになる。

## **ABIとは何か**

Web2における対応物であるAPIと同様、ABIは関数セレクターとして機能し、実行のためにスマートコントラクトに対して呼び出せる具体的なメソッドを定義する。これらの具体的なメソッドと、それに紐づくデータ型は、生成されるJSON RPCファイルにリストされる。

<ImageBlock
  src="https://media.alchemy.com/1703767166-abi-function-selector.png"
  alt="ABIがスマートコントラクトのメソッドに対する関数セレクターとして機能する様子を示す図"
  width={760}
  height={484}
  caption="ABI関数セレクター"
/>

APIとは異なり、JSON形式のリクエストをそのままスマートコントラクトに送って応答を期待することはできない。コントラクトはバイトコードでしか通信しないためだ。これをEVMが理解できるものに変換するために、この情報はABIエンコーディングを通じてエンコードされる。これらのエンコーディングには関数シグネチャや変数宣言が含まれており、EVMはスマートコントラクト内のどの関数を実行すべきかを正確に把握できる。

<ImageBlock
  src="https://media.alchemy.com/1703767249-abi-encoding.png"
  alt="関数呼び出しをEVMバイトコードに変換するABIエンコーディングの例"
  width={1362}
  height={280}
  caption="ABIエンコーディング"
/>

応答もバイトコードで返されるため、Webアプリケーションで処理する前に解釈が必要になる。応答にバイトコードを使う利点は、コントラクトの関数を呼び出した後に返される構造をあらかじめ予測できることである。

## **ABIの使い方**

### 生成

Hardhat/TruffleのようなツールやRemixのような[IDE](https://remix.ethereum.org/#optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.7+commit.e28d00a7.js)を使っている場合、コントラクトのABIは自動的に生成される。[Solidity Compiler NPMパッケージ](https://www.npmjs.com/package/solc)を使えば、手動でABIを作成することもできる。パッケージをインストールした後、ターミナルで「`solcjs contractname.sol --abi`」コマンドを実行できる。成功すると、.abiファイルが生成される。

生成されたABIを手に入れたところで、このファイルに含まれる要素のいくつかを見てみよう。

<ImageBlock
  src="https://media.alchemy.com/1703767374-generated-contract-abi.png"
  alt="生成されたスマートコントラクトABI JSONファイルの例"
  width={1600}
  height={730}
  caption="生成されたコントラクトABI"
/>

### **実行**

ABIはEVMバイトコードとWebサイトのJavascriptとの間の通訳として機能するため、スマートコントラクトの関数を実行したいときには常に必要になる。ABIに加えて、ブロックチェーン上のコントラクトのアドレスも必要になる。以下は、これがどのように行われるかを示す小さなJavascriptのコードスニペットである。

<ImageBlock
  src="https://media.alchemy.com/1703767477-executing-abi.png"
  alt="ABIとアドレスを使ってコントラクトの関数を実行するJavaScriptスニペット"
  width={1600}
  height={880}
  caption="ABIの実行"
/>

すでにデプロイされているコントラクトのABIを調べたい場合は、コントラクトのアドレスで[Etherscan](https://www.alchemy.com/dapps/etherscan)を検索することで見つけられる。例えば[こちら](https://etherscan.io/address/0xb4eaf48bd7f72356e1019c157e91b81a1c541073#code)：

<ImageBlock
  src="https://media.alchemy.com/1703767569-abi-of-already-deployed-contract.png"
  alt="すでにデプロイされているコントラクトのABIを示すEtherscanのコントラクトページ"
  width={1600}
  height={315}
  caption="すでにデプロイされているコントラクトのABI"
/>

### エンコーディング

すべての通信がバイトコードで行われるため、開発者自身にこれらのメッセージをエンコードさせるのは現実的ではない。幸い、Remixのような一般的なコンパイラはエンコーディングも代わりに処理してくれる。これらのエンコーディングは一定のパターンに従っているため、[ABI Specification](https://docs.soliditylang.org/en/v0.8.11/abi-spec.html)を確認することで、何が行われているかをより理解しやすくなる。

最初の4バイトは関数シグネチャであり、スマートコントラクト内のどの種類の関数が実行されているかを示す。よく使われる関数識別子としてa9059cbbがあり、これは[ERC20](https://www.alchemy.com/overviews/erc20-solidity)のtransferであることを示す。ここに関数シグネチャの[データベースディレクトリ](https://www.4byte.directory/)があるので、さらに調べることができる。

<ImageBlock
  src="https://media.alchemy.com/1703767678-function-hashes.png"
  alt="ERC20 transferセレクターを含む、ABI関数シグネチャハッシュの例"
  width={1069}
  height={418}
  caption="ABI関数ハッシュ"
/>

5バイト目以降が引数のエンコード部分である。応答もこれと似た構造に従うが、関数シグネチャは含まれない。

## **結論**

ABIは、スマートコントラクトを扱う上で見落とされがちな側面であることが多いが、この技術の使いやすさにおいて重要な役割を果たしている。[スマートコントラクトのチュートリアル](https://www.alchemy.com/docs/how-to-deploy-a-smart-contract-to-the-sepolia-testnet)を実際に手を動かして進めることは、この目立たない働き者の力を理解し、知識を実践に活かすための良い方法である。
