Контрольний список інтеграції токенів
Дотримуйтесь цього контрольного списку під час взаємодії з довільними токенами. Переконайтеся, що ви розумієте ризики, пов'язані з кожним пунктом, і обґрунтуйте будь-які винятки з цих правил.
Для зручності всі утиліти (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, щоб перевірити, чи:
- Контракт проходить усі модульні тести та властивості безпеки від slither-prop. Запустіть згенеровані модульні тести, а потім перевірте властивості за допомогою Ехідна (opens in a new tab) та Мантікора (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). Миттєве карбування може призвести до суттєвих коливань балансу та загальної пропозиції, що вимагає суворих і комплексних перевірок на переповнення під час роботи з токеном.