Как стать автором
Поиск
Написать публикацию
Обновить

Топ 5 ошибок в работе с подписью на смарт-контрактах

Стандарту EIP-712 в Ethereum не один год и даже не три. Каждый кто работает с кошельками так или иначе сталкивался с ним воочию. Основная цель стандарта заключается в улучшение пользовательского опыта, позволяя кошелькам показывать человекочитаемые данные подписи.

Однако до сих пор у разработчиков смарт-контарактов на солидити возникает уйма ошибок, которые находятся в процессе аудита. При этом ошибки настолько детские, что аудитор может их не найти только в том случае, когда аудит вообще не проводился.

1️⃣ Отсутствие поля TYPE_HASH в составе подписи

Приводит к несовместимости со стандартом EIP-712, что влечет за собой невозможность использовать классические инструменты для создания подписи.

2️⃣ Пропуск полей в TYPE_HASH при кодировании

TYPE_HASH добавили, но описали не все поля.


// Забыли поле expiredTime, но ниже поле используется
bytes32 private constant TYPE_HASH = keccak256("Order(address user,uint256 nonce)");

...

// recoverSignature(user, nonce, expiredTime);

Часто бывает и наоборот, TYPE_HASH описан правильно, но при восстановление подписи пропустили пару полей.

3️⃣ Ошибка кодирования динамических типов

Всегда нужно помнить, что поля типа string и bytes кодируются особым образом.


keccak256(args.data) // encode bytes
keccak256(abi.encodePacked(args.str)) encode string

4️⃣ Ошибка кодирования ссылочных типов

Это подобная ошибка, как и с динамическими типами, только касается массивов и структур данных.

В кодировании массивов разработчики часто забывают, что это должен быть хеш от набора байт всех элементов массива keccak256(abi.encodePacked(array)).

Для вложенных структур данных подписи дочерняя структура описывается аналогичным образом, как родительская.


keccak256(abi.encode(
    PARENT_TYPE_HASH,
    keccak256(abi.encode(
        CHILD_TYPE_HASH, 
         ... // chield fields
     )),
      ... // parent fields
))

5️⃣ Подпись не защищена от повторного использования

Зачастую подпись не должна иметь возможность быть использованной повторно.

Для того, чтобы этого не произошло в тело подписи вводится одноразовый счетчик nonce, который делает подпись уникальной. После использования подписи на смарт-контракте счетчик увеличивается.

Вывод

Я сам помню на сколько мне тяжело давалось чтение спецификации стандарта EIP-712, когда я был молодым. Я тоже допускал ошибки, поэтому призываю не осуждать).

Копнуть EIP-712 поглубже можно со мной в нашем wiki.

@pnaydanovgoo

Теги:
0
Комментарии0

Публикации

Ближайшие события