Skip to content

去中心化存储系统 ​

版本: v3.3.0 | 状态: ✅ 生产就绪 | 5 IPC Handlers | 2 数据库表 | Filecoin + P2P CDN + IPLD

概述 ​

去中心化存储系统集成 Filecoin 持久化存储、P2P 内容分发网络和 IPLD DAG 版本管理,为用户数据提供持久且高可用的去中心化存储方案。支持存储交易创建与管理、存储证明自动验证、热内容多节点缓存加速以及基于 IPLD 有向无环图的内容版本控制。

核心特性 ​

  • 💾 Filecoin 存储交易: 创建和管理存储交易,支持验证交易和自动续期
  • ✅ 证明验证: 自动验证存储证明,确保数据完整性
  • 🌐 P2P 内容分发: 热内容自动缓存到多个对等节点,加速访问
  • 📋 IPLD DAG 版本管理: 基于 IPLD 有向无环图的内容版本控制
  • 📊 存储统计: 交易数量、总存储量、成本追踪

创建存储交易 ​

javascript
const result = await window.electron.ipcRenderer.invoke(
  "dstorage:store-to-filecoin",
  {
    cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
    sizeBytes: 1048576, // 1MB
    minerId: "f01234",
    durationEpochs: 518400, // ~6 个月
  },
);
// result.deal = {
//   id: "uuid",
//   cid: "bafybeig...",
//   miner_id: "f01234",
//   status: "active",
//   price_fil: 1.048576,
//   verified: 1,
// }

分发内容到 P2P 网络 ​

javascript
const result = await window.electron.ipcRenderer.invoke(
  "dstorage:distribute-content",
  {
    cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
    peerCount: 5, // 分发到 5 个对等节点
  },
);
// result.result = {
//   id: "uuid",
//   content_cid: "bafybeig...",
//   cached: 1,
//   peer_count: 5,
// }

查询版本历史 ​

javascript
const result = await window.electron.ipcRenderer.invoke(
  "dstorage:get-version-history",
  "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
);
// result.versions = [
//   { id, content_cid, version: 3, parent_cid: "...", dag_structure: {...} },
//   { id, content_cid, version: 2, parent_cid: "...", dag_structure: {...} },
//   { id, content_cid, version: 1, parent_cid: null, dag_structure: {...} },
// ]

系统架构 ​

┌──────────────────────────────────────────────────┐
│              去中心化存储系统                       │
│                                                    │
│  ┌──────────────┐    ┌─────────────────────────┐  │
│  │ Filecoin     │    │   Content Distributor    │  │
│  │ Storage      │    │                          │  │
│  │ 存储交易管理  │    │ P2P CDN + 热内容缓存     │  │
│  │ 证明验证      │    │ IPLD DAG 版本管理        │  │
│  └──────┬───────┘    └──────────┬───────────────┘  │
│         │                       │                   │
│  ┌──────┴───────────────────────┴───────────────┐  │
│  │        IPC Layer (5 handlers)                  │  │
│  └────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────┘

IPC 接口完整列表 ​

去中心化存储操作(5 个) ​

通道功能说明
dstorage:store-to-filecoin创建 Filecoin 交易指定 CID、矿工、时长
dstorage:get-deal-status查询交易状态返回交易详情和验证状态
dstorage:distribute-contentP2P 内容分发缓存到指定数量的对等节点
dstorage:get-version-history查询版本历史IPLD DAG 版本链
dstorage:get-storage-stats获取存储统计交易数、总存储量、总成本

数据库 Schema ​

2 张核心表:

表名用途关键字段
filecoin_dealsFilecoin 交易id, cid, miner_id, size_bytes, price_fil, status
content_versions内容版本历史id, content_cid, version, parent_cid, dag_structure

filecoin_deals 表 ​

sql
CREATE TABLE IF NOT EXISTS filecoin_deals (
  id TEXT PRIMARY KEY,
  cid TEXT NOT NULL,
  miner_id TEXT,
  size_bytes INTEGER,
  price_fil REAL,
  duration_epochs INTEGER,
  status TEXT DEFAULT 'proposed',        -- proposed | active | expired | failed
  verified INTEGER DEFAULT 0,
  renewal_count INTEGER DEFAULT 0,
  expires_at INTEGER,
  created_at INTEGER DEFAULT (strftime('%s','now') * 1000)
);
CREATE INDEX IF NOT EXISTS idx_filecoin_deals_status ON filecoin_deals(status);
CREATE INDEX IF NOT EXISTS idx_filecoin_deals_cid ON filecoin_deals(cid);

content_versions 表 ​

sql
CREATE TABLE IF NOT EXISTS content_versions (
  id TEXT PRIMARY KEY,
  content_cid TEXT NOT NULL,
  version INTEGER DEFAULT 1,
  parent_cid TEXT,
  dag_structure TEXT,                    -- JSON: IPLD DAG 结构
  cached INTEGER DEFAULT 0,
  peer_count INTEGER DEFAULT 0,
  created_at INTEGER DEFAULT (strftime('%s','now') * 1000)
);
CREATE INDEX IF NOT EXISTS idx_content_versions_cid ON content_versions(content_cid);

前端集成 ​

DecentralizedStoragePage 页面 ​

功能模块:

  • 统计卡片: 总交易数 / 活跃交易 / 总存储量 / 总成本
  • 交易列表: 展示 CID、矿工、大小、状态
  • 存储操作: 创建新的 Filecoin 存储交易
  • 版本历史: 查询指定 CID 的版本链

