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

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

solidity
смарт-контракти
безпека
токени
Середній рівень
Trailofbits
13 серпня 2020 р.
4 хвилин на читання

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

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

Посібник із використання Слізер

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.
  • Токен пом'якшує відомий стан гонитви (race condition) 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). Миттєве карбування може призвести до суттєвих коливань балансу та загальної пропозиції, що вимагає суворих і комплексних перевірок на переповнення під час роботи з токеном.