Remix: la inicialización de la creación del contrato devuelve datos con una longitud de más de 24576 bytes. Es probable que la implementación falle). ¿Qué se puede hacer?

Recibo el siguiente error al implementar mi contrato en Remix:

La inicialización de la creación del contrato devuelve datos con una longitud de más de 24576 bytes. Es probable que la implementación falle. Más información: eip-170

El contrato se divide en 2 contratos. A con 250 líneas y B (B es A) con 500 líneas. También creé una biblioteca y exporté algunas de mis funciones a esta biblioteca. Actualmente estoy subiendo al entorno Javascript VM. Vale la pena señalar que cuando hago válida la casilla de verificación Habilitar optimización en la pestaña Compilar, todavía no funciona. Tengo un par de preguntas:

1) ¿Cómo puedo verificar el tamaño de los datos en Remix? Recibo un error de que tiene más de 24kb, ¿cómo puedo verificar cuánto es exactamente?

2) ¿Qué está causando esto? ¿Está esto relacionado con la longitud del código o la cantidad de gas que se ejecuta? Si es el gas, ¿cómo es que cuando agrego mucho más gas al límite de gas en la pestaña Ejecutar en remix, todavía me da el mismo error?

3) ¿Alguna forma común de disminuir el tamaño de los datos para poder implementarlos?

Gracias

para la parte 1) Verifique el objeto de código de bytes de su contrato, no debe exceder los 24 kb, las líneas no significan directamente un código de bytes más grande como se menciona en la respuesta de @rick.
Ok hizo eso. Lo extraño es que, como dije, tengo contratos A y B y B es A. Cuando elimino la dependencia de B de A e implemento A, todo funciona y el contrato se implementa. Cuando copio el código de bytes y lo pego en un archivo txt, el tamaño es de 60 kb. Estoy confundido porque este error dice que no puede tener más de 24 kb. Vale la pena mencionar que cuando B es A, el tamaño del código de bytes es de 202 kb:/
github.com/ethereum/EIPs/blob/master/EIPS/eip-170.md "si la inicialización de la creación del contrato devuelve datos con una longitud de más de 0x6000 (2^14 + 2^13) bytes, la creación del contrato falla con un fuera de errores de gas". Así que verifique su código de contrato después de que se implemente, ya que no tiene un código de inicialización (constructor y todo). Probablemente debería tener menos de 24kb (14952 caracteres)
¿Alguna idea de cómo hacerlo en Remix? antes de cargar, puede verificar el código de bytes en la pestaña Compilar. Después de la implementación donde puede ver la instancia del contrato, no puedo ver dónde verificar el código de bytes del mismo (recordando que no estoy usando algún tipo de red de prueba como Rinksby donde puede usar Etherscan, solo Javascript de Remix VM).
En remix, vaya a la pestaña de detalles, busque 'objeto de bytecode en tiempo de ejecución', si tiene acceso usando web3, luego use web3.et.getCode (dirección de contrato)

Respuestas (2)

El problema del tamaño del código que informó significa simplemente que su código se compila en un programa de bajo nivel demasiado grande. Demasiados bytes en él.

Nada relacionado con gas o sin gas: simplemente es más grande de lo permitido.

Normalmente este tipo de problemas surgen con listados muy largos y/o en presencia de constantes estáticas muy grandes (matrices, tablas, etc). En ese caso, debería tener algunas unidades de software separadas (como aparentemente ya lo hizo) y reducir la cantidad de almacenamiento requerido.

PERO puede ser un problema relacionado con la remezcla de IDE. Antes de continuar, guarde sus archivos, borre el caché del navegador y reinicie el navegador. (Por cierto, Chrome parece tener una mejor relación con Remix que otros navegadores...)

Por otro lado, si está desarrollando progresivamente su código agregando nuevas funciones y probándolas antes de continuar, simplemente intente tener un paso atrás para eliminar la última función agregada y asegúrese de que el error deje de aparecer. Después de eso, simplifica todo lo que puedas.

Si el error no deja de aparecer al eliminar su último agregado, el diseño general puede ser deficiente y consumir demasiada memoria por naturaleza.

Consulte ¿Cómo calcular el tamaño de mi código de contrato? ¡Es demasiado grande para implementar ahora también!

Es importante subrayar que dividir el contrato en más de un contrato/biblioteca reduce el tamaño del código de bytes si, y solo si, se pueden implementar por separado y usted los implementa por separado. De lo contrario, el código de bytes resultante es más grande.

Compruebe también sus variables públicas: puede ser que algunas de ellas se conviertan en 'privadas'. En ese caso, el compilador no crea un captador para ellos (el resultado neto de esta intervención, en aras de la claridad, depende de muchas otras cosas... de todos modos, inténtelo).

Gracias Rick, muy útil. ¿Le importaría ver mi comentario a @ sp4c3 y aclarar esto también?
Agregué un enlace muy útil: ¡intenta leer eso!
"Es importante subrayar que dividir el contrato en más de un contrato/biblioteca reduce el tamaño del código de bytes si, y solo si, se pueden implementar por separado y usted los implementa por separado. De lo contrario, el código de bytes resultante es más grande". ¿Cómo puedo manejar eso? eso significa que debo implementar la biblioteca, obtener la dirección y luego hacer referencia a ella en mi contrato. Si es así, ¿es posible simularlo en Remix? gracias
Creo que podría ser mejor que abras una o algunas preguntas nuevas sobre el tema y trates de tener contribuciones completas de toda la comunidad. De todos modos, piense en algo como dividir su contrato moviendo funciones a un segundo contrato y llamándolos como en "otherContract.transfer (from, to, value);" o similar. Explicar esto puede ser difícil en un comentario, pero el enfoque multicontrato es ampliamente conocido.

Habilite la optimización para contratos inteligentes en remix. Tendrá éxito