> For the complete documentation index, see [llms.txt](https://novacont.gitbook.io/nova-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://novacont.gitbook.io/nova-docs/novacont-docs/russian-novacont-docs/obzor-bezopasnosti-novacont.md).

# Обзор безопасности NovaCont

**Область проверки**

* NovaCont.sol
* NovaJury.sol

**Методология**

* Статический анализ: Slither v0.11.5, 101 детектор, выполнен в двух отдельных проходах компиляции.
* Каждая находка уровня Medium и выше была вручную проверена по исходному коду; случаи, когда статический анализ упустил контекст, документированы и обоснованы в отдельном разделе ниже.

| Серьёзность        | Количество | Примечание                                                                                                                                                  |
| ------------------ | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Critical / High    | 0          | -                                                                                                                                                           |
| Medium (проверено) | 0          | Все 4 кандидата проверены и закрыты как «Проверено и не эксплуатируемо» ниже, с обоснованием                                                                |
| Low                | 8          | Оптимизация immutable (2), отсутствие эмиссии событий (2), missing-zero-check (код библиотеки OZ), привязка версии solc, costly-loop, cyclomatic-complexity |
| Informational      | 110        | Соглашения об именовании (\~90), assembly/low-level-calls (код библиотеки OZ), использование timestamp, unused-state                                        |

**Находки, проверенные и признанные неэксплуатируемыми**

Четыре находки, отмеченные Slither и закрытые после ручной проверки:

**Валидация раунда оракула (unused-return)**

Slither отметил, что часть возвращаемых значений из «feed.latestRoundData()» не используется. Проверка кода подтвердила, что «getLatestTokenUSDPrice» уже реализует как проверку устаревания «updatedAt», так и проверку устаревшего раунда «answeredInRound >= roundId». Находка возникла из-за ложного срабатывания Slither на паттерне частичного отбрасывания кортежа (поле «startedAt», оставленное как «None»).

**Межфункциональная реентрантность (reentrancy-eth, reentrancy-no-eth)**

«createContract», «disputeWork», «joinJury» и «payCounterFee» содержат модификатор «nonReentrant». Поскольку «ReentrancyGuard» OpenZeppelin использует единую блокировку на уровне контракта, вход в любую другую «nonReentrant» функцию заблокирован, пока одна из них выполняется. Запись в «dd.linkedCaseId» после внешнего вызова «createCase» в «disputeWork» является паттерном, который Slither отмечает как нарушение checks-effects-interactions, но активная блокировка делает повторный вход в этом сценарии фактически невозможным.

**Неинициализированные локальные переменные (\_assignJurors.selected, \_processJurorOutcomes.voters)**

«\_assignJurors» защищена в конце цикла проверкой «require(pickedCount == JURORS\_PER\_CASE, "Not enough eligible jurors")». Если пул не содержит достаточно подходящих присяжных, функция полностью откатывается; частично заполненный массив никогда не может быть возвращён. «\_processJurorOutcomes» никогда не обращается к незаполненной части массива «voters», поскольку граница цикла строго определяется «voterCount»; слоты «address(0)» никогда не обрабатываются.

**Деление перед умножением (cancelContract, computeDisputeFeePerParty)**

В обоих местах деление происходит перед умножением. Величина затронутой суммы составляет примерно 1 wei (\~$0.000000000003) на стороне Ethereum и примерно 1 единицу в 8-десятичном формате цен, используемом для расчёта оракула ($0.000000005). На практике это должно произойти миллионы раз, прежде чем какой-либо пользователь или протокол испытает измеримые потери. Это не влияет на безопасность или блокировку средств.

**Низкая серьёзность**

| Находка                                                      | Рекомендация                                                                                           |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ |
| usdtToken/usdt могут быть immutable                          | Если устанавливаются один раз в конструкторе, пометить как immutable для экономии газа без недостатков |
| setJuryContract, setNovaContAddress не эмитируют события     | Следует добавить событие для прозрачности                                                              |
| USDT\_DECIMALS не используется                               | Мёртвый код, следует удалить                                                                           |
| replaceInactiveJuror имеет высокую цикломатическую сложность | Не функциональный баг, но рекомендуется разделение на подфункции для удобства поддержки и аудита       |
| solc ^0.8.20 содержит известные ошибки компилятора           | В самом проекте не используется assembly/verbatim                                                      |

**Заключение**

Статический анализ не выявил **находок уровня Critical или High** в кодовой базе. Все 4 кандидата уровня Medium были закрыты как «Не эксплуатируемые» после ручной проверки с документированными обоснованиями выше. Оставшиеся находки представляют собой оптимизации газа, стиль кода или уже известные и принятые проектные решения. Этот результат не заменяет независимый аудит третьей стороны, но является положительным сигналом о текущей зрелости кодовой базы.
