no se puede verificar el contrato en etherscan.io. Cómo resolver este problema?

No puedo verificar el contrato en etherscan.io. Pude implementar el mismo código de solidez en (Geth, Mist). Pero no puedo verificar el mismo código en etherscan.io. ¿Qué error estoy haciendo aquí?

Mientras implementaba el código en la niebla, utilicé la versión del compilador:

pragma solidity ^0.4.16;

Seleccioné la misma versión del compilador en etherscan.io:0.4.16+commit.d7661dd9

Aquí está la transacción:

El contrato fue creado durante Txn#0x9832deb04d2900f97c0434588038f573ee066c0a095c1c0a0af07225d0068a9d

Resultado: no coincide con el código de bytes de creación de entrada encontrado en esta dirección. ¡Perdón! El ByteCode de contrato compilado para 'Compra' NO coincide con el Código de creación de contrato para [0x89d236a8387e6fE94e27D674D856e09f4dEE1302].

¿El contrato utiliza alguna biblioteca? ¿Lo compilaste con la optimización habilitada?
@pabloruiz55: Gracias. Traté de compilar con la optimización habilitada y eliminé el símbolo de zanahoria. Entonces mi contrato fue verificado
Por cierto: ¿por qué la gente usa 0.4.16 en 2018, septiembre en producción?

Respuestas (2)

Intente cambiar su pragmadeclaración a

pragma solidity 0.4.16

(sin el ^).

Puede haber problemas debido a la pragma...declaración, ya que con el ^, permites la versión 0.4.16

o cualquier cosa más nueva que no rompa la funcionalidad (hasta, pero sin incluir, la versión 0.5.0)

(de solidity.readthedocs.io). Esto puede conducir a un código de bytes diferente, lo que resulta en una verificación fallida.

Gracias. Eliminar el símbolo ^ me ayudó a resolver el problema.

Estoy de acuerdo con @gisdev_p, hasta cierto punto. El símbolo de la zanahoria ^crea justo el tipo de ambigüedad que no queremos en esta etapa. Su contrato ya está implementado y, según el código fuente, puede haber sido compilado con cualquier compilador de Solidity >= 0.4.16.

Ahora, debe descubrir la versión del compilador que se usó realmente para crear el código de bytes que está en la cadena.

Se descarta todo lo inferior a 0.4.16.

Debe pensar en la herramienta que usó para hacer la compilación e interrogarla para obtener el número de versión, por ejemplo, solc --versiono truffle version). Luego, si no está seguro acerca de la opción de optimización, pruébelo en ambos sentidos.

Cuando encuentre la combinación mágica (Nombre del contrato + Versión del compilador + Opción de optimización), Etherscan notará una coincidencia perfecta entre el código de bytes en la cadena y el resultado de compilar su contrato con sus parámetros. Así es como confirman que el código fuente que tienen es una representación fiel del contrato compilado en la cadena.

Espero eso ayude.

Muchas gracias por ayudarme a entender el concepto. Traté de compilar con la optimización habilitada y eliminé el símbolo de zanahoria. Entonces mi contrato se verificó. ¡Muchas gracias!
Me alegro de que haya ayudado. Siempre se agradecen los votos a favor ;-)
Verificar la versión de solidez con solc --versionme ayuda.