Есть ли способ извлечь ABI из развернутого контракта?

Я создаю веб-интерфейс для тестирования смарт-контрактов, и в настоящее время мне нужно предоставить ABI для контракта, который я тестирую. Есть ли способ извлечь ABI из развернутого контракта (желательно программно)?

Ответы (8)

Если исходный код был опубликован в Etherscan, у них есть API для его извлечения. Из https://etherscan.io/apis#contracts :

Получите Contract ABI для проверенных исходных кодов контрактов

https://api.etherscan.io/api?module=contract&action=getabi&address=0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413&apikey=YourApiKeyToken

К сожалению, это не сработает, так как мне это нужно для смарт-контрактов, работающих в частной сети (Ganache).
Правильно. Как правило, нет никакого способа получить ABI для контракта, если только он не хранится где-то явным образом.

Да, есть инструменты, которые пытаются восстановить ABI из байт-кода.

Например пористость и мифрил .

Не всегда возможно восстановить ABI, потому что байт-код не содержит сигнатур функций, а только последние 4 байта хэша сигнатуры функции .

Если вы посмотрите на potosity или мифрил, вам нужен ABI для дизассемблирования или декомпиляции. Невозможно получить ABI из развернутого контракта.

Перейдите в EtherScan> введите адрес контракта> щелкните контракт в заголовке раздела вкладки> прокрутите вниз, чтобы найти ABI контракта> щелкните значок «Копировать», чтобы скопировать его.

Развернутые контракты хранятся в байт-коде, поэтому вы не можете извлечь исходный ABI из коробки, однако существуют инструменты декомпиляции с открытым исходным кодом, которые пытаются восстановить ABI.

Что вы можете сделать, так это сохранить ABI JSON в IPFS и ссылаться на него по хэшу содержимого.

Вы также можете скопировать свой ABI в Remix , перейдя в раздел Compile-->Details(ABI)АБИ

Поскольку вы разрабатываете пользовательский интерфейс, я полагаю, вы также разработали контракт. В этом случае, если вы используете Truffle , после развертывания контракта вы можете найти ABI для каждого развернутого вами контракта в автоматически созданной папке build/contracts в вашем проекте, например /build/contracts/Migrations.json.

Если вы развертываете с помощью командной строки, вы можете прочитать из файла, в котором ранее была собрана, в случае с каской есть пример:

const fs = require("fs")
const path = require("path")

const getTheAbi = () => {
  try {
    const dir = path.resolve(
      __dirname,
      "./artifacts/contracts/HelloWorld.sol/HelloWorld.json"
    )
    const file = fs.readFileSync(dir, "utf8")
    const json = JSON.parse(file)
    const abi = json.abi
    console.log(`abi`, abi)

    return abi
  } catch (e) {
    console.log(`e`, e)
  }
}

При использовании React вы можете проверить ABI развернутых контрактов, обратившись к папке артефактов, которая создается после развертывания:

artifacts -> contracts -> smartcontract.sol -> smartcontract.json

Если вы используете Brownie для локального развертывания Python, после использования команды brownie compileвы можете найти JSON ABI своего смарт-контракта в этой папке:build -> contracts -> ContractABC.json