---
title: "Контрольный список интеграции токенов"
description: "Контрольный список того, что следует учитывать при взаимодействии с токенами"
author: "Trailofbits"
lang: ru
tags:
  - solidity
  - смарт-контракты
  - безопасность
  - токены
skill: intermediate
breadcrumb: "Интеграция токенов"
published: 2020-08-13
source: Building secure contracts
sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md
---

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

Для удобства все [утилиты](https://github.com/crytic/slither#tools) Слизер (Slither) можно запускать непосредственно на адресе токена, например:

[Руководство по использованию Слизер](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/)

```bash
slither-check-erc 0xdac17f958d2ee523a2206206994597c13d831ec7 TetherToken
```

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

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

## Общие соображения {#general-considerations}

- **Контракт прошел аудит безопасности.** Избегайте взаимодействия с контрактами, которые не прошли аудит безопасности. Проверьте продолжительность оценки (так называемый «уровень усилий»), репутацию компании, занимающейся безопасностью, а также количество и серьезность обнаруженных проблем.
- **Вы связались с разработчиками.** Возможно, вам придется предупредить их команду об инциденте. Ищите соответствующие контакты в [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).
- **У них есть список рассылки по вопросам безопасности для важных объявлений.** Их команда должна уведомлять пользователей (таких как вы!) об обнаружении критических проблем или о проведении обновлений.

## Соответствие стандартам ERC {#erc-conformity}

Слизер включает утилиту [slither-check-erc](https://github.com/crytic/slither/wiki/ERC-Conformance), которая проверяет соответствие токена многим связанным стандартам ERC. Используйте slither-check-erc, чтобы проверить следующее:

- **Функции перевода (transfer) и transferFrom возвращают логическое значение (boolean).** Некоторые токены не возвращают логическое значение для этих функций. В результате их вызовы в контракте могут завершиться ошибкой.
- **Функции name, decimals и symbol присутствуют, если они используются.** Эти функции являются необязательными в стандарте ERC-20 и могут отсутствовать.
- **Функция decimals возвращает uint8.** Некоторые токены ошибочно возвращают uint256. Если это так, убедитесь, что возвращаемое значение меньше 255.
- **Токен устраняет известное [состояние гонки ERC-20](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729).** Стандарт ERC-20 имеет известное состояние гонки, которое необходимо устранить, чтобы злоумышленники не могли украсть токены.
- **Токен не является токеном ERC-777 и не имеет вызовов внешних функций в функциях перевода (transfer) и transferFrom.** Внешние вызовы в функциях перевода могут привести к атакам повторного входа (reentrancy).

Слизер включает утилиту [slither-prop](https://github.com/crytic/slither/wiki/Property-generation), которая генерирует модульные тесты и свойства безопасности, способные обнаружить многие распространенные уязвимости ERC. Используйте slither-prop, чтобы проверить следующее:

- **Контракт проходит все модульные тесты и свойства безопасности от slither-prop.** Запустите сгенерированные модульные тесты, затем проверьте свойства с помощью [Эхидна (Echidna)](https://github.com/crytic/echidna) и [Мантикора (Manticore)](https://manticore.readthedocs.io/en/latest/verifier.html).

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

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

## Структура контракта {#contract-composition}

- **Контракт избегает ненужной сложности.** Токен должен быть простым контрактом; токен со сложным кодом требует более высоких стандартов проверки. Используйте [human-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#human-summary) от Слизер для выявления сложного кода.
- **Контракт использует SafeMath.** Контракты, которые не используют SafeMath, требуют более высоких стандартов проверки. Вручную проверьте контракт на предмет использования SafeMath.
- **Контракт имеет лишь несколько функций, не связанных с токеном.** Функции, не связанные с токеном, увеличивают вероятность возникновения проблем в контракте. Используйте [contract-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) от Слизер для общего обзора кода, используемого в контракте.
- **Токен имеет только один адрес.** Токены с несколькими точками входа для обновления баланса могут нарушить внутренний учет, основанный на адресе (например, `balances[token_address][msg.sender]` может не отражать фактический баланс).

## Привилегии владельца {#owner-privileges}

- **Токен не подлежит обновлению.** Обновляемые контракты могут со временем менять свои правила. Используйте [human-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) от Слизер, чтобы определить, является ли контракт обновляемым.
- **Владелец имеет ограниченные возможности чеканки.** Злонамеренные или скомпрометированные владельцы могут злоупотреблять возможностями чеканки. Используйте [human-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) от Слизер для проверки возможностей чеканки и рассмотрите возможность ручной проверки кода.
- **Токен нельзя поставить на паузу.** Злонамеренные или скомпрометированные владельцы могут заблокировать контракты, зависящие от токенов с возможностью паузы. Определите код, отвечающий за паузу, вручную.
- **Владелец не может занести контракт в черный список.** Злонамеренные или скомпрометированные владельцы могут заблокировать контракты, зависящие от токенов с черным списком. Определите функции черного списка вручную.
- **Команда, стоящая за токеном, известна и может быть привлечена к ответственности за злоупотребления.** Контракты с анонимными командами разработчиков или находящиеся в офшорных зонах должны требовать более высоких стандартов проверки.

## Дефицит токенов {#token-scarcity}

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

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