Skip to content

去中心化社交模块

本文档是 系统设计主文档 的子文档,详细描述去中心化社交模块的设计。


2.2 去中心化社交模块

2.2.1 功能描述

构建基于身份自主权(DID)的去中心化社交网络,用户完全掌控自己的社交图谱和内容,无需依赖中心化平台。

2.2.2 架构设计

去中心化社交
├── 身份层 (DID - Decentralized Identity)
│   ├── 身份生成 (基于U盾/SIMKey的公私钥对)
│   ├── DID文档
│   │   ├── DID标识符: did:chainlesschain:<public_key_hash>
│   │   ├── 公钥列表 (加密、签名、认证)
│   │   ├── 服务端点 (个人节点地址)
│   │   └── 验证方法
│   └── 可验证凭证 (Verifiable Credentials)
│       ├── 自我声明 (昵称、头像、简介)
│       ├── 信任背书 (他人签名的凭证)
│       └── 技能证书 (链上存证)

├── 通信层 (P2P Network)
│   ├── 节点发现
│   │   ├── DHT (分布式哈希表) - Kademlia
│   │   ├── 引导节点 (Bootstrap Nodes)
│   │   └── mDNS (本地网络发现)
│   │
│   ├── 消息传输
│   │   ├── WebRTC (直接P2P通信)
│   │   ├── QUIC协议 (低延迟)
│   │   ├── 中继节点 (NAT穿透失败时)
│   │   └── 离线消息存储 (临时中继)
│   │
│   └── 消息加密
│       ├── Signal协议 (端到端加密)
│       ├── 双棘轮算法 (前向安全)
│       └── 会话密钥管理

├── 内容层
│   ├── 内容类型
│   │   ├── 文本动态 (类似微博)
│   │   ├── 长文章 (类似博客)
│   │   ├── 私密消息 (加密聊天)
│   │   └── 群组讨论
│   │
│   ├── 内容存储
│   │   ├── 本地存储 (自己的内容)
│   │   ├── IPFS (公开内容的分布式存储)
│   │   ├── 缓存 (关注者的内容)
│   │   └── Git仓库 (版本历史)
│   │
│   └── 内容分发
│       ├── 关注者推送 (主动推送给在线关注者)
│       ├── 拉取同步 (用户主动拉取更新)
│       └── 中继广播 (通过友好节点传播)

├── 社交图谱层
│   ├── 关系管理
│   │   ├── 关注/粉丝 (单向关注)
│   │   ├── 好友 (双向关注)
│   │   ├── 分组 (自定义标签)
│   │   └── 黑名单
│   │
│   ├── 信任网络
│   │   ├── 信任评分 (基于互动历史)
│   │   ├── Web of Trust (信任传递)
│   │   └── 信誉证明 (区块链锚定)
│   │
│   └── 隐私控制
│       ├── 内容可见性 (公开/仅好友/私密)
│       ├── 选择性同步 (只缓存感兴趣的内容)
│       └── 匿名模式 (临时身份)

