Solana白皮书(四)

657 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

免责声明:本文仅从技术角度翻译、分析Solana,不构成任何的投资建议。 原创翻译,转载请注明出处。

4.5 ⼀致性

用户希望能够通过插入最后一个观察到的输出(在他们认为有效的序列里) 插入到他们输入中来,以增强一致性,并使其能够抵抗攻击。

PoH Generator APoH Generator B
IndexDataOutput HashIndexDataOutput Hash
10hash10a10hash10b
20Event1hash20a20Event3hash20b
30Event2hash30a30Event2hash30b
40Event3hash40a40Event1hash40b

如果恶意 PoH ⽣成器可以同时访问所有事件,或者能够⽣成更快的潜在序列,则它可以以相反的顺序⽣成带有事件的第⼆个潜在序列。

为了防⽌这种攻击,每个客⼾端⽣成的事件都应该包含客⼾端从它认为是有效序列中观察到的最新hash。因此,当客⼾端创建 Event1 数据时,他们应该附加他们观察到的最后⼀个哈希。

PoH Generator A
IndexDataOutput Hash
10hash10a
20Event1 = append(event1 data, hash10a)hash20a
30Event2 = append(event2 data, hash20a)hash30a
40Event3 = append(event3 data, hash30a)hash40a

当序列发布时,Event3 将引⽤ hash30a,如果 hash30a不在此事件之前的序列中,则序列的使⽤者知道它是⼀个⽆效序列。

为了防⽌恶意 PoH ⽣成器重写客⼾端事件哈希,客⼾端可以提交事件数据的签名和最后观察到的哈希,⽽不仅仅是数据。

PoH Generator A
IndexDataOutput Hash
10hash10a
20Event1 = sign(append(event1 data, hash10a), Client Private Key)hash20a
30Event2 = sign(append(event2 data, hash20a), Client Private Key)hash30a
40Event3 = sign(append(event3 data, hash30a), Client Private Key)hash40a

验证此数据需要签名验证,并在此之前的hash序列中查找该hash。

核实:

(Signature, PublicKey, hash30a, event3 data) = Event3

Verify(Signature, PublicKey, Event3)

Lookup(hash30a, PoHSequence)

见图 6,⽤⼾提供的输⼊依赖于hash 0xdeadbeef... 这个hash在插⼊之前,已经存在于⽣成的序列中。左上角的蓝⾊箭头表⽰客⼾端正在引⽤先前⽣成的hash。客⼾端消息仅在包含哈希0xdeadbeef....的序列中有效 序列中的红⾊表⽰该序列已被客⼾端数据修改。

图 6:具有反向引⽤的输⼊

*图 6:具有反向引⽤的输⼊。 *

4.6 开销

每秒 4000 个hash将⽣成额外的 160 KB 数据,并且需要具有 4000 个内核的GPU花费⼤约 0.25-0.75 毫秒的时间来验证。

4.7 攻击

4.7.1 修改顺序

⽣成反向顺序需要攻击者在第⼆个事件之后执行恶意的hash序列,但生成恶意序列期间,仍允许任何⾮恶意对等节点就原始订单进⾏通信。

4.7.2 速度

拥有多个⽣成器可能会使部署更能抵抗攻击。⼀个生成器可以是⾼带宽的,并且接收许多事件以混合到它的序列中,另⼀个生成器可以是⾼速低带宽的,它周期性地与⾼带宽生成器混合。

高速序列将创建一个次级数据序列,攻击者将不得不撤销攻击。

4.7.3 远程攻击

远程攻击是指攻击者获取了旧的废弃客⼾端私钥,并⽣成伪造的账本 [10]。历史证明提供了⼀些针对远程攻击的保护。获得旧私钥访问权限的恶意⽤⼾将不得不重新创建⼀个历史记录,该记录与他们试图伪造的原始记录花费的时间⼀样⻓。这将需要访问⽐⽹络当前使⽤的更快的处理器,否则攻击者将永远赶不上历史⻓度。

此外,单⼀的时间来源允许构建更简单的复制证明(更多内容在第 6)。由于⽹络的设计使得⽹络中的所有参与者都将依赖于事件的单⼀历史记录(就是Leader的)。

PoRep 和 PoH 应该⼀起提供针对伪造账本的空间和时间防御。