Как убрать предположение о выравнивании msize в нативной EraVM
Низкоуровневый код иногда использует msize как начало нового выровненного буфера. Нативная EraVM считает рост памяти в байтах и может вернуть границу, отличающуюся от округлённой границы слов EVM.
Рассчитайте последний затронутый байт
В тесте без прежнего более высокого выделения запись 32 байт со смещения 100 затрагивает байты 100–131. Граница EraVM равна 132, а округление EVM до слова даёт 160. Сделайте эффект записи наблюдаемым: оптимизатор может убрать ненужную операцию.
mstore(100, 0)
let highWater := msize()
Если функция ожидает начало объекта на кратной 32 границе, данные могут оказаться по неожиданному смещению. Явно выровняйте указатель при таком требовании формата и соблюдайте соглашения аллокатора скомпилированного кода.
Измеряйте на фактической цели компиляции
Предварительное выделение Solidity и оптимизация могут заранее сдвинуть границу. Сравнивайте минимальные тесты с одинаковыми настройками. Различайте нативную компиляцию EraVM и EVM-байткод в интерпретаторе. docs.zksync.io ZKsync documentation