Как отклонить чрезмерное смещение calldata в нативной EraVM
Некоторые ABI-декодеры намеренно читают calldata по огромному смещению ради нулевого слова. При нативной компиляции EraVM такой приём может вызвать панику из-за ограничения диапазона.
Проверьте смещение до загрузки
Правила совместимости нативной инструкции указывают на панику при calldataload со смещением больше 2^32 минус 33. Второе значение примера выше порога на единицу. Отклоните такой вход до выполнения assembly.
largest documented safe CALLDATALOAD offset = 2^32 - 33
probe offset = 2^32 - 32
Проверяйте сложения и длины в достаточно широком целом типе. Входное смещение может переполниться при арифметике и внешне попасть в допустимую область. Проверяйте фактическую длину входа отдельно от максимума VM.
Испытайте скомпилированный декодер
Добавьте тесты около границы и обычные усечённые данные. Тест на стандартной Ethereum VM не проверяет нативную компиляцию этой инструкции. В диагностике различайте прикладную ошибку и панику VM. docs.zksync.io ZKsync documentation