> 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/an-quan-mo-xing.md).

# 安全模型

### 拉取支付架构

NovaCont 不会强制向接收方推送资金。相反，所有资金分配都记录为 `pendingWithdrawals` 映射中的信用，接收方明确发起自己的提款。

这是一个有意为之的安全选择。基于推送的支付系统——合约直接向接收方地址发送 ETH——如果接收方是在状态更新之前重新进入发送函数的恶意合约，则容易受到重入攻击。通过将信用步骤与提款步骤分离，NovaCont 完全消除了这种攻击面。

每个提款函数还额外受到 `nonReentrant` 修饰符的保护，作为次级防御层。

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

### 重入保护

所有与 ETH 或 ERC-20 余额交互的函数都用 OpenZeppelin ReentrancyGuard 的 `nonReentrant` 修饰符标记。此修饰符使用锁定变量确保合约中的任何函数都不能被递归调用——如果尝试重入调用，交易将立即回滚。

ERC-20 转账使用 OpenZeppelin 的 `SafeERC20` 包装器，它优雅地处理非标准代币实现，并在转账失败时回滚，而不是以错误的返回值静默成功。

### 访问控制

**所有者** — 部署地址。可以暂停合约、更新费用、注册代币、设置价格源以及管理解决方和陪审团系统配置。所有权转移需要两个步骤以防止意外转移。

**解决方** — 授权在管理员模式下解决争议的指定地址。部署时默认为所有者。可以由所有者随时更改。当陪审团系统激活时，解决方自动设置为 NovaJury 合约地址。

**onlyJuryContract** — 将某些结算函数专门限制为注册的 NovaJury 地址的修饰符。不能由所有者、解决方或任何外部参与者调用。

**基于各方的访问** — 大多数工作流函数仅限于在合约创建时注册为客户或服务提供方的特定地址。没有其他地址可以代表任何一方接受、交付、批准、提出争议或取消。

### 紧急暂停

合约所有者可以随时调用 `pause()` 来停止所有状态修改操作。这旨在作为发现漏洞或正在进行攻击时的紧急措施。

暂停时：

* 无法创建新合约
* 无法触发状态转换
* 从 `pendingWithdrawals` 提款保持完全功能——用户始终可以取回已记入的资金

合约所有者可以随时通过 `unpause()` 取消暂停。

### 已知限制与假设

**伪随机陪审员选择：** 陪审员分配使用基于 `blockhash`、`prevrandao`、`gasleft` 和递增 nonce 的链上伪随机机制。这不是密码学安全的随机性。对区块生产有足够控制权的验证者理论上可以影响陪审员选择结果。对于协议的当前规模，这种风险被认为是可接受的，但被承认为一种限制。与 Chainlink VRF 等可验证随机性解决方案的集成是潜在的未来升级。

**预言机依赖：** NovaCont 依赖 Chainlink 价格源进行保证金计算。合约在每次预言机调用时执行多重验证：验证价格大于零、轮次数据完整且价格不超过 24 小时。长时间的预言机停机或受损的价格源仍可能影响美元到代币转换的准确性，但这些多重检查显著降低了风险。

**无上诉机制：** 争议裁决——无论是由管理员还是陪审团发出——一旦在链上执行就是最终且不可逆的。没有上诉流程。用户从一开始就应以完整、有条理的证据处理争议。

**链外证据：** 证据 URI 指向链外资源。NovaCont 无法保证这些资源的永久性或完整性。提交后来变得不可访问的链接的服务提供方或客户将在任何争议评估中承担该不可访问性的后果。

#### 攻击面分析

理解智能合约最脆弱的地方与理解它做什么同样重要。以下是对 NovaCont 主要攻击面及其各自缓解措施的诚实评估。

#### **cancelContract — 所有者访问路径与交付后逻辑**

`cancelContract` 函数具有两个重要行为：

**所有者取消权限。** 合约所有者可以随时取消任何协议，无论状态或各方同意：

```
require(canCancel || msg.sender == owner(), "Cannot cancel");
```

这是一种有意为之的管理能力——它用于处理边缘情况，如受制裁地址、法律义务或需要人工干预的关键错误。但是，它代表了用户应该意识到的中心化假设。所有者发起的取消始终导致向客户全额退款，不适用任何惩罚。

#### **settleDispute — 分配验证**

管理员结算函数执行严格的不变量：