└── 发现层
    ├── 内容发现
    │   ├── 时间线 (关注者内容流)
    │   ├── 话题标签 (#hashtag)
    │   ├── 全文搜索 (本地索引)
    │   └── 推荐算法 (本地AI推荐)

    └── 用户发现
        ├── 好友推荐 (共同好友)
        ├── 兴趣匹配 (基于内容分析)
        └── 附近的人 (蓝牙/GPS可选)

2.2.3 核心流程

用户注册流程:

1. 用户选择创建新身份
2. U盾/SIMKey生成密钥对 (Ed25519签名 + X25519加密)
3. 生成DID标识符: did:chainlesschain:<pubkey_hash>
4. 创建DID文档并自签名
5. 配置个人节点 (可选自托管或使用免费中继)
6. 发布DID文档到DHT网络
7. 生成DID二维码/链接供他人添加

添加好友流程:

1. 用户A扫描用户B的DID二维码
2. 从DHT网络获取B的DID文档
3. 验证DID文档签名
4. 发送好友请求 (使用B的加密公钥加密)
   - 消息内容: A的DID + 公钥 + 自我介绍 + 签名
5. B收到请求后验证签名
6. B同意后建立Signal加密会话
7. 双方交换公钥,存储到本地联系人数据库
8. 开始P2P通信

发布动态流程:

1. 用户撰写动态内容
2. 选择可见性级别 (公开/好友/私密)
3. 内容签名 (私钥签名证明authorship)
4. 如果是公开内容:
   - 上传到IPFS获取CID
   - 将CID + 元数据发布到DHT
5. 如果是好友可见:
   - 加密内容 (每个好友的公钥单独加密)
   - 通过P2P推送给在线好友
   - 离线好友消息存储在中继节点
6. 记录到本地Git仓库 (版本历史)
7. 更新本地内容索引

查看时间线流程:

1. 用户打开时间线
2. 从本地数据库读取缓存内容
3. 并行向所有关注者的节点拉取更新
   - 发送最后同步时间戳
   - 获取增量更新
4. 验证每条内容的签名
5. 解密私密内容
6. 合并排序显示 (按时间/算法推荐)
7. 异步下载多媒体资源 (图片、视频)
8. 更新本地缓存

2.2.4 数据模型

本地社交数据库表结构:

sql
-- DID身份表 (本人的多个身份)
CREATE TABLE identities (
    did TEXT PRIMARY KEY,
    nickname TEXT,
    avatar_path TEXT,
    bio TEXT,
    public_key_sign TEXT NOT NULL,  -- 签名公钥
    public_key_encrypt TEXT NOT NULL,  -- 加密公钥
    private_key_ref TEXT NOT NULL,  -- U盾/SIMKey中的私钥引用
    did_document TEXT NOT NULL,  -- JSON格式的DID文档
    created_at INTEGER NOT NULL,
    is_default INTEGER DEFAULT 0
);

-- 联系人表
CREATE TABLE contacts (
    did TEXT PRIMARY KEY,
    nickname TEXT,
    avatar_url TEXT,
    bio TEXT,
    public_key_sign TEXT NOT NULL,
    public_key_encrypt TEXT NOT NULL,
    did_document TEXT,
    relationship TEXT,  -- 'following', 'follower', 'friend', 'blocked'
    trust_score REAL DEFAULT 0.0,  -- 0-1之间的信任评分
    tags TEXT,  -- JSON数组: 分组标签
    node_address TEXT,  -- 对方的节点地址
    last_seen INTEGER,
    added_at INTEGER NOT NULL
);

-- 动态内容表
CREATE TABLE posts (
    id TEXT PRIMARY KEY,
    author_did TEXT NOT NULL,
    content TEXT NOT NULL,
    content_type TEXT DEFAULT 'text',  -- 'text', 'article', 'image', 'video'
    media_urls TEXT,  -- JSON数组: 多媒体附件
    visibility TEXT DEFAULT 'public',  -- 'public', 'friends', 'private'
    ipfs_cid TEXT,  -- 公开内容的IPFS CID
    signature TEXT NOT NULL,  -- 作者签名
    created_at INTEGER NOT NULL,
    synced_at INTEGER,
    is_local INTEGER DEFAULT 0,  -- 是否本人发布
    FOREIGN KEY (author_did) REFERENCES contacts(did)
);

-- 私密消息表
CREATE TABLE messages (
    id TEXT PRIMARY KEY,
    conversation_id TEXT NOT NULL,
    sender_did TEXT NOT NULL,
    receiver_did TEXT NOT NULL,
    content_encrypted BLOB NOT NULL,  -- Signal协议加密
    media_encrypted BLOB,
    ratchet_state TEXT,  -- Signal双棘轮状态
    signature TEXT NOT NULL,
    created_at INTEGER NOT NULL,
    delivered_at INTEGER,
    read_at INTEGER,
    FOREIGN KEY (sender_did) REFERENCES contacts(did),
    FOREIGN KEY (receiver_did) REFERENCES contacts(did)
);

-- 群组表
CREATE TABLE groups (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL,
    description TEXT,
    avatar_path TEXT,
    creator_did TEXT NOT NULL,
    group_key_encrypted BLOB NOT NULL,  -- 群组对称密钥(用成员公钥加密)
    created_at INTEGER NOT NULL,
    FOREIGN KEY (creator_did) REFERENCES contacts(did)
);

-- 群组成员表
CREATE TABLE group_members (
    group_id TEXT,
    member_did TEXT,
    role TEXT DEFAULT 'member',  -- 'admin', 'member'
    joined_at INTEGER NOT NULL,
    PRIMARY KEY (group_id, member_did),
    FOREIGN KEY (group_id) REFERENCES groups(id),
    FOREIGN KEY (member_did) REFERENCES contacts(did)
);

-- 信任背书表 (Web of Trust)
CREATE TABLE endorsements (
    id TEXT PRIMARY KEY,
    endorser_did TEXT NOT NULL,  -- 背书人
    endorsee_did TEXT NOT NULL,  -- 被背书人
    skill_or_trait TEXT NOT NULL,  -- 背书的技能或特质
    comment TEXT,
    signature TEXT NOT NULL,  -- 背书人签名
    created_at INTEGER NOT NULL,
    FOREIGN KEY (endorser_did) REFERENCES contacts(did),
    FOREIGN KEY (endorsee_did) REFERENCES contacts(did)
);

2.2.5 技术选型 (实际实现 v0.26.0)

桌面端 (100%完成):

组件技术选择版本/说明
DID标准W3C DID Core符合国际标准
P2P网络libp2p 3.1.2成熟的P2P通信库
P2P子模块@libp2p/webrtc 6.0.10WebRTC传输层
@libp2p/noise 1.0.1Noise协议加密
@libp2p/kad-dht 16.1.2Kademlia DHT
@libp2p/circuit-relay-v2 4.1.2中继节点支持
WebRTCwerift 0.22.2WebRTC实现
WebRTC兼容wrtc-compat.js ⭐新增兼容层(152行,v0.20.0)
端到端加密Signal协议@privacyresearch/libsignal-protocol-typescript 0.0.16
分布式存储IPFS公开内容的永久存储
DHTKademlia节点发现和路由
签名算法Ed25519高效的椭圆曲线签名
加密算法X25519 + ChaCha20-Poly1305现代加密组合

实现文件 (29个文件):

  • p2p-manager.js (58KB) - 核心P2P编排
  • signal-session-manager.js (23KB) - Signal协议加密
  • voice-video-manager.js (23KB) - WebRTC音视频
  • wrtc-compat.js (152行) - WebRTC兼容层 ⭐v0.20.0新增
  • file-transfer-manager.js - 大文件传输(64KB分块)
  • message-manager.js - P2P消息传递
  • device-sync-manager.js - 跨设备同步

iOS (20%完成, v0.2.0) ⭐最新:

组件技术选择实现状态
DID实现CoreDID模块✅ 100% - did:key, Ed25519
DID方法did:key✅ Multibase + Multicodec
签名算法Ed25519✅ CryptoKit原生实现
E2EESignal Protocol✅ 100% - CryptoKit实现
密钥交换X3DH✅ P256曲线
消息加密Double Ratchet✅ CryptoKit实现
P2P网络WebRTC✅ 框架完成 - Google WebRTC iOS SDK
信令服务WebSocket✅ Starscream库
设备发现Bonjour (NSD)✅ iOS原生支持
P2P管理P2PManager✅ 596行 - 连接管理/状态同步
WebRTC管理WebRTCManager✅ 466行 - 音视频/数据通道
Signal管理SignalProtocolManager✅ 431行 - 会话管理/密钥轮转
消息管理MessageManager✅ 294行 - 发送/接收/存储
图像处理ImageProcessor✅ 499行 - 压缩/格式转换/滤镜
图像缓存ImageCacheManager✅ 394行 - 三级缓存系统
图像存储ImageStorageManager✅ 417行 - 文件管理/元数据
UI集成SwiftUI视图🚧 进行中 - P2PChatView等

核心模块 (Swift Package Manager) ⭐最新:

  • CoreDID: DID生成,文档创建,数字签名验证 (100%)
    • DIDManager.swift (236行): did:key生成, Ed25519签名
  • CoreE2EE: Signal Protocol完整实现
    • E2EESessionManager.swift (203行): X3DH + Double Ratchet
    • P256曲线密钥协议
    • 预密钥包系统 (100个一次性预密钥)
    • 会话持久化 (UserDefaults)
    • 安全码验证 (Safety Numbers)
  • CoreP2P: P2P网络框架
    • WebRTCManager.swift (466行): DataChannel/音视频通道
    • P2PManager.swift (596行): 连接管理/状态同步
    • SignalProtocolManager.swift (431行): 会话管理/密钥轮转
    • MessageManager.swift (294行): 消息发送/接收/存储

图像处理系统 ⭐新增 (v0.2.0):

  • ImageProcessor.swift (499行): 压缩, 格式转换, 滤镜
  • ImageCacheManager.swift (394行): 三级缓存 (内存/磁盘/远程)
  • ImageStorageManager.swift (417行): 文件管理, 元数据

UI模块 (SwiftUI):

  • ✅ P2PChatView (452行): P2P聊天界面
  • ✅ ConversationListView (137行): 会话列表
  • ✅ 设置界面 (DID显示, PIN修改)

代码规模: ~8,500行 P2P/E2EE代码


Android (60%完成, v0.4.1) ⭐最新:

组件技术选择实现状态
DID实现core-did模块✅ 100% - DID管理
E2EESignal Protocol✅ 100% - 完整实现 (~8,195行) ⭐
密钥交换X3DH✅ 密钥协商 + 预密钥包
双棘轮Double Ratchet✅ 前向安全 + 密钥轮转
会话管理PersistentSessionManager✅ 持久化 + 密钥导出/导入
身份验证SafetyNumbers✅ 60位安全码 + 会话指纹
高级E2EEReadReceiptManager✅ 已读回执加密 + 批量确认
MessageRecallManager✅ 消息撤回 + 灵活策略
MessageQueueManager✅ 离线消息队列 + 优先级
GroupEncryptionManager✅ 群组加密接口 + AES-256
P2P网络core-p2p模块✅ 100% - WebRTC连接
WebRTCWebRTC 120.0.0✅ STUN/TURN配置
P2P UIfeature-p2p模块✅ 100% - 8个完整界面 ⭐
设备发现DeviceListScreen✅ NSD实时扫描 + 配对状态
设备配对DevicePairingScreen✅ 5阶段流程 + QR扫描
安全验证SafetyNumbersScreen✅ 60位数字 + QR扫描
会话指纹SessionFingerprintDisplay✅ 色块可视化
DID管理DIDManagementScreen✅ 导出 + 分享
P2P聊天P2PChatScreen✅ 端到端加密聊天
QR扫描QRCodeScannerScreen✅ CameraX集成
消息队列MessageQueueScreen✅ 离线消息管理

核心模块 (Kotlin + Hilt DI):

  • core-e2ee:
    • SignalProtocolManager (X3DH + Double Ratchet)
    • EncryptedReceiptManager (加密回执)
    • MessageRecallManager (消息撤回)
    • SessionSyncManager (会话同步)
    • GroupEncryptionHelper (群组加密)
    • KeyRotationManager (密钥轮换)
    • BackupManager (密钥备份)
  • core-p2p:
    • WebRTCManager (点对点连接)
    • SignalingClient (WebSocket信令)
    • STUNServerConfig (NAT穿透)
  • core-did:
    • DIDManager (身份管理)
    • DIDRepository (持久化)

UI导航集成 (Jetpack Compose):

  • ✅ 主导航图集成 (commit edc563d0)
  • ✅ 嵌套P2P导航图
  • ✅ Material 3 设计规范
  • ✅ 完整的用户交互流程

性能优化 (commit 34359aa6):

  • ✅ buildSrc统一依赖管理 (6,228行)
  • ✅ Gradle并行构建 + G1GC
  • ✅ 构建速度提升 30-50%
  • ✅ 启动速度提升 20-40%
  • ✅ APK大小减小 15-25%
  • ✅ 数据库WAL模式 (+60%性能)

测试覆盖 (64+ test cases):

  • ✅ Unit tests (ViewModels, repositories, crypto)
  • ✅ Integration tests (Database, E2EE protocols)
  • ✅ UI tests (P2P flows, authentication, chat)
  • ✅ Performance tests (Database benchmarks)

代码规模: ~15,000行 P2P/E2EE代码


跨平台对比:

特性桌面端iOSAndroid
DID身份✅ 100%✅ 100%✅ 100%
Signal E2EE✅ 100%✅ 100%✅ 100%
WebRTC P2P✅ 100%🚧 30%✅ 100%
P2P UI✅ 100%🚧 10%✅ 100%
音视频通话✅ 100%❌ 0%🚧 50%
文件传输✅ 100%❌ 0%🚧 30%
群组加密✅ 100%❌ 0%✅ 100%
离线消息✅ 100%🚧 50%✅ 100%

架构一致性:

  • ✅ 统一的DID did:key格式 (Ed25519)
  • ✅ 相同的Signal Protocol实现
  • ✅ 兼容的消息加密格式
  • 🚧 P2P协议对齐 (iOS WebRTC集成中)

ChainlessChain 系统设计文档 — 面向开发者