July 19, 2021

Первый аудит NIFTSY. От Certik

NIFTSY & CERTIK

В материале рассматриваются три важных вопроса: а) эмиссия и заморозка токена NIFTSY; б) аудит смарт-контракта токена; в) краткое описание цели, задач и принципов дальнейшего его развития.

Резюме

В материале рассматриваются три важных вопроса: а) эмиссия и заморозка токена NIFTSY; б) аудит смарт-контракта токена; в) краткое описание цели, задач и принципов дальнейшего его развития.

Генезис

Итак, на блоке 12835754 состоялась полная эмиссия токенов NIFTSY, то есть 16 июля 2021 года в 04:23:36 (AM +UTC). За день до этого был напечатан на 3D-принтере первый в мире металлический мост, а за день после - ...

Кстати, а знаете, что в версии 0.4.22 компилятора Solidity инициализация немного изменилась, и первой операцией с того самого момента является не PUSH1 0x60, а PUSH1 0x8010. Поэтому, если контракт начинается с 0x60806040, очень вероятно, что этот контракт был скомпилирован компилятором версии выше или равной 0.4.22.

Возможно, это для вас ничего не значит, но из мелочей складывается полный образ: его и попробуем разобрать.

Во-первых, решили отказаться от какой-либо привязки, кроме блочной: то есть все события наступают в DAO Токена, Протокола, Оракула и Индекса только по высоте блока (изначально - в сети Эфира). Почему? Потому что DAO должно быть связано в первую очередь с onchain-закономерностями, а не оффлайн-законами. Помните Л. Лессинга и его “код - это закон”? Именно на это положение мы и ориентируемся: все даты, события - вторичны относительно тех, что происходят внутри ДРС (децентрализованных и/или распределённых систем).

Во-вторых, мы не просто взяли и эмитировали токены, но сделали предварительные расчёты, о которых ещё расскажем, которые и показали, сколько именно токенов должно быть эмитировано в одном блокчейне…

“Так, стоп: что значит - в одном блокчейне?!” - сразу же спросит пытливый исследователь NIFTSY. Объясним:

Дело в том, что NIFTSY-протокол изначально был заявлен с кросс-чейн функцией, а значит и Оракул, и Индекс должны обладать им. При этом NIFTSY - не создаёт мосты между ДРС и тем более - это не мультиблокчейн. Но как же тогда разработать заявленное?

Самый простой способ - взять некие активы (криптовалюты, взаимозаменяемые токены, NFT и прочие), обернуть их через Протокол и создать wNFT. Затем - отправить данный wNFT(x) на адрес-смарт контракта заморозки (блокировка может проводиться по времени и/или событию) и одновременно эмитировать wNFT(y) в другом блокчейне, который можно будет использовать ровно до тех пор - пока он не уйдёт на смарт-контракт заморозки, а токен wNFT(x) - будет разморожен. Второй вариант развития события - выкуп заложенной в wNFT(x) ликвидности в блокчейне, где создан wNFT(y). В этом случае механизм сложнее, но принцип действия - подобный.

В-третьих, поскольку NIFTSY - мульти-DAO, то все решения с самых первых стадий принимаются участниками: это, в частности, означает, что цена на Токен устанавливается рынком и дальше, всё, что может предложить сторона разработчиков - скидка и/или бонус, исходя из условий сотрудничества. Скажем, на первых стадиях, когда команда программистов, маркетологов, юристов и прочих специалистов не велика, явно за одно количество NIFTSY можно сделать явно больше, чем когда эта команда, как и всё сообщество, разрастается. И да, конечно же, мы можем отказаться всегда от безумного занижения и/или завышения цен на Токен: помните, что он - не спекулятивный, а сугубо утилитарный инструмент.

В-четвёртых, если зайдёте на адрес смарт-контракта Токена, то увидите две основные транзакции: а) собственно - общую эмиссию, которая была произведена на мультисиг-кошелёк DAO; б) и транзакцию начальной блокировки. О ней расскажем чуть подробней. Сначала надо пройтись по контракту: по ссылке.

Собственно, из него мы узнаём следующее:

Через локер команды LOKR (под лицензией MIT) получаем доступную сумму по индексу блокировки (LockIndex) и дальше - отправляем на адреса участников, указанные в массиве, необходимое количество токенов, которые блокируются согласно дорожной карте развития DAO NIFTSY: на 2, 4, 7, 18 и иное, установленное, количество времени. Это сделано с той же целью, что и ориентир на высоту блока как на первичное событие: чтобы к Токену было отношение именно как к продукту.

Далее, как только набираем новый массив данных от новых участников, - повторяем операции. Именно по этой причине, если сегодня (18.07.21: впрочем, статья выйдет лишь 19.07.21 - уже на другом блоке эфира) перейдёте на адрес NIFTSY-Токена, то увидите лишь 2 держателя (HODLers - как их называли бы в крипто-сообществе), хотя на самом деле держателей УЖЕ больше. Но в тонкостях разбираться может и готов не каждый, поэтому мы решили облегчить судьбу пользователей и заказали аудит смарт-контрактов самым продвинутым исследователям из Certik.

