¿Hay alguna forma de extraer ABI de un contrato implementado?

Estoy creando una interfaz de usuario web para probar contratos inteligentes y actualmente tengo que proporcionar el ABI para un contrato que pruebo. ¿Hay alguna forma de extraer la ABI de un contrato implementado (preferiblemente mediante programación)?

Respuestas (8)

Si el código fuente se ha publicado en Etherscan, entonces tienen una API para recuperarlo. Desde https://etherscan.io/apis#contracts :

Obtener ABI de contrato para códigos fuente de contrato verificados

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

Desafortunadamente, esto no funcionará porque lo necesito para contratos inteligentes que se ejecutan en una red privada (Ganache)
Eso es correcto. En general, no hay forma de obtener el ABI para un contrato a menos que se haya almacenado explícitamente en algún lugar.

Sí, existen herramientas que intentan recuperar ABI del código de bytes.

Por ejemplo , porosidad y mitrilo .

No siempre es posible recuperar ABI porque el código de bytes no contiene firmas de función sino solo los últimos 4 bytes del hash de firma de función .

Si mira potosity o mitril, necesita un ABI para desensamblar o descompilar. No hay forma de obtener una ABI de un contrato implementado.

Vaya a EtherScan > ingrese la dirección del contrato > haga clic en Contrato en el título de la sección de la pestaña > Desplácese hacia abajo para encontrar el ABI del contrato > haga clic en el ícono Copiar para copiarlo

Los contratos implementados se almacenan en código de bytes, por lo que no puede extraer la ABI de origen desde el primer momento; sin embargo, existen herramientas de descompilación de código abierto que intentan recuperar la ABI.

Lo que puede hacer es almacenar ABI JSON en IPFS y hacer referencia a él por su hash de contenido.

También puede copiar su ABI en Remix yendo a la sección Compilar-->Detalles (ABI)ITB

Dado que está desarrollando la interfaz de usuario, supuse que también ha desarrollado el contrato. En ese caso, si usa Truffle , después de implementar el contrato , puede encontrar la ABI para cada contrato que implementó en la carpeta de compilación/contratos generada automáticamente en su proyecto, por ejemplo, /construir/contratos/Migraciones.json.

Si está implementando por línea de comando, puede leer desde el archivo donde se construyó previamente, en el caso de hardhat, hay un ejemplo:

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)
  }
}

Al usar React, puede verificar la ABI de los contratos implementados accediendo a la carpeta de artefactos que se crea después de la implementación:

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

Si está utilizando Brownie para la implementación local de python, después de usar el comando brownie compile, puede encontrar el JSON ABI de su contrato inteligente en esta carpeta:build -> contracts -> ContractABC.json