Я создаю веб-интерфейс для тестирования смарт-контрактов, и в настоящее время мне нужно предоставить ABI для контракта, который я тестирую. Есть ли способ извлечь ABI из развернутого контракта (желательно программно)?
Если исходный код был опубликован в Etherscan, у них есть API для его извлечения. Из https://etherscan.io/apis#contracts :
Получите Contract ABI для проверенных исходных кодов контрактов
Да, есть инструменты, которые пытаются восстановить ABI из байт-кода.
Например пористость и мифрил .
Не всегда возможно восстановить ABI, потому что байт-код не содержит сигнатур функций, а только последние 4 байта хэша сигнатуры функции .
Перейдите в 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 compile
вы можете найти JSON ABI своего смарт-контракта в этой папке:build -> contracts -> ContractABC.json
Андрей
пользователь19510