Как оптимизация работает на компиляторе солидности?

#solidity #truffle

Вопрос:

Я действительно не могу понять, что такое оптимизатор в солидности, в частности, параметр «работает». Я установил оптимизатор:true и оставил значение по умолчанию (200) на своем truffle-config.js. Это была настройка, которую я использовал для развертывания в eth mainnet. Я развернул токен управления erc20, токен, который будет служить в течение всего срока действия проекта. Как наличие запусков:200 влияет на стоимость газа для вызова функций токена, который будет жить годами? должен ли я был поставить более высокую оценку? но, на мой взгляд, любая ценность слишком мала для смарт-контракта, который будет жить долго. так что же повлечет за собой мой вариант в 200 долларов? Спасибо

Ответ №1:

Число запусков ( --optimize-runs ) примерно определяет, как часто каждый код операции развернутого кода будет выполняться в течение всего срока действия контракта.

Источник: https://docs.soliditylang.org/en/v0.8.10/internals/optimizer.html#optimizer-parameter-runs

Поэтому, если вы планируете использовать контракт более 200 раз за эти годы, вам может потребоваться увеличить количество запусков. Но есть компромисс-контракт, оптимизированный для большего количества (более дешевых) запусков, дороже в развертывании.

Комментарии:

1. здравствуйте и спасибо. Во всяком случае, я знаю эту часть документации. Чего я не понимаю, так это того, как это работает в реальном мире. Я попытался скомпилировать с оптимизационным запуском, установленным на 200, и получил тот же газ, используемый при развертывании, что и при установке запуска на 5000 или отключении оптимизатора. Более того, я не понимаю, как (после количества запусков) плата за газ для вызова по контракту становится выше.

2. Если вы получаете одинаковый размер байт — кода с оптимизатором и без него, я бы проверил, действительно ли вы его включаете-разница должна быть заметна. Например, убедитесь, что у вас {optimizer: {enabled: true}} в конфигурации есть и нет {optimizer: true} .

3. Что касается runs токенов ERC20 , то они, как правило, относительно просты, поэтому вполне возможно, что в вашем случае разница не будет существенной. Этот параметр влияет, например, на оптимизатор констант (вместо сохранения всего 32-байтового числа вы можете сжать его, но тогда вам потребуется больше газа для его загрузки во время выполнения), inliner (вы можете сэкономить немного газа, объединив небольшие функции в более крупные, но ваш контракт становится больше из-за дублирования) и хеширование констант keccak (дешевле вставить предварительно рассчитанный результат, но если ввод короткий, это займет больше места в байт-коде).

Ответ №2:

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

Оптимизатор солидности в основном разбивает последовательность инструкций на блоки атомарных инструкций в JUMP кодах операций s и JUMPDEST s. Он работает на сборке, так что его можно использовать и на других языках. Всегда наблюдается, что «атомарная» операция выполняется или не выполняется, но никогда не выполняется наполовину.

Таким образом, эти блоки анализируются, и каждая модификация памяти, стека или хранилища записывается в виде выражения. Эти выражения состоят из инструкции и списка аргументов, которые в основном являются указателями на другое выражение. Основная цель состоит в том, чтобы найти эквивалентные выражения и сгруппировать их в класс выражений.

В принципе, код в каждом блоке полностью восстанавливается, и на основе таких выражений строится график зависимостей. Эти выражения затем помещаются в стек в конце блока. Любая операция, которая не является частью этого графика зависимостей, по существу «удаляется». Код теперь генерируется в том порядке, в котором они присутствовали в исходном коде солидности. Это также относится к изменениям в памяти и хранилище. Наконец, все эти сгенерированные значения должны находиться в стеке в правильном месте.