```
require(_clientRefund + _grossProviderPayment == c.totalLocked)
```

这确保总分配金额始终等于总锁定金额——结算过程中不能创建或销毁任何资金。任何未能计算锁定余额每一个 wei 的解决方案都将回滚。这是防止争议解决期间意外和恶意资金错误分配的关键正确性检查

#### **claimTimeout — 时间依赖性**

超时机制依赖 `block.timestamp` 进行 7 天窗口检查。矿工和验证者对区块时间戳有小程度的影响——通常在几秒到几分钟的范围内。对于 7 天窗口，这不是一个有意义的攻击向量，但值得注意，这是时间戳依赖逻辑的一般属性。NovaCont 不将时间戳用于秒级精度对安全至关重要的任何事情.&#x20;

### 前置运行考虑

前置运行发生在恶意行为者观察内存池中的待处理交易并提交更高 Gas 费用的自己的交易以优先处理时。

**预言机价格前置运行：** 当客户调用 `createContract` 时，ETH/USD 价格在该确切区块从 Chainlink 获取。复杂的行为者理论上可以观察待处理的 `createContract` 交易，预测包含时的预言机价格，并围绕它设计攻击。但是，这里没有有意义的可利用漏洞——客户是锁定自己资金的人，预言机价格只影响他们需要发送多少 ETH，而不是资金是否可以被盗。

**争议前置运行：** 服务提供方在内存池中看到客户的 `disputeWork` 交易，无法以对自己有利的方式对其进行前置运行——合约状态只允许开启一个争议，且争议只能在"已交付"状态下开启。没有竞争条件可以让服务提供方抢先阻止合法争议。

### ERC-20 边缘案例

**批准竞争条件：** 标准 ERC-20 `approve` 函数在技术上容易受到竞争条件的影响，花费者可以观察正在更改的批准并对其进行前置运行以花费旧的和新的限额。NovaCont 通过 `SafeERC20` 使用 `safeTransferFrom` 来降低这种风险，如果用户直接与合约而非通过应用程序界面交互，建议在增加之前将限额设置为零。

**非标准返回值：** 某些 ERC-20 代币违反 EIP-20 规范，不从 `transfer` 和 `transferFrom` 返回布尔值。OpenZeppelin 的 `SafeERC20` 包装器通过检查返回数据长度并仅在调用本身未回滚时将缺失的返回值视为成功来优雅地处理这一问题。这确保了与更广泛的代币实现的兼容性。

### 中心化风险

NovaCont 目前的形式并非完全无需信任。以下所有者能力代表用户在使用协议前应评估的中心化假设：

| 能力         | 函数                                                | 影响                           |
| ---------- | ------------------------------------------------- | ---------------------------- |
| 暂停所有操作     | `pause()`                                         | 停止合约创建和状态转换。提款不受影响。          |
| 取消任何合约     | `cancelContract()`                                | 所有者可以强制取消任何协议。客户始终获得全额退款。    |
| 更改平台费用     | `setPlatformFee()`                                | 费用最高可更改至 10%。仅影响未来结算。        |
| 更改解决方      | `setResolver()`                                   | 可以将争议解决权限重定向到任何地址。           |
| 激活或停用陪审团   | `activateJurySystem()` / `deactivateJurySystem()` | 可以随时在管理员和去中心化争议模式之间切换。       |
| 添加或删除支持的代币 | `addSupportedToken()` / `removeSupportedToken()`  | 可以扩展或限制支付选项。无法删除 ETH 或 USDT。 |
| 更新价格源      | `setPriceFeed()`                                  | 可以更改任何代币的预言机来源。恶意源可能影响保证金计算。 |

这些能力对于协议在当前开发阶段安全运行是必要的。随着协议成熟，意图是通过时间锁、多签要求和最终链上治理逐步减少所有者权限。所有者权限模型的任何变更都将提前记录和宣布。

### 审计状态

NovaCont 尚未经过正式的第三方安全审计。合约按照既定的安全最佳实践开发，并广泛使用经过审计的 OpenZeppelin 库，但正式审计的缺失意味着可能存在未知漏洞。

用户应将该协议视为实验性的，直到正式审计完成并发布其发现。请勿存入您无法承受损失的资金。

审计工作计划作为协议主网部署路径的一部分。审计报告将完整发布，并在可用时从本文档链接。
