Обновить

✍ Топ 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

Записки из подполья незаконного архивирования фильмов

«Люди, видоизменяющие или уничтожающие художественные работы и наше культурное наследие ради прибылей или демонстрации власти — это варвары, и если законы США продолжат оправдывать такое поведение, то мы точно войдём в историю, как варварское общество.»

— Джордж Лукас, 1988 год

«Для меня её [оригинальной трилогии «Звёздных войн»] больше не существует. Я задумывал этот фильм именно так, и мне жаль, что вы увидели половину целого фильма и полюбили его.»

— Джордж Лукас, 2004 год

Ванкувер, 2011 год: мы с моей соседкой Виллой Росс сидим в одной из характерно стерильных монтажных студий Университета Саймона Фрейзера и уже не знаем, что делать: мы провели все выходные, ваяя из трёх разных копий вестерна Серджо Леоне 1966 года «Хороший, плохой, злой» одну версию — причём все три копии были незаконными рипами. В начале 2000-х этот фильм пал жертвой «реставрации», выполненной компанией MGM: вырезанные Серджо Леоне сцены были возвращены, увеличив время англоязычной версии с 161 до 179 минут; Клинт Иствуд и Илай Уоллак дублировали недостающие диалоги, а место умершего к тому времени Ли Ван Клифа занял похожий на него голосом дублёр. Монофоническая дорожка была переработана в многоканальный звук с неприятно современными звуками выстрелов. Почти десяток лет эта «дополненная» лента оставалась единственной продаваемой версией фильма; подобное очень часто происходит в эпоху ревизионистских студийных реставраций.

Наша цель была простой: спасти фильм от этой вивисекции. Мы планировали соединить звук уже не издававшегося DVD 1998 года (приблизительно похожий на звук международного релиза 1967 года) с видео из недавно привезённого Blu-ray итальянской версии. После того, как мы успешно преодолели многочисленные подводные камни, связанные с риппингом домашних видеозаписей конца 2000-х, наши надежды рухнули из-за катастрофического открытия: итальянская версия оказалась ещё сильнее отличающейся от международной, чем расширенная версия: печально известная сцена пытки была полностью перестроена, а у некоторых кадров отсутствовали начало и конец. Мы почти на десяток лет отказались от этой затеи.

Записки из подполья незаконного архивирования фильмов

Публикации