联邦学习(FL)
Savitri Network 包含一个用于去中心化 AI 模型训练的链上联邦学习系统。FL 合约管理模型注册、训练轮次、更新提交、奖励分发和治理。
架构
Governance (proposals + voting)
│
▼
Model Registry
│ register model, assign roles, version tracking
▼
Job Lifecycle
│ create round → open → submit updates → seal → finalize
▼
Reward Pool
│ Merkle-proof reward claims
▼
Trainers + Aggregators
模型注册表
模型以元数据、版本控制和基于角色的访问控制方式在链上注册。
模型注册
// Register a new model
FlModelRegistry::register_model(
&mut storage,
&db,
&creator, // [u8; 32] - model creator address
"sentiment-v1", // model name
"ipfs://Qm.../meta", // metadata URI
"MIT", // license URI
"ipfs://Qm.../weights", // initial weights URI
&mut events,
Some(&mut gas),
)?;
模型版本管理
模型具有不可变的版本链,每个新版本引用其父版本:
v1 (initial) → v2 (fine-tuned) → v3 (production)
版本元数据包括:
metadata_uri:模型架构描述weights_uri:训练权重位置aggregator:产生该版本的地址parent_version:链接到上一版本
基于角色的访问控制(RBAC)
| 角色 | 权限 |
|---|---|
Creator | 注册模型、管理版本、设置策略 |
Viewer | 读取模型元数据和版本 |
Trainer | 向轮次提交训练更新 |
Aggregator | 聚合更新、完成轮次、生成版本 |
训练者访问通过每个模型的允许名单/拒绝名单控制。
策略管理
每个模型具有可配置的策略:
| 策略 | 描述 |
|---|---|
access_policy_hash | 谁可以访问模型数据 |
reward_policy_hash | 奖励如何分发 |
max_trainers | 最大并发训练者数量 |
aggregator_whitelist | 已批准的聚合者 |
任务生命周期
FL 训练以具有固定生命周期的轮次为单位组织:
Planned → Open → Sealed → Finalized
↘ Aborted (via governance)
轮次状态
| 状态 | 描述 | 允许的操作 |
|---|---|---|
Planned | 轮次已创建,尚未接受更新 | Open |
Open | 接受训练者更新 | 提交更新、Seal |
Sealed | 不再接受更新,聚合进行中 | Finalize、Abort |
Finalized | 奖励已分发,轮次完成 | 领取奖励 |
Aborted | 轮次通过治理取消 | 无 |
创建轮次
FlJobLifecycle::create_round(
&mut storage,
&db,
&creator,
&model_id, // [u8; 32]
round_id, // u64
reward_pool_amount, // u128
&mut events,
Some(&mut gas),
)?;
提交训练更新
训练者在 Open 阶段提交模型更新:
FlJobLifecycle::submit_update(
&mut storage,
&db,
&trainer, // [u8; 32]
&model_id,
round_id,
&update_data, // training update bytes
nonce, // replay protection
&mut events,
Some(&mut gas),
)?;
重放保护:每个训练者拥有每轮次的随机数,必须严格递增。
封闭与完成
// Seal round (stop accepting updates)
FlJobLifecycle::seal_round(&mut storage, &db, &aggregator, &model_id, round_id, ...)?;
// Finalize round (distribute rewards)
FlJobLifecycle::finalize_round(
&mut storage, &db, &aggregator, &model_id, round_id,
&merkle_root, // reward distribution Merkle root
&new_weights_uri, // aggregated model weights
...
)?;
领取奖励
训练者使用 Merkle 证明领取奖励:
FlJobLifecycle::claim_reward(
&mut storage, &db, &trainer, &model_id, round_id,
amount, // reward amount
&merkle_proof, // proof of inclusion in reward distribution
...
)?;
国库费用
可配置的百分比(fee_treasury_bps,最大 10000 = 100%)从奖励池中扣除用于网络国库。计算使用定点算术以防止舍入误差。
FL 治理提案
FL 专项治理操作:
SetFlPolicy
提议修改 FL 参数:
ProposalAction::SetFlPolicy {
fee_treasury_bps: 500, // 5% treasury fee
max_models: 100, // max registered models
aggregator_whitelist: vec!["addr1", "addr2"],
}
验证:fee_treasury_bps <= 10000,max_models > 0,白名单不为空。
ApproveFlModel
批准模型用于生产:
ProposalAction::ApproveFlModel {
model_id: "abc123...64hex", // 32-byte hex model ID
}
AbortFlRound
紧急中止活跃训练轮次:
ProposalAction::AbortFlRound {
model_id: "abc123...64hex",
round_id: 5,
}
验证:round_id > 0,有效的 32 字节 model_id。
存储布局
FL 合约使用从 100 开始的存储槽:
| 槽范围 | 用途 |
|---|---|
| 100+ | 模型元数据 |
| 200+ | 版本链 |
| 300+ | 轮次状态 |
| 400+ | 更新提交 |
| 500+ | 奖励池 |
| 600+ | 角色映射 |
通过 SDK 集成
use savitri_sdk::{TransactionBuilder, GovernanceAction};
// Create FL governance proposal
let tx = TransactionBuilder::new()
.create_fl_proposal(
"governance_contract_address",
"Approve sentiment model v2",
"Production-ready model with 95% accuracy",
604800, // 7-day voting period
)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;