Pinia Store (decentralizedStorage.ts) ​

typescript
const useDecentralizedStorageStore = defineStore("decentralizedStorage", {
  state: () => ({
    deals: [],
    versions: [],
    storageStats: null,
    loading: false,
    error: null,
  }),
  actions: {
    storeToFilecoin, // → dstorage:store-to-filecoin
    fetchDealStatus, // → dstorage:get-deal-status
    distributeContent, // → dstorage:distribute-content
    fetchVersionHistory, // → dstorage:get-version-history
    fetchStorageStats, // → dstorage:get-storage-stats
  },
});

关键文件 ​

文件职责行数
src/main/ipfs/filecoin-storage.jsFilecoin 存储引擎~142
src/main/ipfs/content-distributor.jsP2P 内容分发器~116
src/main/ipfs/decentralized-storage-ipc.jsIPC 处理器(5 个)~132
src/renderer/stores/decentralizedStorage.tsPinia 状态管理~100
src/renderer/pages/social/DecentralizedStoragePage.vue去中心化存储页面~100

测试覆盖率 ​

✅ filecoin-storage.test.js                  - 交易创建/查询/统计测试
✅ content-distributor.test.js               - 分发/版本/缓存测试
✅ stores/decentralizedStorage.test.ts       - Store 状态管理测试
✅ e2e/social/decentralized-storage.e2e.test.ts - 端到端用户流程测试

使用示例 ​

创建 Filecoin 存储交易 ​

  1. 打开「去中心化存储」页面
  2. 输入待存储内容的 CID 和文件大小
  3. 选择矿工 ID 和存储时长(建议 6 个月以上)
  4. 点击「创建交易」,系统自动协商价格并提交交易
  5. 在交易列表中查看状态变化:proposed → active

分发内容到 P2P 网络 ​

  1. 选择已有的 CID 或新上传内容
  2. 设置分发的对等节点数量(推荐 3-5 个)
  3. 点击「分发」,内容自动缓存到多个节点
  4. 热内容会被更多节点自动缓存,加速全网访问

查看内容版本历史 ​

  1. 在「版本历史」面板输入内容 CID
  2. 系统展示 IPLD DAG 格式的完整版本链
  3. 可对比不同版本的变更内容,追溯修改历史

故障排查 ​

问题可能原因解决方案
交易创建失败Filecoin 网络不可达或矿工离线检查网络连接,更换矿工节点重试
交易状态一直为 proposed矿工未确认或 FIL 余额不足确认钱包余额充足,联系矿工节点确认
P2P 分发节点数为 0无在线对等节点确保 P2P 网络已启动,检查节点发现配置
版本历史查询为空CID 未经过版本管理需先通过 IPLD DAG 创建版本记录
存储统计数据异常数据库缓存未刷新手动刷新页面或重启存储服务
证明验证失败矿工未按时提交存储证明属于矿工侧问题,考虑更换可靠矿工

配置参考 ​

javascript
// desktop-app-vue/src/main/ipfs/filecoin-storage.js
const DEFAULT_CONFIG = {
  filecoin: {
    defaultDurationEpochs: 518400, // ~6 个月 (1 epoch ≈ 30s)
    renewalThresholdEpochs: 86400, // 临期 1 个月时自动续期
    verifiedDeals: true, // 优先使用已验证交易(享受存储折扣)
    maxPriceFilPerGiB: 0.0000001, // 最高可接受价格 FIL/GiB/epoch
  },
  distributor: {
    defaultPeerCount: 5, // 默认分发对等节点数
    hotCacheThresholdAccess: 10, // 访问次数 ≥10 视为热内容
    cacheEvictionTtlMs: 7 * 24 * 3600 * 1000, // 冷内容 7 天后逐出
  },
  ipld: {
    dagFormat: "dag-cbor", // IPLD DAG 序列化格式
    hashFunction: "sha2-256", // 内容 CID 哈希算法
  },
};
配置项默认值说明
defaultDurationEpochs518400默认存储时长(约 6 个月)
defaultPeerCount5P2P 分发节点数
verifiedDealstrue是否使用已验证交易以降低费率
hotCacheThresholdAccess10热内容判定访问阈值

性能指标 ​

操作目标实际状态
Filecoin 交易创建(模拟)< 200ms~80ms✅
P2P 内容分发(5 节点)< 500ms~200ms✅
版本历史查询(50 条)< 100ms~30ms✅
存储统计聚合< 50ms~15ms✅
存储证明验证< 1000ms~400ms✅
数据库写入(单条交易)< 10ms~3ms✅

安全考虑 ​

  • 内容加密: 存储到 Filecoin 前内容经过 AES-256 加密,矿工无法读取明文
  • CID 完整性: 内容 CID 基于哈希生成,任何篡改都会导致 CID 不匹配
  • 存储证明验证: 定期验证矿工的时空证明(PoSt),确保数据持久存储
  • 版本不可篡改: IPLD DAG 结构保证版本链的不可变性和可追溯性
  • P2P 传输加密: 内容分发使用加密通道,防止传输过程中数据泄露
  • 交易审计: 所有存储交易记录完整的价格、时长和状态变化信息
  • 冗余存储: 多节点分发确保数据可用性,单节点故障不影响数据访问

相关文档 ​

基于 MIT 许可发布