Skip to content

VMGuardian ​

VMGuardian 审计 WebAssembly 字节码。它在三个地方以同一份代码运行,因此合约在任何地方得到的分数都相同:

位置时机
浏览器(WASM 模块)在你发送部署之前即时运行
每个验证者,在共识中每一笔部署交易——即关卡
每个节点,在后台持续运行,覆盖每个已部署的合约

分数如何得出 ​

1. 规则(启发式) ​

分析器逐条指令解码代码段(单次线性扫描,因此即使是 512 KiB 的合约也能快速分析),并检查五种模式。每次命中都会增加风险;总和上限为 1.0。

规则严重程度增加触发条件
reentrancy严重0.40动态 call_indirect 之后紧跟存储写入
uncapped_loop严重0.35没有条件分支可以跳出的循环
unbounded_memory警告0.20超过 8 条 memory.grow 指令
unchecked_call警告0.15结果被丢弃的调用
large_import_surface信息0.10导入超过 20 个宿主函数

低于 0.5 的分数报告为 safe。

2. 神经网络 ​

一个小型内置网络(10 个输入 → 32 → 16 → 1,897 个参数)根据十个特征为同一字节码评分:无上限循环的占比、重入模式、被丢弃的调用、memory.grow、导入、间接调用、存储写入、循环和算术运算的密度,以及代码大小。它在节点内部运行,不需要任何 ML 运行时。

3. 融合 ​

if |network − rules| > 0.25:   risk = rules                 (model: "heuristic")
else:                          risk = 0.3 × network + 0.7 × rules   (model: "ml+heuristic")

网络的权重较小,并且在与规则严重不一致时被忽略——它主要基于合成数据以及来自某条公共 CosmWasm 链的真实安全合约训练,在获得真实漏洞利用数据之前,还不能给予更多信任。

各处显示的安全分数为 100 − risk × 100。

部署关卡 ​

每个验证者都会对每笔部署交易运行关卡——参见部署合约:

情形结果
字节码哈希在受信任列表中(如 NRC-20 等官方模板)分数 100,不做分析
关卡已被治理关闭(deploy_security_enabled = 0)中性分数 70
risk ≥ deploy_risk_threshold(默认 0.80)部署失败,不收费;连同违规项写入日志;计入 nc_deploy_rejected_total
其他情况创建合约并记录其分数

自行检查合约 ​

bash
curl -s -X POST "$NODE_RPC/api/v1/contracts/analyze" \
  -H 'Content-Type: application/json' -d "{\"bytecode_hex\":\"$HEX\"}"
json
{
  "risk_score": 0,
  "security_score": 100,
  "safe": true,
  "ml_score": 0.439,
  "model": "heuristic",
  "violations": [],
  "gas_estimate": 34550
}

(这里网络给出 0.44,而规则给出 0,因此仅由规则决定。)

通过 gateway 时,请使用 POST /api/v1/contracts/audit,请求体相同。gateway 从不自行为合约评分;它只转发给节点。

签名证明 ​

POST /api/v1/contracts/attest 运行同样的分析,并用节点的 ML-DSA-65 密钥对结果签名:

json
{
  "score": 100,
  "risk_score": 0,
  "bytecode_hash": "18642df0…",
  "timestamp": 1791200887,
  "signature": "665a7ab2…",
  "pubkey": "6e80bab8…",
  "model": "heuristic",
  "ml_score": 0.439,
  "violations": []
}

被签名的消息为 "nc-attest|" ‖ score(4 字节,大端序) ‖ SHA3-256(bytecode)(32 字节) ‖ timestamp(8 字节,大端序)。浏览器用与钱包相同的 WASM 模块验证它,随后部署页面显示经过证明的分数。

证明能说明是哪个节点计算了分数。在无需信任节点的前提下证明分数计算正确,是下文 ZKML 工作的目标。

证书 ​

合约按分数获得链上安全证书:

等级分数
Gold90 及以上
Silver75 – 89
Bronze低于 75

证书是创世时部署的系统合约 ncert.app 中的记录,并为 API 建立了索引:GET /api/v1/certificates、/certificates/:id、/certificates/contract/:address。

持续监控 ​

每个节点每隔 MONITOR_INTERVAL_SECS(20 秒)重新分析已部署的合约。当分数变化达到 MONITOR_SCORE_THRESHOLD(10)分或以上时——通常发生在新模型版本激活之后——节点通过共识发出证书更新,预言机日志记录 score_degraded 或 score_improved。

gateway 在此之上还提供活动告警(通过 WebSocket 发送 contract_alert):异常的调用激增,以及开始被调用的低分合约。

模型版本 ​

模型权重在链上进行版本管理,因此所有验证者运行同一个模型:

  1. 某个验证者注册一个新版本(POST /api/v1/models/register,仅限验证者)——它进入为期 2 000 个区块的 voting 状态。
  2. 其他验证者通过 P2P 获取权重,将其哈希与注册信息核对,然后确认。
  3. 获得 2f + 1 个验证者的确认后,该版本变为 active 并替换前一个版本;否则在截止时变为 rejected。

注册表:GET /api/v1/models/registry。Prometheus:nc_model_active_count、nc_model_voting_count、nc_model_version{…}。

可验证 AI 实验性 ​

计划是用零知识虚拟机(RISC Zero / SP1)证明 VMGuardian 的结果:证明该分数就是链所批准权重下的 analyze_v2(bytecode),任何人——包括另一条链——都可以在不信任任何节点的情况下验证。这些模型足够小,使这一方案切实可行。

测试情况: 设计和证明器脚手架已在仓库中(docs/zkml-poc.md、neurochain/zkml/)。构建证明器需要 RISC Zero / SP1 工具链,而它尚未在项目的构建环境中运行过;目前还没有链上验证。

局限 ​

  • 仅基于合成数据和真实的安全合约训练——尚未见过 WASM 中的真实漏洞利用。
  • 目前尚不提供发现项的字节偏移和自定义规则集。
  • 干净的分数意味着未发现已知的风险模式,而不代表合约是正确的。