设计 ZeroClaw 架构时,最早的决策之一是如何处理扩展性。OpenClaw 已经证明了可扩展 AI 智能体的市场需求——它的 ClawHub 市场有数千个技能和活跃的生态。显而易见的路径是建类似的东西:一个带市场的插件系统。
ZeroClaw 选了相反的路。没有市场。没有运行时插件加载。扩展是编译进二进制的 Rust trait。
当时批评者说这个决定很精英主义——"你把非 Rust 开发者锁在门外了。"后来 ClawHub 供应链攻击导致 20% 的插件仓库被攻陷,批评声小了很多。
下面是这个决定背后的技术推理,以及它在实践中意味着什么。
OpenClaw 的插件模型怎么运作
OpenClaw 技能是发布到 ClawHub(一个类似 npm 的自定义注册表)的 Node.js 包。安装一个技能意味着:
- 1.从 ClawHub 下载包
- 2.安装它的 npm 依赖(可能有自己的依赖,递归下去)
- 3.用 `require()` 或 `import()` 在运行时加载 JavaScript 代码
- 4.技能在与 OpenClaw 相同的 Node.js 进程中执行
- 5.它拥有对进程环境、文件系统和网络的完整访问权限
这很方便。这也是一个每个已安装技能都被隐式信任可以访问一切的安全模型。
问题会叠加:
- •依赖树不透明。 一个有 5 个直接依赖的技能可能拉入 200 个间接依赖。逐一审计不现实。
- •运行时加载使静态分析失效。 在代码实际执行之前,你无法分析会运行什么代码。
- •没有权限边界。 检查 Docker 健康状态的技能和处理你银行 API 密钥的技能拥有相同的 OS 级权限。
- •更新不受控。 今天安全的技能明天可以发布恶意更新。语义化版本不能防止这个——npm 默认行为是自动接受 minor 和 patch 更新。
ZeroClaw 的 Trait 模型怎么运作
ZeroClaw 暴露三个扩展点,全部定义为 Rust trait:
Provider ——AI 模型后端。实现 `Provider` trait 来添加新的模型 API。
Channel ——消息平台。实现 `Channel` trait 来添加新的通信频道。
Tool ——智能体能力。实现 `Tool` trait 来赋予智能体新的能力。
每个 trait 定义了清晰的接口:扩展接收什么输入、必须返回什么输出、被授予什么能力。与 OpenClaw 模型的关键区别:这些是编译的,不是运行时加载的。
给 ZeroClaw 添加自定义扩展意味着:
- 1.写一个实现相关 trait 的 Rust 模块
- 2.添加到你的 ZeroClaw 配置中
- 3.编译包含你扩展的二进制
- 4.编译出来的二进制恰好包含你打算要的代码——不多不少
编译带来什么
编译步骤不是历史遗留也不是 UX 疏忽。它是一个安全边界。
编译时静态分析。 Rust 的类型系统和借用检查器在代码运行前就捕获了整类 bug。一个试图访问接口外内存的 provider 在编译时就会失败,而不是运行时。一个违反 trait 接口契约的扩展产生编译错误,而不是运行时崩溃。
没有间接依赖惊喜。 你的 Cargo.lock 文件锁定每个依赖的精确版本。`cargo audit` 对照 RustSec 咨询数据库检查它们。你可以用 `cargo tree` 检查完整依赖树。不像 npm 的嵌套 node_modules,Cargo 的依赖解析是确定性的且可审计的。
没有运行时代码注入。 没有 `eval()`,没有动态路径的 `require()`,没有办法让扩展加载编译时不存在的代码。运行的二进制就是编译出来的二进制。句号。
能力强制执行。 Trait 定义了扩展能做什么。一个 `Tool` trait 实现接收一个受限的执行上下文——它只能访问给它的参数并返回结果。它不会自动获得文件系统访问、网络访问或环境变量访问。这些必须在配置中显式授予。
取舍:易用性 vs 安全性
批评有道理:写一个 Rust trait 确实比写一个 JavaScript 函数难。学习曲线是真的。一个下午能写完 OpenClaw 技能的开发者,写等效的 ZeroClaw 扩展可能要一周。
ZeroClaw 用两种方式缓解这个问题:
WASM 扩展。 不想写 Rust 的开发者可以用 WebAssembly 模块。用任何能编译到 WASM 的语言(Go、C、AssemblyScript、Rust、Zig)写扩展,编译,然后以显式能力授权加载。WASM 提供了一个沙箱执行环境——模块只能访问你显式传给它的东西。
社区维护的扩展。 热门扩展(额外的 AI 后端、常用消息频道、广泛使用的工具)在 ZeroClaw 仓库本身维护。它们由维护者审查、在 CI 中测试、随官方二进制分发。没有市场,用户不需要做信任决策。
易用性差距是真的但在缩小。Rust 工具链在 2025 年有了巨大改进。Cargo、rust-analyzer 和 crate 文档生态使写 trait 实现比两年前友好得多。而且对大多数只想用支持的 provider 和 channel 来使用 ZeroClaw 的用户来说,完全不需要 Rust 知识。
ClawHavoc 证明了什么
ClawHub 攻击验证了这个架构赌注。824 个恶意技能。20% 的注册表。凭据盗窃、后门安装、跨网络横向移动。
这些攻击向量每一个都依赖插件模型:不受信任的代码、运行时加载、没有沙箱、隐式的全系统访问。它们没有一个能攻破 ZeroClaw 的 trait 模型。
一个恶意的 Rust trait 如果试图访问接口外的资源,编译就会失败。一个恶意的 WASM 模块如果没有被显式授予权限,就无法访问文件系统。没有可以投毒的市场。没有可以伪造的星标。没有可以劫持的 `postinstall` 脚本。
安全架构不是要防止每一种可能的攻击。而是让攻击的成本高于目标的价值。OpenClaw 的插件模型让攻击变得廉价且可规模化——一个恶意技能,数千个受害者。ZeroClaw 的 trait 模型让攻击变得昂贵且可控——每个目标需要专门的投入,爆炸半径被能力授权所限制。
更大的原则
插件 vs trait 的决策反映了一个更深层的选择:你想要什么样的生态。
插件市场优化增长。低摩擦发布,低摩擦安装,最大化生态扩展的表面积。当生态可信时这很好用。当它不可信时就是灾难。
基于 trait 的扩展优化完整性。更高的发布摩擦,更高的安装摩擦,但每一个存在的扩展都是被有意添加并显式授予能力的。生态增长更慢。但也不会爆炸。
AI 智能体领域正处于增长感觉比完整性更重要的阶段。ClawHavoc 提醒我们,完整性终究会追上来,而事后补救的成本总是高于从一开始就把它建进去。