Tamaño del código del contrato (¿y cómo evitarlo?)

Estoy escribiendo algunos contratos inteligentes de Solidity bastante sustanciales, y creo que estoy alcanzando el límite de tamaño de código de bytes de 24k EIP170. yo ya

(a) factorizó mi código en bibliotecas

(b) hoy dividí mi contrato en dos partes.

Nada parece estar ayudando a llegar por debajo del límite. Diablos, dividir en dos contratos -aumentó- -severamente- el código de uno de los dos contratos resultantes, mucho más grande que el contrato todo en uno original.

¿Existen herramientas que ayuden a averiguar de dónde proviene el exceso de código? ¿Otros métodos de fraccionamiento para reducir el tamaño?

Probablemente de las nuevas declaraciones. A menudo son los creadores de problemas porque incluyen el código del contrato que se va a instanciar.
Oh, vaya. ¿Dónde aprendiste esto (o fue por experimentación)? Tienes toda la razón, ¡y tal vez esto me ayude a despegarme! ¡Muchas gracias! ¿Hay algún lugar en el que haya encontrado documentos sobre la semántica de cómo se compila Solidity? Quiero decir, ¿a un nivel detallado adecuado para este tipo de depuración?
Experimentación, Documentación, Investigación aquí y en internet en general. No se enseña en la escuela. :-) He agregado y respondido con un ejemplo para el patrón de fábrica.

Respuestas (2)

Lo más probable es que la hinchazón del código de bytes provenga de las nuevas declaraciones en su código. A menudo son los creadores de problemas porque incluyen el código del contrato que se va a instanciar. Puede crear fábricas por contrato que puede implementar en el frente. De esta manera, puede reducir el tamaño del código de bytes de su contrato principal.

P.ej

contract X {}

contract XFactory {
    function createX() returns (X) {
        return new X();
    }
}

contract Main {
    XFactory xFactory;
    ...
    Main(XFactory _xFactory) {
        xFactory = _xFactory;
    }
    ...
    function someMethod() {
        X x = xFactory.create();
    }
    ...
}
Oh, suspiro. Su patrón no funcionará para mí. Necesito dos contratos, A y B, los cuales tienen almacenamiento de datos persistente, y B tiene un puntero a A. Entonces, a diferencia de su ejemplo, necesito que Main tenga una copia persistente de X. Si voy a pasar un puntero a XFactory, también podría pasar un puntero a X. Ah, bueno.

Es posible sortear la limitación del tamaño máximo del contrato implementando el Estándar de contrato transparente: https://github.com/ethereum/EIPs/issues/1538