Размер кода контракта (и как его обойти?)

Я пишу несколько довольно существенных смарт-контрактов Solidity и считаю, что превышаю ограничение размера байт-кода EIP170 в 24 КБ. Я уже

(a) разложил мой код на библиотеки

(b) сегодня разделил мой контракт на две части.

Кажется, ничто не помогает выйти за пределы лимита. Черт возьми, разделение на два контракта - увеличило - - серьезно - код одного из двух получившихся контрактов - намного больше, чем исходный универсальный контракт.

Существуют ли инструменты, помогающие выяснить, откуда берется раздувание кода? Другие методы разделения для уменьшения размера?

Скорее всего, из новых заявлений. Они часто создают проблемы, потому что включают код контракта, который нужно создать.
Ух ты. Откуда вы узнали об этом (или это было экспериментальным путем)? Вы абсолютно правы, и, может быть, это поможет мне вырваться из колеи! Большое спасибо! Где-то вы нашли документы по семантике того, как компилируется Solidity? Я имею в виду, на детальном уровне, подходящем для такого рода отладки?
Эксперименты, документация, исследования здесь и в Интернете в целом. Этому не учат в школе. :-) Я добавил и ответил с примером для заводского шаблона.

Ответы (2)

Скорее всего, раздувание байт-кода происходит из-за новых операторов в вашем коде. Они часто создают проблемы, потому что включают код контракта, который нужно создать. Вы можете создавать контрактные фабрики, которые вы можете развернуть впереди. Таким образом, вы можете уменьшить размер байт-кода вашего основного контракта.

Например

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();
    }
    ...
}
О, вздох. Ваша схема мне не подойдет. Мне нужно два контракта, A и B, оба из которых имеют постоянное хранилище данных, причем B имеет указатель на A. Поэтому, в отличие от вашего примера, мне нужно, чтобы Main имел постоянную копию X. Если я собираюсь передать указатель на XFactory, я мог бы просто передать указатель на X. Ах, ладно.

Можно обойти ограничение максимального размера контракта, внедрив стандарт прозрачного контракта: https://github.com/ethereum/EIPs/issues/1538 .