> 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/bezopasnost-i-razrabotchiki/arkhitektura-kontraktov.md).

# Архитектура контрактов

Протокол NovaCont разделён на два отдельных смарт-контракта. Это разделение ответственности является намеренным — оно изолирует управление средствами от урегулирования споров, гарантируя, что сбой или обновление в одном слое не компрометирует другой.

<figure><img src="/files/xSnSpj4aaZpDJ9UCPI6L" alt=""><figcaption></figcaption></figure>

### NovaCont — Эскроу-слой

NovaCont является основным контрактом. Он отвечает за:

* Принятие и блокировку средств клиента при создании контракта
* Применение жизненного цикла соглашения через строгие переходы состояний
* Управление распределением средств при завершении, отмене или урегулировании спора
* Взаимодействие с NovaJury при передаче спора в децентрализованную систему присяжных

NovaCont наследует три базовых контракта OpenZeppelin:

**ReentrancyGuard** — Предотвращает атаки повторного входа на все функции, перемещающие средства. Каждый внешний вызов, затрагивающий балансы ETH или ERC-20, обёрнут модификатором `nonReentrant`.

**Ownable2Step** — Реализует двухэтапный механизм передачи права собственности. Новый владелец должен явно принять право собственности перед финализацией передачи, предотвращая случайную или злоумышленную передачу права собственности на недействительные адреса.

**Pausable** — Позволяет владельцу контракта приостановить все операции, изменяющие состояние, в случае критической уязвимости или чрезвычайной ситуации. Приостановка не влияет на вывод средств — пользователи всегда могут вернуть свои средства даже при приостановленном контракте.

### NovaJury — Арбитражный слой

NovaJury является контрактом урегулирования споров. Он функционирует независимо от NovaCont и отвечает за:

* Управление пулом присяжных, включая стейкинг, предупреждения, изъятия и исключение
* Получение дел о спорах, переданных NovaCont
* Сбор и распределение комиссий за споры между сторонами и присяжными
* Случайное назначение присяжных на дела и управление жизненным циклом голосования
* Возврат итоговых вердиктов в NovaCont для исполнения в сети

NovaJury наследует те же три базовых контракта OpenZeppelin — ReentrancyGuard, Ownable2Step и Pausable — по тем же соображениям безопасности.

### Как два контракта взаимодействуют

NovaCont и NovaJury взаимодействуют через набор жёстко контролируемых интерфейсов. Ни один контракт не может вызывать произвольные функции другого — доступны только конкретные, явно определённые точки входа.

**NovaCont → NovaJury:** Когда спор открывается в режиме присяжных, NovaCont вызывает `INovaJury.createCase()` в контракте NovaJury, передавая все соответствующие данные дела, включая ID контракта, адреса сторон, согласованную цену, URI доказательства и URI причины спора. NovaCont также вызывает `INovaJury.computeDisputeFeePerParty()` для определения правильной комиссии перед инициированием перевода.

**NovaJury → NovaCont:** Когда вердикт финализируется, NovaJury вызывает `settleDisputeByJury()` в NovaCont, передавая ID контракта, ID дела и распределение базисных пунктов исполнителя. NovaJury также вызывает `onCounterFeePaid()` для уведомления NovaCont о том, что противоположная сторона уплатила свою долю комиссии за спор.

**Контроль доступа:** Все вызовы от NovaJury к NovaCont защищены модификатором `onlyJuryContract` — только зарегистрированный адрес NovaJury может вызывать эти функции. Симметрично, только вызовы от NovaCont к NovaJury могут создавать дела — внешние участники не могут напрямую внедрять дела в NovaJury.
