Контрольный список интеграции токенов
Следуйте этому контрольному списку при взаимодействии с произвольными токенами. Убедитесь, что вы понимаете риски, связанные с каждым пунктом, и обоснуйте любые исключения из этих правил.
Для удобства все утилиты (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, чтобы проверить следующее:
- Контракт проходит все модульные тесты и свойства безопасности от slither-prop. Запустите сгенерированные модульные тесты, затем проверьте свойства с помощью Эхидна (Echidna) (opens in a new tab) и Мантикора (Manticore) (opens in a new tab).
Наконец, существуют определенные характеристики, которые трудно определить автоматически. Проверьте эти условия вручную:
- Функции перевода (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). Мгновенная чеканка может привести к существенным колебаниям баланса и общего предложения, что требует строгих и всесторонних проверок на переполнение при работе с токеном.