storj 白皮书翻译与解析

简介

storj 是在 Kademlia 上构建的。

加密与分片

文件应该在分片前在客户端被加密。
数据拥有者拥有加密的密钥。
碎片大小是一个可设置的参数。

Proofs of Retrievability

数据完整性通过proof of retrievability维持

可获取证明,确保分片被正确存储。

通过 challenge-response 交互,也称为 audit, 或 heartbeat, 来验证文件是否可获取。

data owner 随机生成 n 个 challenge salts 列表, s0, s1, ...sn−1, 并存储 salts 列表.

pi 是 pre-leaf
pi = H(si + d)

li 是 merkle 树的叶子
li = H(H(si + d))

如果叶节点的个数不是2的幂次,增加空字符串的 hash 作为新叶子,知道叶节点的个数是2的幂次。

data owner 存储 challenges(salts) 列表, merkle root, 和 merkle 树的高度,然后把 merkle 树的部分叶节点发给 farmer。
farmer 存储部分 merkle 叶节点和 shard。

data owner 会周期性地挑选出一个 challenge(salt),并发送给 farmer。challenge 不可以被重用。

data owner 用 challenge(salt)、shard、merkle 树叶列表,生成 merkle proof 并发送给 data owner。

merkle proof 总是包含 log2(l) + 1 个 hashes,data owner 使用 merkle root 和 merkle 树高来验证 merkle proof 的有效性。

局部 audit

为了减小 IO 负担而采取的一种方案。

发出 Audits

Storj 扩展 Kademlia message,增加来一个新消息类型: AUDIT.

数据存取流程

该合同系统扩展 Kademlia message,增加来四个新消息类型: OFFER, CONSIGN, MIRROR, and RETRIEVE.

存文件

取文件

备份文件

付费

使用 Strojcoin,使用微支付管道。

在 audit 时支付费用,最小化信任需求。

小额支付,价格小于 $0.000001 per audit.

Quasar

p2p publish/subscribe system.

扩展 Kademlia, 增加 3 个新消息类型: SUBSCRIBE、UPDATE、PUBLISH。

每个节点保存 topic,以及订阅那些 topic 的 节点,这些节点距离本节点最远距离为 3.

获取其他节点的订阅列表

传播本节点的新订阅

先 SUBSCRIBE 是为了了解邻居的状态,可能是为了做一些策略。

发布

PUBLISH 消息包含一个 TTL 参数,防止无限传播。
为了防止节点再次收到同样的 PUBLISH 信息,节点收到 PUBLISH 后,会将自己的 node id 加到过滤列表再转发,转发时不会发送给过滤列表中存在的节点。

冗余方案

简单副本策略

文件shard 存多个副本,shard副本 越多,可靠性越高。

K-of-M 丢失文件还原

丢失文件还原算法讲一个文件分成 k 个 shard,并创建 m 个等价 shard,共 k + m = n 个 shard。
n 个 shard 中的任意 k 个 shard,可以重建文件或任意一个丢失的 shard。
data owner 可以容忍部分 shard 丢失。

比如 20-of-40 组合,可以容忍 5 个 shard丢失,因为再丢失 16 个 shard 的概率很低。

KFS

本地文件存储,使用 LevelDB。
LevelDB存储超过100GB,会影响性能,所以需要多个 LevelDB 实例。

基本原理

多个 LevelDB实例缓解了操作压力,提升每个实例的操作速度。
多个 LevelDB,每个 LevelDB 存的范围小,锁的范围更小,并发数更大,阻塞时间也更短。

S-Buckets 与路由

KFS 存储分片在 B 个 大小限制的 LevelDB 实例,称为 S-Buckets.
S-Buckets 存储最大的字节大小为 S。
因此 KFS 最大存储大小为 S*B bytes。
Stroj 目前使用 S = 32 GB,B = 256 个实例。总大小为 8 TB。

KFS 有一个随机的 R bits id,要求 R >= log2(B)。
即 256 个实例,至少需要 8 bit。

1、 g = log2(B)
2、 h 为 KFS id 的前 g bits
3、 i 为 shard hash 的前 g bits
4、 n = h 异或 i
5、 存储 shard 在第 n 个LevelDB 实例

如果一个 KFS 实例满了,第二个实例会被创建。

存储细节

数据被分块存储,每块 C 字节。默认 C = 128 KB。
每个块的 key 为 数据全部内容的 hash + “ ” + 数字索引
这是为了确保 kv对 较小,同时能够从 S-Bucket 中顺序读写。
数字索引字符长度为:l = log10(LevelDB存储容量/块大小)
比如 l = 6,则第 3753 个块的数字索引为 ‘003753’

NAT 穿透与反向 HTTP 打开通道

Storj 扩展 Kademlia,增加 3 个额外类型:PROBE、FIND_TUNNEL、OPEN_TUNNEL。

检查自己是否是公网地址

本节点不是公网IP,反向打开通道

Bridge

Bridge 是管理节点。负责文件存取协商、校验文件可获取、支付、文件状态。被设计为只存储云数据。

Client 负责加密、文件预处理、文件密钥管理。

Bridge 必须是可靠的,Client可以不可靠。

上传操作

  1. Client 收集并预处理。
  2. Client 通知 Bridge 等待上传数据。
  3. Bridge 与网络节点协商(上传)
  4. Bridge 返回节点和 token 列表给 Client
  5. Client 根据节点IP 和 token 上传数据
  6. Client 把 AUDIT 信息给 Bridge,委托管理
  7. Bridge 验证文件可获取
  8. Bridge 承担 AUDIT、支付、管理文件状态的责任
  9. Bridge 通过 API 显示文件的 metadata

下载操作

  1. Client 传递标记文件的标识符,并请求文件
  2. Bridge 校验请求,提供 farmer IP + token 的列表
  3. Client 根据 IP 和 token 取得文件
  4. 文件在客户端组装并解码

参考

stroj 白皮书

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,894评论 2 89
  • 摘要 星际文件系统是一种点对点的分布式文件系统, 旨在连接所有有相同的文件系统的计算机设备。在某些方面, IPFS...
    陌上尘飞123阅读 2,861评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,149评论 0 9
  • 面试的时候被问道怎么取消一个事件的默认行为,当然是用event.preventDefault()了。 但是怎么屏蔽...
    站着瞌睡阅读 4,409评论 0 0