---
title: "Контрольний список інтеграції токенів"
description: "Контрольний список речей, які слід враховувати під час взаємодії з токенами"
author: Trailofbits
lang: uk
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) Слізер можна запускати безпосередньо за адресою токена, наприклад:

[Посібник із використання Слізер](/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.
- **Токен пом'якшує відомий [стан гонитви (race condition) 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.** Запустіть згенеровані модульні тести, а потім перевірте властивості за допомогою [Ехідна](https://github.com/crytic/echidna) та [Мантікора](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)**. Миттєве карбування може призвести до суттєвих коливань балансу та загальної пропозиції, що вимагає суворих і комплексних перевірок на переповнення під час роботи з токеном.