Etherscan: ¿Cómo puedo verificar un contrato con múltiples importaciones implementadas con Truffle?

Cuando implemento un contrato con Truffle que tiene una importdeclaración e intento verificarlo en etherscan , entiendo que necesito pegar el contenido del archivo importado.

Recibo un error en etherscan que indica que los códigos de bytes de los archivos concatenados e implementados no son los mismos. Lo extraño es que si implemento el contrato (con importaciones) en remix , el código de bytes coincide con el archivo fuente concatenado.

Ejemplo

Aquí hay un ejemplo mínimo de contratos que exhiben este comportamiento.

Combined.soles el archivo concatenado y Outer.solcontiene el contrato que se implementa.

Esto es lo que estoy haciendo que da un error:

  1. Desplegar Outer.solcon trufa
  2. Ir a la dirección del contrato implementado en etherscan
  3. Ingrese el Concatenated.solcódigo fuente y presione verificar

Error, los bytecodes no coinciden.

Más información

  • Uso del compilador 0.4.11en remix y truffle.
  • Ubuntu 16.04.
  • En Kovan, no es que deba importar.
  • contrato implementado
Para mí, la verificación de contratos concatenados solía funcionar a las mil maravillas. ¿Puede proporcionar la dirección del ejemplo mínimo implementado en la red de Kovan para que pueda investigar el caso?
@JakubWojciechowski Respuesta actualizada con la dirección del contrato implementado
Al verificar el código en Etherscan, ¿ha probado con y sin optimizaciones habilitadas?

Respuestas (3)

Actualmente, etherscan no admite la verificación de contratos de varios archivos. Pero hay una discusión en el reddit de etherscan sobre este tema.

La concatenación de archivos en uno funcionó hace algún tiempo, pero desde la versión 0.4.7, Solidity incluye el hash de los metadatos del contrato al final del contrato compilado . Como estos metadatos contienen nombres de archivos y hashes, es posible que obtenga el mismo código de bytes después de concatenar y compilar, pero este hash será diferente.

Creo que la motivación detrás de agregar hash de estos metadatos al contrato implementado es hacer que la verificación de la fuente sea automática, ya que cada contrato implementado contiene un enlace de enjambre a las fuentes, la versión del compilador y las opciones de compilación.

Entonces, básicamente, la función de verificación es bastante inútil desde la solidez 0.4.7.

Construí una CLI que puede ayudarte, llamada multisol . Puede instalarlo a través de Homebrew si está en Mac, o descargar uno de los ejecutables que proporciono si está en Windows o Linux:

$ brew tap paulrberg/multisol
$ brew install multisol

Entonces puedes usarlo así:

$ multisol path/to/YourContract.sol

Esto generará una carpeta llamada "multisol-yourcontract" que se puede usar para verificar el código fuente en Etherscan para una instancia implementada de YourContract.sol. Tenga en cuenta que el tipo de verificación es "Solidez (archivos de varias partes)".

Lo creé truffle-plugin-verifypara automatizar la verificación de contratos de Truffle en Etherscan.


  1. Instale el complemento con npm
npm install truffle-plugin-verify
  1. Agregue el complemento a su archivo truffle.jsotruffle-config.js
module.exports = {
  /* ... rest of truffle-config */

  plugins: [
    'truffle-plugin-verify'
  ]
}
  1. Genere una clave API en su cuenta de Etherscan (consulte el sitio web de Etherscan )
  2. Agregue su clave API de Etherscan a su configuración de trufas
module.exports = {
  /* ... rest of truffle-config */

  api_keys: {
    etherscan: 'MY_API_KEY'
  }
}

Después de migrar su Outercontrato a Kovan, puede verificarlo en Etherscan ejecutando:

truffle run verify Outer --network kovan

Se puede encontrar más información en el repositorio o en mi artículo Verificar automáticamente los contratos inteligentes de Truffle en Etherscan .

I am trying to verify a contract which uses multiple contracts but it fails with the below error: truffle run verify AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 --network kovan Verifying AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 Fail - Unable to verify Failed to verify 1 contract(s): AdminImpl@0xCDa9A9e6990999adfebbf8cADa2a6Ed2664d70A8 Código a verificar: github.com/dydxprotocol/solo/blob/master/contracts/protocol/… Seguí exactamente lo que sugirió y sigo tratando de averiguar qué falta.
Por casualidad, ¿el contrato se implementó a través de otro contrato?
No, se implementa de forma independiente. Después de haberlo implementado, se usa en este contrato: github.com/dydxprotocol/solo/blob/master/contracts/protocol/…
¿Podría abrir un problema en GitHub (con el resultado de ejecutar el comando con la --debugbandera? github.com/rkalis/truffle-plugin-verify/issues/new