Но в тонкостях разбираться может и готов не каждый, поэтому мы решили облегчить судьбу пользователей и заказали аудит смарт-контрактов самым продвинутым исследователям из Certik.

Говорит и показывает CertiK

Сам отчёт найти не сложно - на офсайте CertiK: https://www.certik.org/projects/niftsy. Копии же хранятся в IPFS (QmX7GkY4WNcrHjH5feB1649jszeVJowxjQsaiA8CmGHWDH) и SkyNet (https://siasky.net/fAHaBcONQVLbnyBREY_AGsKjRBN5einGYSR2-nmRfTTwxw). Опять же: если вам кажется, что информация избыточна, это лишь потому, что мы придерживаемся принципов децентрализации и открытости и нам важно сохранить первоначальные сведения (данные) в чистоте, целостности и прозрачности.

Что же именно видим в отчёте?

Ошибки формата “Medium Findings” (дословно - средние выводы) говорят о наличии двух огрехов: централизации (Centralization) и логической проблеме привилегий (Privilege Logical Issue). Их и рассмотрим прежде всего.

Сразу же отметим, что статус данных ошибок “Resolved” (решено), но всё же объясним, в чём были претензии и обоснованные от аудиторов: так как они рассматривали смарт-контракты с Github (https://github.com/niftsy/niftsysmarts), то делали это до фактического развёртывания (то, что именуется - deploy) таковых в сети Ethereum.

Собственно, сама претензия по централизации звучала следующим образом: “Владелец контракта имеет право устанавливать и добиваться консенсуса сообщества”. Данная проблема не может быть решена за одну итерацию, поэтому мы приняли сразу несколько мер для увеличения (улучшения) уровня децентрализации:

  1. Первоначальный аккаунт распределения был создан как мультисиг-аккаунт: и это легко проверить по открытым данным - 0xf3eed51e11aee5d8c161e97dcbbf17030803f8c1 (там же можно найти и связку с menaskop.eth, чтобы удостовериться, что аккаунт создан CA NIFTSY).
  2. Также, как описано выше был осуществлён переход на временные (time) блокировки для держателей, чтобы уйти от порочной практики первоначальных спекуляций с токеном.
  3. Наконец, мы выбрали как раз возможность полного мониторинга токенов сообществом с самого начала: собственно, это одна из основных причин рождения данного материала.

Нужно отметить, что аудит Certik включал сразу несколько пунктов:

  1. Тестирование смарт-контрактов относительно распространённых и необычных векторов атак.
  2. Оценка кодовой базы на предмет соответствия текущей передовой практике и отраслевым стандартам.
  3. Обеспечение соответствия логики контракта спецификациям и намерениям проекта.
  4. Перекрёстное сравнение структуры и реализации контракта с аналогичными смарт-контрактами, разработанными лидерами отрасли.
  5. Тщательный построчный ручной анализ всей кодовой базы экспертами.

Поэтому сам факт отсутствия критичных и существенных (Major) замечаний можно считать достижением нашей команды разработки. Тем не менее на сегодня остались “незначительные выводы” (Minor Findings), которые также стоит раскрыть:

Первый недочёт заключается в том, что: “При обмене токенов может взиматься комиссия в будущем”. Мы остановились на том, что участники сообщества должны быть в состоянии решить вопрос монетизации Протокола (а равно и Токена, и Оракула, Индекса) и решить это самостоятельно; единственное, что мы можем сделать - это передать контроль над этими функциями на адрес multisig-DAO.

Второй же дословно звучит так: “The owner of contract has the permission to set without obtaining the consensus of the community”. Здесь уже претензия к централизованной установке консенсуса, что является неизбежным на начальной стадии развития и далее решается, как и все проблемы, описанные выше: полной передачей управления DAO. Именно поэтому статус “Решено” пока над этими заметками НЕ стоит.

Наконец, остались информационные замечания, которые всё же выделим в отдельный блок:

  1. Необходима техническая документация: на сегодня мы готовим её (https://niftsy-protocol-niftsy-1.gitbook.io/niftsy/) и сразу же - вместе с сообществом, которое, например, внесло неоценимый вклад в доработку WP. В том числе это нужно, чтобы баг-баунтисты могли выявить возможные проблемы, “которые могут возникнуть только в Solidity, например, неправильное использование private или delete”.
  2. Что же касается волатильного кода (Volatile Code), или, как ещё можно сказать на русском - “нестабильного кода”, то, как отметили сами аудиторы: “выводы о нестабильном коде относятся к сегментам кода, которые ведут себя неожиданно в определённых граничных случаях, что может привести к возникновению уязвимости”, - то есть в настоящее время, следуя рекомендациям аудиторов, а также используя инструменты автоматического анализа, мы смогли устранить все существенные замечания.

И, как и наши аудиторы, мы должны закончить дисклеймером: “Данный отчёт не следует использовать для принятия решений об инвестировании и/или участии в каком-либо конкретном проекте. Данный отчёт никоим образом не является инвестиционным советом и не должен использоваться в качестве инвестиционного совета любого рода. Данный отчёт представляет собой обширный процесс оценки, призванный помочь повысить качество кода и одновременно снизить высокий уровень риска, связанный с криптографическими токенами и технологией блокчейн”.

На этом всё и до!