🌐

SmartContract: WhatsABI

2022/09/28に公開

WhatsABI とは

未検証であってもEthereumのコントラクトアドレスからABIを推測することができるツール。

EVMバイトコードを解析して4バイトのJUMPI命令を見つけ、それが有効な内部JUMPDESTターゲットであることを確認します。

4バイトの関数署名ハッシュセレクタを取得することで、Solidityと同様のバイトコードレイアウト技術でコンパイルされた未検証コントラクトの関数呼び出しに使用することができます。

また、4byte.directoryなどのAPIで4byteセレクタを調べれば、オリジナルの関数シグネチャの可能性を発見することができる。

参考文献

実装

概要

Next.jsのAPIで WhatsABI を実装した方法を記載。

WhatsABI は内部で fs を使用しているため、クライアントではなくサーバーに実装しました。

実装方法

必要なライブラリをインストール

yarn add ethers @shazow/whatsabi

nextjs/pages/api/get-selectors.ts を作成

import type { NextApiRequest, NextApiResponse } from 'next'

import { getDefaultProvider } from 'ethers'
import { selectorsFromBytecode } from '@shazow/whatsabi'

export default async function handler(
  res: NextApiResponse
) {

  const address = "0x00000000006c3852cbEf3e08E8dF289169EdE581"
  const code = await getDefaultProvider().getCode(address)
  const selectors = selectorsFromBytecode(code)
  res.status(200).json({ selectors })
}

以下が返却値

[
  '0x06fdde03', '0x46423aa7',
  '0x55944a42', '0x5b34b966',
  '0x79df72bd', '0x87201b41',
  '0x88147732', '0xa8174404',
  '0xb3a34c4c', '0xe7acab24',
  '0xed98a574', '0xf07ec373',
  '0xf47b7740', '0xfb0f3ee1'
]
GitHubで編集を提案

Discussion