Перейти к основному контенту

Контрольный список интеграции токенов

solidity
смарт-контракты
безопасность
токены
Средний уровень
Trailofbits
13 августа 2020 г.
4 минут на чтение

Следуйте этому контрольному списку при взаимодействии с произвольными токенами. Убедитесь, что вы понимаете риски, связанные с каждым пунктом, и обоснуйте любые исключения из этих правил.

Для удобства все утилиты (opens in a new tab) Слизер (Slither) можно запускать непосредственно на адресе токена, например:

Руководство по использованию Слизер

slither-check-erc 0xdac17f958d2ee523a2206206994597c13d831ec7 TetherToken

Чтобы следовать этому контрольному списку, вам понадобится следующий вывод от Слизер для токена:

- slither-check-erc [target] [contractName] [optional: --erc ERC_NUMBER]
- slither [target] --print human-summary
- slither [target] --print contract-summary
- slither-prop . --contract ContractName # требует настройки, а также использования Эхидны и Мантикоры

Общие соображения

  • Контракт прошел аудит безопасности. Избегайте взаимодействия с контрактами, которые не прошли аудит безопасности. Проверьте продолжительность оценки (так называемый «уровень усилий»), репутацию компании, занимающейся безопасностью, а также количество и серьезность обнаруженных проблем.
  • Вы связались с разработчиками. Возможно, вам придется предупредить их команду об инциденте. Ищите соответствующие контакты в blockchain-security-contacts (opens in a new tab).
  • У них есть список рассылки по вопросам безопасности для важных объявлений. Их команда должна уведомлять пользователей (таких как вы!) об обнаружении критических проблем или о проведении обновлений.

Соответствие стандартам ERC

Слизер включает утилиту slither-check-erc (opens in a new tab), которая проверяет соответствие токена многим связанным стандартам ERC. Используйте slither-check-erc, чтобы проверить следующее:

  • Функции перевода (transfer) и transferFrom возвращают логическое значение (boolean). Некоторые токены не возвращают логическое значение для этих функций. В результате их вызовы в контракте могут завершиться ошибкой.
  • Функции name, decimals и symbol присутствуют, если они используются. Эти функции являются необязательными в стандарте ERC-20 и могут отсутствовать.
  • Функция decimals возвращает uint8. Некоторые токены ошибочно возвращают uint256. Если это так, убедитесь, что возвращаемое значение меньше 255.
  • Токен устраняет известное состояние гонки ERC-20 (opens in a new tab). Стандарт ERC-20 имеет известное состояние гонки, которое необходимо устранить, чтобы злоумышленники не могли украсть токены.
  • Токен не является токеном ERC-777 и не имеет вызовов внешних функций в функциях перевода (transfer) и transferFrom. Внешние вызовы в функциях перевода могут привести к атакам повторного входа (reentrancy).

Слизер включает утилиту slither-prop (opens in a new tab), которая генерирует модульные тесты и свойства безопасности, способные обнаружить многие распространенные уязвимости ERC. Используйте slither-prop, чтобы проверить следующее:

Наконец, существуют определенные характеристики, которые трудно определить автоматически. Проверьте эти условия вручную:

  • Функции перевода (transfer) и transferFrom не должны взимать комиссию. Дефляционные токены могут привести к неожиданному поведению.
  • Учитываются потенциальные проценты, полученные от токена. Некоторые токены распределяют проценты среди держателей токенов. Эти проценты могут оказаться заблокированными в контракте, если их не учесть.

Структура контракта

  • Контракт избегает ненужной сложности. Токен должен быть простым контрактом; токен со сложным кодом требует более высоких стандартов проверки. Используйте human-summary printer (opens in a new tab) от Слизер для выявления сложного кода.
  • Контракт использует SafeMath. Контракты, которые не используют SafeMath, требуют более высоких стандартов проверки. Вручную проверьте контракт на предмет использования SafeMath.
  • Контракт имеет лишь несколько функций, не связанных с токеном. Функции, не связанные с токеном, увеличивают вероятность возникновения проблем в контракте. Используйте contract-summary printer (opens in a new tab) от Слизер для общего обзора кода, используемого в контракте.
  • Токен имеет только один адрес. Токены с несколькими точками входа для обновления баланса могут нарушить внутренний учет, основанный на адресе (например, balances[token_address][msg.sender] может не отражать фактический баланс).

Привилегии владельца

  • Токен не подлежит обновлению. Обновляемые контракты могут со временем менять свои правила. Используйте human-summary printer (opens in a new tab) от Слизер, чтобы определить, является ли контракт обновляемым.
  • Владелец имеет ограниченные возможности чеканки. Злонамеренные или скомпрометированные владельцы могут злоупотреблять возможностями чеканки. Используйте human-summary printer (opens in a new tab) от Слизер для проверки возможностей чеканки и рассмотрите возможность ручной проверки кода.
  • Токен нельзя поставить на паузу. Злонамеренные или скомпрометированные владельцы могут заблокировать контракты, зависящие от токенов с возможностью паузы. Определите код, отвечающий за паузу, вручную.
  • Владелец не может занести контракт в черный список. Злонамеренные или скомпрометированные владельцы могут заблокировать контракты, зависящие от токенов с черным списком. Определите функции черного списка вручную.
  • Команда, стоящая за токеном, известна и может быть привлечена к ответственности за злоупотребления. Контракты с анонимными командами разработчиков или находящиеся в офшорных зонах должны требовать более высоких стандартов проверки.

Дефицит токенов

Проверка на наличие проблем с дефицитом токенов требует ручного анализа. Проверьте следующие условия:

  • Ни один пользователь не владеет большей частью предложения. Если несколько пользователей владеют большей частью токенов, они могут влиять на операции, основанные на распределении токенов.
  • Общее предложение достаточно. Токенами с низким общим предложением легко манипулировать.
  • Токены размещены более чем на нескольких биржах. Если все токены находятся на одной бирже, компрометация биржи может поставить под угрозу контракт, зависящий от этого токена.
  • Пользователи понимают связанные с этим риски крупных средств или мгновенных займов (flash loans). Контракты, зависящие от баланса токенов, должны тщательно учитывать злоумышленников с крупными средствами или атаки с использованием мгновенных займов.
  • Токен не позволяет мгновенную чеканку (flash minting). Мгновенная чеканка может привести к существенным колебаниям баланса и общего предложения, что требует строгих и всесторонних проверок на переполнение при работе с токеном.