Что такое ABI-кодирование?
ABI-кодирование — это правило из спецификации ABI контрактов Solidity, по которому вызов функции превращается в байты: 4-байтный селектор, за которым следуют аргументы, упакованные в 32-байтные слова; статические значения располагаются inline, а динамические (bytes, строки, динамические массивы) — после заголовка (head), в котором хранятся их байтовые смещения. ABI-кодировщик собирает такую calldata из сигнатуры и значений; декодер делает обратное.
Как устроена раскладка
Для f(uint256,uint32[],bytes10,bytes), вызванной с (0x123, [0x456, 0x789], "1234567890", "Hello, world!"), кодирование выглядит так: селектор 0x8be65246, затем заголовок из четырёх слов (uint256, смещение 0x80 к массиву, bytes10 с дополнением справа, смещение 0xe0 к bytes), затем хвост (tail): длина массива 2 и два его элемента, потом длина bytes 13 и дополненные данные. Нажмите «f() из документации Solidity» выше, чтобы увидеть разбор по словам.
Правила вкратце
- Каждое значение занимает кратное 32 байтам. Целые числа и адреса дополняются слева,
bytesN— справа. - Отрицательные целые используют дополнительный код в 256 битах.
- На динамические значения ссылаются через байтовые смещения, отсчитываемые от начала тела охватывающего кортежа или массива.
- Статический массив
T[k]статическогоTрасполагается inline; динамический массивT[]начинается со своей длины. - Кортежи рекурсивно следуют тому же правилу head/tail — так кодируются структуры и вложенные массивы.
Наглядный пример: перевод ERC-20
transfer(address,uint256) с получателем 0x1111111111111111111111111111111111111111 и 25 USDT (25 000 000 сырых единиц) кодируется в 68 байт: селектор a9059cbb, затем 12 нулевых байт дополнения слева и 20-байтный адрес, затем 25 000 000 = 0x17d7840, дополненное слева до 32-байтного слова. Каждый перевод ERC-20 в любом обозревателе имеет ровно такую форму, поэтому декодер может назвать функцию и восстановить аргументы по одному лишь селектору.
См. также
Вычисляйте селекторы отдельно в инструменте селекторов функций; переводите суммы токенов в сырые целые числа в конвертере decimals токенов; разбирайте отдельные слова в конвертере hex в десятичные.