安全模型
加密原语
| 原语 | 算法 | 用途 |
|---|---|---|
| 签名 | Ed25519(ed25519-dalek) | 交易签名、区块签名 |
| 区块哈希 | SHA-512 | 带域标签 "BLK" 的区块哈希 |
| 交易哈希 | SHA-256 | 签名消息哈希 |
| 状态哈希 | BLAKE3 | 状态根计算 |
| 存储哈希 | Keccak256 | 合约存储槽派生 |
| 压缩 | snap、lz4 | P2P 消息压缩 |
传输安全
P2P 层
- 加密:libp2p Noise 协议(认证加密)
- 多路复用:Yamux
- 身份:Ed25519 对等密钥
- 最大传输大小:每条消息 256KB
RPC 层
- TLS:不由 RPC 服务器终止。生产部署必须使用 TLS 终止反向代理。
- CORS:限制为 localhost 来源。生产环境需配置允许的来源。
- 请求体限制:最大请求体 1MB。
速率限制
| 层级 | 限制 | 窗口 |
|---|---|---|
| 全局 RPC | 200 请求/秒 | 1 秒滑动窗口 |
| 每 IP RPC | 50 请求/秒 | 1 秒滑动窗口 |
| 批量大小 | 100 个请求 | 每个 HTTP 请求 |
| 区块哈希扫描 | 1000 个区块 | 每次 chain_getBlockByHash 调用 |
输入验证
RPC
- JSON-RPC 版本必须严格为
"2.0" - 错误消息在返回给客户端前经过清洗
- 内部错误返回通用消息(无堆栈跟踪或内部格式)
- 内存池拒绝详情从错误响应中删除
内存池
- Nonce 验证:需要顺序 nonce(允许最多 5000 的间隔容差用于突发恢复)
- 余额检查:发送方必须有足够的余额支付金额 + 费用
- 签名验证:Ed25519 签名在接纳前验证
- 配额系统:每类限制(金融:50K、IoT:100K、全局:100K)
- 每发送者上限:每个发送者最多 512 个待处理交易
交易管道
无状态守卫(优先运行):
- 签名格式验证
- Ed25519 签名验证
- 公钥 → 地址派生检查
有状态守卫(无状态通过后运行):
- Nonce >= 账户 nonce
- 余额 >= 金额 + 费用
- 账户未被列入黑名单
原子提交:余额扣除和 nonce 递增原子性地发生。
共识安全
BFT 法定人数
- 法定人数:必须有 2f+1(67%)的验证者签署区块接受证书
- 拜占庭容错:最多可容忍 f = (n-1)/3 个拜占庭节点
- 证书验证:主节点验证所有证明签名
PoU 防博弈
- 分数平滑:指数移动平均防止通过瞬态行为操控分数
- 提案者轮换:50 个区块后提案者必须退出(防止垄断)
- 最低分数阈值:分数低于 300 将取消奖励资格
选举安全
- 确定性组 ID:基于轮次而非时钟时间(防止主节点分歧)
- 选举去重:每轮只提交第一个结果
- 软拒绝未知组:主节点对未知组 ID 发出警告但继续处理
密钥管理
SDK 钱包
- 零化:私钥在
Drop时通过zeroize库清零 - 不持久化:SDK 钱包不将密钥保存到磁盘
- HTTPS 强制:远程 RPC 端点默认需要 HTTPS
水龙头
- 轮询密钥:轮换 10 个密钥对以防止 nonce 竞争
- 序列化认领:
faucet_lock互斥锁防止 TOCTOU 竞态条件 - 认领限制:每次认领 5 SAVT,每个地址 24 小时冷却
节点安全
对等节点活性
- Gossipsub 保活:PoU 分数共享通过 gossipsub 发布以刷新
last_seen - 不活跃超时:600 秒(可配置)后移除对等节点
- SlowPeer 断开:若 gossipsub 发送队列饱和则断开节点
资源限制
- 连接处理器队列:50,000 条消息(LN + MN)
- Gossipsub 网格:mesh_n=8、mesh_n_high=12、mesh_n_low=4
- 栈大小:8MB 防止栈溢出
- 内存:带背压的有界内存池
负责任披露
请通过项目的负责任披露流程报告安全漏洞。请勿就安全漏洞提交公开问题。