> 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/shen-ji-yu-an-quan/novacont-an-quan-shen-cha.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"修饰符。由于 OpenZeppelin 的"ReentrancyGuard"使用单一的合约级锁，在一个函数执行时，进入任何其他"nonReentrant"函数都会被阻止。"disputeWork"中外部"createCase"调用之后对"dd.linkedCaseId"的写入是 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），在预言机计算使用的 8 位小数价格格式中约为 1 个单位（$0.000000005）。在实践中，这需要发生数百万次才能让任何用户或协议经历可衡量的损失。它对资金安全或资金锁定没有影响。

**低严重性**

| 发现                                       | 建议                                       |
| ---------------------------------------- | ---------------------------------------- |
| usdtToken/usdt 可以是 immutable             | 如果在构造函数中只设置一次，标记为 immutable 以节省 gas，没有缺点 |
| setJuryContract、setNovaContAddress 不发射事件 | 应添加事件以提高透明度                              |
| USDT\_DECIMALS 未使用                       | 死代码，应删除                                  |
| replaceInactiveJuror 具有高圈复杂度             | 不是功能性 bug，但建议拆分为子函数以提高可维护性和可审计性          |
| solc ^0.8.20 包含已知的编译器 bug                | 项目本身未使用 assembly/verbatim                |

**结论**

静态分析在代码库中未发现 **Critical 或 High 严重性的发现**。所有 4 个 Medium 候选项在手动审查后被关闭为"不可利用"，并在上方记录了说明。其余发现是 gas 优化、代码风格或已知并接受的设计决策。此结果不能替代独立的第三方审计，但这是对代码库当前成熟度的积极信号。
