内容寻址、fork consistency 和工作量证明都大量使用哈希,却在回答三个不同问题。IPFS先判断“拿到的字节是不是所请求的内容”;SUNDR判断“不可信服务器是否给不同客户端编造了无法再无痕合并的历史”;Bitcoin在开放成员网络里用累计工作竞争公共账本顺序。把它们统称为“去中心化保证”,会丢掉真正的信任边界。

分布式系统(E02):GFS/HDFS 与 Bigtable/HBase 的存储架构

开放网络先问对手能做什么

E02里的NameNode、HMaster和存储节点处在一个明确管理域。开放网络则可能遇到陌生peer、恶意存储服务和Sybil身份。系统必须分别规定数据完整性、身份、发现、可用性、顺序和经济攻击成本。

flowchart TD
  Q[收到网络结果] --> I{要验证什么}
  I -->|字节是否匹配名字| C[内容寻址]
  I -->|服务器是否分叉历史| F[fork consistency]
  I -->|开放成员怎样竞争账本| W[工作量证明与链选择]
  C --> X[不自动证明发布者或可用性]
  F --> Y[不阻止首次分叉或拒绝服务]
  W --> Z[不提供即时确定终局]

通用判断模式是“先列攻击能力,再选证据”。哈希只能承诺输入与摘要的关系;签名绑定密钥;因果链约束历史;资源成本影响Sybil攻击。协议往往组合这些原语,但组合前各自没有越权能力。

IPFS:内容地址验证字节,不负责所有信任

CID(Content Identifier)包含版本、编码和multihash信息。客户端按CID取回block后重新计算摘要,错误字节无法匹配所请求的名字。本地实验把一个字符改掉,SHA-256即不同。

sequenceDiagram
  participant C as Client
  participant R as Routing/DHT
  participant P as Peer
  C->>R: 谁可能提供CID h?
  R-->>C: peer地址
  C->>P: 请求h
  P-->>C: bytes
  C->>C: hash(bytes) == h ?

路由回答“去哪里问”,不是“那个peer一定有正确数据”。内容摘要也不说明谁发布了它、是不是最新版本、是否有权访问,更不保证网络中始终有人保留block。IPNS、签名记录、pinning与复制策略解决其他层面的问题,不能塞进CID的含义。

Kademlia式DHT用XOR距离和路由表逐步接近目标键。恶意节点仍可拒绝响应、返回错误peer或实施Eclipse类隔离;真实系统需要并行查询、节点多样性和额外安全策略。本文不把peer discovery写成共识。

SUNDR:服务器可分叉,但不能无痕重合

SUNDR面向一个可能恶意的集中存储服务器。客户端通过签名和哈希链维护操作历史。服务器可以让Alice和Bob各自看到自洽但不同的分支;只要两人后来交换或间接比较认证信息,分叉就会暴露。服务器不能把两个分支重新合成一段双方都接受、又不留下矛盾证据的共同历史。

flowchart LR
  G[共同历史h0] --> A[Alice看到hA]
  G --> B[Bob看到hB]
  A -.恶意服务器隔离.-> A
  B -.恶意服务器隔离.-> B
  A --> E[客户端交换认证头]
  B --> E
  E --> D{hA等于hB?}
  D -->|否| X[检测到fork]

这项安全性比“服务器永远不能撒谎”弱,也比“每个客户端各自读到一致值”强。恶意服务器仍可停止服务,两个永不通信的客户端可能长期留在不同分支。fork consistency约束的是分叉后的历史关系,不是可用性。

Bitcoin:公开排序依赖累计工作与网络假设

Bitcoin把交易组织进区块,区块引用前块摘要。矿工寻找满足难度目标的nonce;节点选择累计工作最多的有效链。篡改旧区块会改变摘要并断开后继引用,攻击者必须重做后续工作并追赶诚实链。

flowchart LR
  G[genesis] --> B1[block1 PoW]
  B1 --> B2[block2 PoW]
  B1 --> A1[攻击分支]
  B2 --> H[诚实累计工作]
  A1 --> A2[攻击累计工作]
  H --> S{比较累计工作}
  A2 --> S

“最长链”不是单纯数区块,也不是即时finality。传播延迟会产生暂时分叉,后续累计工作可能导致reorganization。确认数增加只是降低特定攻击模型下的逆转概率;概率依赖攻击算力和网络假设,不能写成固定次数后的数学绝对终局。

PoW还没有验证交易的现实世界含义。它帮助开放参与者对账本顺序竞争,交易签名与脚本负责授权规则,经济激励影响攻击成本。一个有效链仍可能包含现实业务上有争议的支付。

同一个哈希函数,三种安全命题

系统 主要对手 哈希进入哪里 得到的核心证据 明确没有得到
IPFS 错误或恶意内容提供者 CID/multihash bytes与请求内容身份匹配 发布者身份、新鲜度、可用性
SUNDR 恶意存储服务器 认证历史链 分叉后不能无痕重合 防止首次分叉、服务活性
Bitcoin 开放网络中的双花与Sybil竞争 区块链接与PoW 有效链及累计工作排序 即时确定终局、现实交易正确性

安全性证明必须把密码学假设写出来:哈希需要抗碰撞和抗二次原像,签名需要不可伪造,密钥必须安全。活性则另外依赖peer可达、服务器响应或诚实算力与网络传播。协议名不能代替这些条件。

运行有限实验

1
2
3
4
5
mkdir -p examples/distributed-systems/.build/e03/tmp
export TMPDIR="$PWD/examples/distributed-systems/.build/e03/tmp"
export TMP="$TMPDIR" TEMP="$TMPDIR" PYTHONDONTWRITEBYTECODE=1
python3 -B examples/distributed-systems/trust-e03/check.py \
--output examples/distributed-systems/.build/e03/observations.json

程序验证三条有限轨迹:篡改内容不匹配摘要;两个分叉头交换后不同且不能由服务器悄悄合并;玩具链的两个区块满足三位十六进制零目标,修改首块payload后原nonce不再对应原hash。完整结果见观察结果,命令与来源见实验证据,验证范围见验证说明。

三位零目标没有安全意义,nonce次数也不是性能基准。实验未运行IPFS节点、SUNDR签名协议或Bitcoin网络,不覆盖DHT、网关、Merkle tree、难度调整、激励和重组概率。

两个推演练习

从一个peer取回的block通过CID校验,能否证明它来自原作者?

不能。校验只证明字节与CID匹配。发布者身份需要签名或受信命名记录;“这是最新版本”还需要版本选择规则。

SUNDR客户端发现两个历史头不同,为什么不能直接选择hash更大的分支?

摘要大小不是协议顺序或授权证据。不同头证明服务器分叉了视图,应用应报警、停止敏感操作或进入规定的恢复流程,不能发明一个数值选胜规则。

E04回到受管理云环境,比较函数执行与跨云任务调度的冷启动、放置、重试和费用边界。

参考资料