> 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/chinese/an-quan-yu-kai-fa-ren-yuan/he-yue-jia-gou.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 在 NovaJury 合约上调用 `INovaJury.createCase()`，传递所有相关案件数据，包括合约 ID、各方地址、约定价格、证据 URI 和争议原因 URI。NovaCont 还调用 `INovaJury.computeDisputeFeePerParty()` 在发起转账前确定正确的费用。

**NovaJury → NovaCont：** 当裁决最终确定时，NovaJury 在 NovaCont 上调用 `settleDisputeByJury()`，传递合约 ID、案件 ID 和服务提供方的基点分配。NovaJury 还调用 `onCounterFeePaid()` 在对方当事人支付其争议费用份额时通知 NovaCont。

**访问控制：** 从 NovaJury 到 NovaCont 的所有调用都受 `onlyJuryContract` 修饰符保护——只有注册的 NovaJury 地址可以调用这些函数。对称地，从 NovaCont 到 NovaJury 的调用是创建案件的唯一方式——外部参与者无法直接向 NovaJury 注入案件。
