Как выглядит #аудит #смарт_контракта?
Часто спрашивают или заказчики или молодые команды разработки.
Ниже пример реального отчета по аудиту кода одного из контрактов.
Естественно без имен.
Берите на вооружение.
***
[Что и как делаем]
Код контракта просматривается вручную на наличие известных уязвимостей, ошибок в логике, соответствие WhitePaper. При необходимости на сомнительные моменты пишутся юнит тесты.
***
🔥 [КРИТИЧНЫЕ]
не выявлено
***
❗ [СЕРЬЕЗНЫЕ]
1.
В технических характеристиках токена указано, что контракт токена должен иметь функцию «сожжения». Такая функция реализована, но сжигать можно только свои собственные токены. Судя по тех. характеристикам (остаток нераспроданных токенов можно будет вручную «сжечь» в конце всех мероприятий) должна быть функция сжигания токенов организаторами. Таким образом в текущей версии контракта нераспроданные токены останутся на контракте crowdsale без возможности вывода.
***
📣 [ПРЕДУПРЕЖДЕНИЯ]
1.
В используемой версии контракта StandardToken из библиотеки Zeppelin Solidity была найдена ошибка ошибка
https://github.com/OpenZeppelin/zeppelin-solidity/issues/375 , позволяющая генерировать ложное событие о переводе самому себе любого количества токенов, даже превышающющего имеющиеся.
2.
Вероятно, в формуле лишнее деление на 1 ether. при текущей формуле, чтобы установить цену токена в 1 доллар, нужно вызвать метод setRate с параметром 300*10^18. Лучше реализовать rate без такого количества нулей, чтобы было меньше возможностей ошибиться.
3.
Рекомендуем добавить также генерацию события:
Transfer(burner, 0, _value);
для того, чтобы кошельки, etherscan.io и прочие клиенты увидели факт изменения баланса. Без этого, многие инвесторы просто не увидят свои токены в кошельках.
Похожая проблема есть и в конструкторе токена,
Transfer(0, ADDRESS_FOR_TOKENS, INITIAL_SUPPLY);
***
💡 [ЗАМЕЧАНИЯ]
1. Используется не самая последняя версия библиотеки Zeppelin Solidity. Изменения в новой версии:
исправлена ошибка в ф-ции transferFrom контракта StandardToken (см. п.1. предупреждений)
в функциях контрактов явно указаны модификаторы видимости
оптимизация в функции mul из SafeMath, немного уменьшающая потребление газа
в контрактах BasicToken, StandardToken, BurnableToken в функциях transfer, transferFrom и burn добавлены проверки входных параметров, не сжигающие весь газ при неудаче: проверка на перевод на нулевой контракт и на то, что значение для перевода/сжигания меньше баланса и допустимой для перевода суммы
2.
Поле digits в токене обычно делают типа uint8, это поле не описано в ERC20, но было предложено в ERC223 (
https://github.com/ethereum/eips/issues/223). В примере на ethereum.org (
https://ethereum.org/token) и в библиотеке Zeppelin Solidity в примере (
https://github.com/OpenZeppelin/zeppelin-solidity/pull/490) используется именно uint8
Реализовано в<Ссылка>
3. <Ссылка>
В технических характеристиках токена указано, что контракт токена должен иметь такие функции как «Передача прав владельца» и «Являются Ownable». Для контракта токена это не сделано, но может понадобиться, если будет добавлена функция сжигания токенов в контракте самого токена.
4. В механике работы контракта есть упоминание «срока годности» контракта (который составляет 365 дней). Это не реализовано.
5. В комментариях к тех. описанию написано, почему не была реализована подпись тремя людьми действий с контрактами. Обычно, чтобы эти минусы были неактуальны, делают возможным совершать действия, подписанные не всеми владельцами. Например, подписанные двумя владельцами из трех.
6. В комментариях к тех. описанию написано, почему не было реализовано распределение средств на кошельки. Но узнать баланс любого адреса довольно просто:
http://solidity.readthedocs.io/en/develop/units-and-global-variables.html#address-related7. <Ссылка>
Нет проверки на количество переданного эфира, можно купить 0 токенов.
8. <Ссылка>
Заглушки ADDRESS_FOR_TOKENS, ADDRESS_FOR_ETH, START_DATETIME — плохая практика, т.к. потребует модификации кода перед развертыванием, что чревато ошибками.
9. <Ссылка>
modifier onlyOwner избыточен в Crowdsale
10. <Ссылка>
Бессмысленная строчка. Кроме того, rate по-умолчанию равняется 0 и его установка не контролируется перед/во время начала crowdsale — это чревато тем, что если забыть или не успеть его установить, пройдут платежи, за которые будет начислено по 0 токенов.
Необходимо указать в инструкции о необходимости задать rate в этой строке до деплоя контракта и выделить визуально.
Реализовано в <Ссылка>
👉👉👉 Пишите ЛС.
Если что ... )))