Как найти аргумент bytes внутри calldata Ethereum

Если отсчитывать смещение от первого байта входных данных транзакции, декодер промахнётся на четыре байта. Для аргументов функции отсчёт начинается сразу после селектора.

Разберите короткий пример

Пусть в write(bytes) передают три байта aabbcc. Пропустите четырёхбайтовый селектор. Первое слово аргументов содержит 32. От начала аргументов перейдите на 32 байта вперёд: там слово длины со значением 3.

word 0 = 0x20
word 1 = 0x03
word 2 = aabbcc followed by 29 zero bytes

После длины прочитайте ровно три байта. Оставшиеся справа нули дополняют данные до целого слова. Полная кодировка аргументов занимает 96 байт при полезной нагрузке всего три байта.

Проверяйте границы до чтения

Отклоняйте усечённые данные, длины за пределами буфера и переполнение при расчёте индексов. У вложенных динамических структур смещения относятся к началу соответствующей вложенной кодировки. Единая база для всех уровней даст неверный результат. docs.soliditylang.org Solidity ABI