Как отклонить чрезмерное смещение 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