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 |
| 其他情况 | 创建合约并记录其分数 |
自行检查合约
curl -s -X POST "$NODE_RPC/api/v1/contracts/analyze" \
-H 'Content-Type: application/json' -d "{\"bytecode_hex\":\"$HEX\"}"{
"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 密钥对结果签名:
{
"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 工作的目标。
证书
合约按分数获得链上安全证书:
| 等级 | 分数 |
|---|---|
| Gold | 90 及以上 |
| Silver | 75 – 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):异常的调用激增,以及开始被调用的低分合约。
模型版本
模型权重在链上进行版本管理,因此所有验证者运行同一个模型:
- 某个验证者注册一个新版本(
POST /api/v1/models/register,仅限验证者)——它进入为期 2 000 个区块的voting状态。 - 其他验证者通过 P2P 获取权重,将其哈希与注册信息核对,然后确认。
- 获得
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 中的真实漏洞利用。
- 目前尚不提供发现项的字节偏移和自定义规则集。
- 干净的分数意味着未发现已知的风险模式,而不代表合约是正确的。