🌐
SmartContract: WhatsABI
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'
]
Discussion