Я пытаюсь найти источник того, в чем разница между оптимизированным и неоптимизированным кодом. Мой главный вопрос заключается в том, что делает неоптимизированный компилятор, особенно в смысле вызова SSTORE
опкода.
Допустим, у меня есть это:
contract A{
uint8 mem1;
uint8 mem2;
function store(uint8 store1, uint8 store2){
mem1=store1;
mem2=store2;
}
}
Когда я скомпилировал это «тупым» способом, я SSTORE
дважды вызывал, чтобы сохранить обе переменные. Однако, чтобы оптимизировать это, я бы выделил первые 8 битов uint256
( SSTORE
всегда хранит uint256
) для , mem1
а вторые 8 бит - для mem2
. Таким образом, мне нужно позвонить SSTORE
только один раз за транзакцию. Однако это может привести к небольшим накладным расходам в другом коде, который может иметь контракт, поскольку нам нужно извлечь правильные биты. SSTORE
потребляет 20 тыс. газа при сохранении ненулевого значения, поэтому оптимизация этого кода экономит 20 тыс. газа.
Вызывает ли неоптимизированный компилятор при компиляции кода SSTORE
дважды или один раз? Я знаю, что могу проверить это сам, скомпилировав и прочитав файл OPCODES
, но я хотел бы найти источник того, что должны делать оба компилятора.
Вызывает ли неоптимизированный компилятор при компиляции приведенного выше кода SSTORE дважды или один раз?
Да, неоптимизированный код вызовет SSTORE дважды. Однако второй SSTORE в том же слоте хранилища будет стоить всего 5000 газа, поскольку он только сбрасывает значение в существующем слоте. (См. « Отличается ли стоимость обновления хранилища от стоимости добавления к хранилищу? »)
Оптимизированный код будет иметь только один SSTORE.
Насколько я знаю, нет документа, точно описывающего, что делает оптимизатор. Я думаю, для этого вам нужно просмотреть код и журналы изменений.
пользователь19510
Дж. Брауэр
ивикаа
Дж. Брауэр
ивикаа
Дж. Брауэр