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

Контрольний список для інтеграції токенів

мова програмування
Смарт-контракти
захист
токени, лексеми
Середнячок
Trailofbits
13 серпня 2020 р.
4 читається за хвилину

Дотримуйтеся цього контрольного списку під час взаємодії з довільними токенами. Переконайтеся, що ви розумієте ризики, пов'язані з кожним пунктом, і обґрунтовуйте будь-які винятки із цих правил.

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

Посібник із використання Slither

slither-check-erc 0xdac17f958d2ee523a2206206994597c13d831ec7 TetherToken

Щоб дотримуватися цього контрольного списку, вам знадобиться цей вивід від Slither для токена:

- slither-check-erc [target] [contractName] [optional: --erc ERC_NUMBER]
- slither [target] --print human-summary
- slither [target] --print contract-summary
- slither-prop . --contract ContractName # вимагає налаштування та використання Echidna і Manticore

Загальні міркування

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

Відповідність стандарту ERC

Slither містить утиліту slither-check-erc (opens in a new tab), яка перевіряє відповідність токена багатьом пов’язаним стандартам ERC. Використовуйте slither-check-erc, щоб перевірити, що:

  • Функції transfer і transferFrom повертають логічне значення. Деякі токени не повертають логічне значення для цих функцій. В результаті їхні виклики в контракті можуть завершитися невдачею.
  • Функції name, decimals і symbol присутні, якщо вони використовуються. Ці функції є необов'язковими в стандарті ERC20 і можуть бути відсутніми.
  • Функція decimals повертає uint8. Кілька токенів неправильно повертають uint256. Якщо це так, переконайтеся, що повернуте значення менше 255.
  • Токен пом'якшує відомий стан гонитви ERC20 (opens in a new tab). Стандарт ERC20 має відомий стан гонитви, який необхідно пом'якшити, щоб зловмисники не могли вкрасти токени.
  • Токен не є токеном ERC777 і не має зовнішнього виклику функцій у transfer і transferFrom. Зовнішні виклики у функціях переказу можуть призвести до повторного входу (reentrancy).

Slither включає утиліту 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) від Slither, щоб виявити складний код.
  • Контракт використовує SafeMath. Контракти, які не використовують SafeMath, вимагають вищого стандарту перевірки. Перевірте контракт вручну на предмет використання SafeMath.
  • Контракт має лише кілька функцій, не пов’язаних із токенами. Функції, не пов’язані з токенами, збільшують імовірність виникнення проблеми в контракті. Використовуйте contract-summary printer (opens in a new tab) від Slither для загального огляду коду, що використовується в контракті.
  • Токен має лише одну адресу. Токени з кількома точками входу для оновлення балансу можуть порушити внутрішній облік на основі адреси (наприклад, balances[token_address][msg.sender] може не відображати фактичний баланс).

Привілеї власника

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

Дефіцитність токенів

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

  • Жоден користувач не володіє більшою частиною пропозиції. Якщо кілька користувачів володіють більшістю токенів, вони можуть впливати на операції на основі розподілу токенів.
  • Загальна пропозиція достатня. Токенами з низькою загальною пропозицією можна легко маніпулювати.
  • Токени розміщені на кількох біржах. Якщо всі токени знаходяться на одній біржі, компрометація цієї біржі може скомпрометувати контракт, що залежить від токена.
  • Користувачі розуміють пов'язані ризики великих коштів або флеш-позик. Контракти, що залежать від балансу токенів, повинні ретельно враховувати зловмисників із великими коштами або атаки за допомогою флеш-позик.
  • Токен не дозволяє флеш-карбування. Флеш-карбування може призвести до значних коливань балансу та загальної пропозиції, що вимагає суворих і всебічних перевірок на переповнення під час операцій із токеном.

Останні оновлення сторінки: 21 жовтня 2025 р.

Чи була ця інструкція корисною?