Freenet 2023 代表了对去中心化基础设施的重新思考 —— 从早期版本的 "分布式硬盘" 进化为 "分布式计算机"。这一架构转变的核心在于将应用逻辑以 WebAssembly 合约的形式嵌入网络层,同时通过小世界路由算法实现无需服务器的可扩展通信。本文从工程实现角度解析其三大核心机制:无服务器路由拓扑、合约状态机模型,以及数据持久化策略。
架构定位:从存储到计算
与原版 Freenet(现 Hyphanet)专注于匿名文件存储不同,新版 Freenet 的设计目标是成为 WWW 的去中心化替代方案。其关键区别在于支持实时交互:用户可以订阅数据变更并立即收到通知,这是即时通讯、协作编辑等场景的基础能力。架构上采用 Rust 重写(原版为 Java),核心体积控制在 10MB 以内,可嵌入各类平台并通过 HTTP/WebSocket API 与外部应用交互。
Freenet 的完整应用栈包含三个安全边界明确的组件:
- Contract(合约):运行于网络中不可信节点的 WebAssembly 代码,定义共享状态的验证规则与变更逻辑
- Delegate(委托):运行于用户本地设备的 WebAssembly 模块,管理私钥与敏感操作,与网络隔离
- UI(界面):标准 Web 应用,通过 WebSocket 与本地 Kernel 通信
这种分层设计将信任边界从网络层下沉到设备层 —— 合约代码公开且状态透明,任何敏感操作必须由本地 Delegate 完成。
小世界路由:环形拓扑与 O (log n) 跳数
Freenet 的路由层采用小世界网络模型,节点按标识符在逻辑环上排列。每个节点维护与环上邻近节点的连接,同时保留少量远程 "捷径" 连接。这种结构保证任意两节点间的查找路径长度与网络规模呈对数关系,消息可在数跳内到达目标,无需中心化服务器或 DHT 维护全局路由表。
路由的目标定位基于合约键(Contract Key),即合约 WASM 代码的哈希值。状态数据作为值存储于订阅该合约的节点集合中。当用户请求某个合约状态时,路由层定位到持有该状态的节点群,而非单点,这天然提供了数据的冗余与可用性保障。
合约状态机:可交换幺半群模型
Freenet 合约的核心设计约束源于分布式系统的异步特性:不同节点可能以不同顺序接收更新。为保证最终一致性,合约状态必须构成可交换幺半群(Commutative Monoid)—— 更新操作满足交换律和结合律,无论以何种顺序应用,最终状态一致。
这一约束深刻影响了状态机的设计。合约开发者需实现以下接口:
validate_state:验证状态是否符合合约规则(如签名验证)update_state:应用增量更新(Delta)或合并完整状态summarize_state:生成状态的紧凑摘要(Summary)get_state_delta:根据远程摘要生成本地缺失的增量数据
状态同步采用摘要 - 增量机制:节点间先交换 Summary(如哈希或版本向量),接收方据此请求缺失的 Delta 数据,而非传输完整状态。这种设计使大规模状态同步的带宽消耗与变更量成正比,而非状态总量。
freenet-scaffold crate 提供的#[composable]宏可自动生成 Summary、Delta 类型及合并逻辑,降低开发者的数学建模负担。状态类型只需实现ComposableState trait,框架即处理序列化(CBOR 格式)与冲突解决。
数据持久化与执行环境
合约代码以 WASM 模块形式分发,其确定性执行特性确保所有节点对同一输入产生相同输出。合约键作为全局唯一标识,状态数据由订阅节点持久化存储。这种模型与区块链形成鲜明对比:Freenet 合约无需全局复制,仅存在于订阅该合约的节点子集,因此扩展性不受全网节点数限制。
Delegate 组件运行于本地可信执行环境,负责:
- 生成与存储私钥
- 执行签名与加密操作
- 响应 UI 的请求并生成发往合约的已签名更新
UI 层使用标准 Web 技术栈(如 Dioxus 框架编译为 WASM),通过 WebSocket 与本地 Kernel 建立连接,调用合约接口如同调用本地 API。
工程实现要点
开发 Freenet 应用需配置 Rust 工具链并添加 WASM 目标:
rustup target add wasm32-unknown-unknown
典型项目采用 Cargo Workspace 组织:
common/:共享类型定义与状态逻辑contracts/:合约实现(cdylibcrate 类型)delegates/:本地委托逻辑(可选)ui/:前端界面
构建流程通过 cargo-make 编排,生成优化后的 WASM 模块后,使用freenet publish命令将合约部署至网络,返回的合约键供用户访问应用。
本地开发可启动freenet local模式,无需连接公共网络即可测试完整交互流程。参考实现 River(去中心化聊天应用)展示了群组管理、消息同步与端到端加密的完整模式。
当前限制与设计权衡
Freenet 的架构选择伴随明确的工程约束:
- 语言锁定:合约必须用 Rust 编写并编译为 WASM,语言生态尚未扩展
- 状态建模成本:可交换幺半群要求开发者重新思考数据模型,传统 CRUD 模式需重构为基于合并的操作
- 网络成熟度:公共网络仍在积极开发中,生产部署需评估稳定性
这些约束换取的是真正的去中心化:无单点故障、无服务器运营成本、无平台审查风险。对于追求抗审查与数据主权的应用场景,这种权衡具有显著价值。
资料来源
- Freenet 官方文档与教程:https://freenet.org/build/manual/tutorial/
- Freenet FAQ 与架构说明:https://freenet.org/about/faq/
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。