Solana 的技术优化和创新
2022-10-10 15:23
CFG Labs
2022-10-10 15:23
订阅此专栏
收藏此文章

本文将对 Solana 几个技术特色进行分解 。大部分内容截取于 Anatoly 官方博客以及@eternal1997 的部分 Twitter。主要从高效利用网络带宽 (交易传播), 减少节点之间的通讯成本和延迟,以及交易的快速执行等方面进行优化 https://twitter.com/eternal1997L/status/1554373796907327489


Solana 是曾经是号称 TPS 可以上几万,甚至几十万的链,也获得了大量资本的青睐。在单片链的世界里,Solana 是以太坊 killer,也通过工程化的完善,硬件的团队实力,获取了一定的市场份额。在模块化的世界里,他也将继续他的故事。单片链中,以太坊最大的价值来自于商业的敏感和创新,所有的应用都在为其打工。Solana 的经济模型我一直认为还有待完善,不过这也正常。对于一个世界级 poker 来讲,数学好,逻辑思维强才是足够硬核的实力。高通的实力不容小觑。客观来讲,乌克兰,俄罗斯那里高产数学家也是不可否认的。硬件门槛本高,软件想象空间更大,那么软硬一体何乐而不为呢?


技术 / 工程一直是我的不擅长类,所以从 Solana 工程设计创新点开始学习


1) Proof of history 简称历史证明。不管是在数据库模型,分布式账本中,最重要的还是要用一个大家对于时间的共识。那么怎么样被记录的时间才能被信任呢。在传统的数据库模型中,通常用一个中心化的同步原子钟去记录,类似于 google spanner 谷歌公司研发的、可扩展的、多版本、全球分布式、同步复制数据库,就是通过这种方式。不过缺点就是对于这个时间的精确度调整以及大量的维护成本。但是这个在 Web3.0 的世界中似乎不是一个理想方案。每个节点都有自己的时间戳,而且基本都不一致,如何统一呢?Solana 相当于做了一个大家都可以用的中央时间戳的。当然在这之间,也有一些过渡方案。比如中位时间戳(Hashgraph 提出)。这意味对于任何一笔都需要通过大部分节点的确认和签名,并且还需要通过 P2P 网络传输。这从工程角度,从设计方面都还有优化的空间。注意这个过程在共识之前,应该涉及到了交易执行,参与者包括用户,客户端,RPC 节点?


其实我觉得比较好的理解可以想象一下沙漏(hourglass)。它本身就是一种计时器。运作原理主要是通过一个流沙池子流到另一个流沙池,直至流光。因为内里是密封的,所以每次流完的时间理论上都是应该一样的。同样的,如果在这个过程中,你去拍照,你可以根据照片的图案排出时间的先后顺序 (刚开始流,还是流到一半,还是流完了?)。所以本质上是一个不断重复的时间序列。当然更学术的定义就是可验证延迟函数,而这个函数是基于连续性的 SHA256 哈希,对于事件,或者说交易进行延迟性验证(不是及时验证,一般会有 timeout),同时每个产出(你也可以理解为那些这个过程中定时拍的照片)都是公开可验证的。在 Solana 中,这些数据库是全网可见还是节点可见呢?如何查找?了解的小伙伴可以帮助我们一起思考。



这里还可以强调下一般情况每个事件有几个参数,哈希,count,状态。count 你可以理解为像以太坊中的区块高度。这里有两点:每个区块高度之间都代表了时间的流逝。同时区块高度也和实际物理时间一一对应,相辅相成。


在历史证明中,数据可以通过数据哈希以 input 的形式被嵌入数据库,当然上文还提到了其他的参数,包括哈希,count (区块高度), 状态等等。这里面也有两点:1)每个嵌入的动作之间代表了时间的流逝 2)数据肯定是在嵌入之前生成的。这里主要是嵌入的方式。接下来将嵌入的内容。这些嵌入的信息中还可以涵盖之前的信息,比如之前的哈希值, 当然签名会涉及到用户的私钥。同时有一个很有趣的点,就是这个记录了之前哈希也被记录在了这个共享的历史账本上。所以 Anatoloy 用了一个很形象的,我也很认同的比喻,就是你拍了一张报纸的照片(这个消息),这个照片再被报纸转载。这个报纸可以理解为历史账本。而照片可以理解为是一个 input,一个信息。


尽管这个账本是生成在单个 CPU 上的,但是 output 是通过 GPU 并行执行和验证。这里的讲下 Solana 主要以 CPU 和 GPU 为主,并不认为 Asic 能够大大提高网络性能。CPU 你可以理解为中央处理器,一个计算单元。GPU 通常是指显卡,适用于并行计算,可以理解为核。 Asic 是用于特殊功能或者算法用途的芯片,也算是单一性能 CPU,成本较高。



2) Tower BFT

基于 POH 的公共时钟历史账本,我们就需要将共识机制引入其中。以太坊主张安全大于活性,而 Tendermint 认为活性比可持续性更重要。PBFT 还引入了 Timeout 的概念。Timeout 就是一个计数器,如果正常的通信传输被卡住,就不能一直等待卡在那里,计数器超过设定的阈值就需要退出,重新传输。这里在共识协议前,我们再回忆下 POH,可以理解为一些列 SH256 哈希算法下的交易事件。Sha256 不停地循环计算,每次 output 是下一次的 input。同时可以对这个循环进行采样,并且记录相关参数,比如循环次数,状态,input, count,哈希等等。所以本质上这个循环采样可以理解为 1)可验证的数据库 key value 模型 vs 以太坊的账户模型 这个是 solana 的核心 2)用来记录事件,比如时间和顺序。


在拜占庭容错中,超过 2/3 的节点投票之后就可以进行确认。这里通常涉及到两轮投票,第一次为交易数据的传送。OK,proposer 说我要加下这个信息,并且将数据同步,并且说 OK,你可以加这个信息。第二步 proposer 说我已经加好了,其他人验证者加完之后也会返还证明完成了验证。所以是两轮。在 Solana 中,验证是有延迟的,一般现在会处理 / 投票 N 个哈希,而且一旦投票生成之后,会保证 N 个哈西之内不再投票。每次投票,之前的投票的 timeout 都会 double。所以我们可以将投票限制在某个时间段内,称之为 slot。Timeout 的概念我们上文已经做了解释。本质上就是说,当你投票越多,前面的投票逐步被 confirm,以及被 rollout back 的概率越来越小。因为 timeout 本质上可以理解的 network have to stall 的时间 (stall 就是网络被 hold 住的意思,流水线经常有 stall 动作,本来是一个接一个,遇到问题需要暂停当前,解决了再继续下去)。


从而可以去展开这个 vote。超过这个时间,那么肯定网络传输就需要重启了。所以这个 timeslot 对应的 slot 也需要大家投票。细节不详细解释,这个过程主要是保证网络的传输的连续性,同时,所以的验证节点在无需 P2P 通信,异构通讯的情况下,就可以获取信息。


这里女巫攻击提到,由于 POS 共识中出块节点不需要多少算力就可以产生一个区块,它可能会同时生产好几个版本的区块。如果其他节点同时认可不同版本的区块给出投票,就会导致网络分叉,这种现象叫“无利害攻击”。这种情况下节点根据质押数量 timeout 的选择一条最重的链,因为最重的链会生成最多的激励 ( 验证节点的激励是需要当投票达到一定的阈值的)当然对于乱投票分叉区块的那帮人,也会受到惩罚 (上文我们提到了在 poh 上投票不定时也会有惩罚,所以投票是有 timeout)。


Tendermint 的通讯成本一般比较高,比如说有 N 个节点,如果按照 1 对 1 通信,进行两轮共识,那么需要 N(N-1) 的通信。但是 Solana 引入了 lead 节点的概念。Lead 主要负责信息(投票)的收集以及全网传递,并且负责处理交易。这个与 Cosmos 的 Tendermint 共识算法类似,所有的 lead 节点都是提前根据其质押数量(质押多,出块概率高)选举,并且公开。但是问题又来了,如果有大量的数据,这是不是意味着这个 lead 节点需要将这些数据传输 N-1 次呢?如果全网节点数是几万怎么办?


3) 这就引入了我们需要介绍的 Turbine 区块传输协议,这个根据官方说是借鉴了 BitTorrent 的设计。但是也做了很多创新,比如数据被根据任意路径被分成不同的数据包, 然后将其分发给不同的节点,当然这里面还包括 Reed Solomon 纠删码。 Reed Solomon 大家再熟悉不过了,可以看下我们之前的文章 Celesita-DA 的数据可用性。ReedSolomon 主要用来解决数据可见采样。这里主要解决恶意节点不释放数据或者释放错误数据的恶意行为。


这里要理解下邻居和节点的关系。邻居和邻居之间是可以传输数据的,树状结构。如果嵌入进来,那么更像是网状结构(每个邻居可以包含多个节点)通过这个种方式,Solana 的空间复杂度,往往与节点数量 N 或者 LogN 成正比,远远小于 PBFT 的 N*2。 (问题,以太坊也是 Log N??)




当然这里面的也存在些问题,比如 Turbine 本质上是为了优化传输的过程,并且通过 UDP 快速帮助节点传输数据,同时为数据包引入任意路径。这个过程中 UDP 并不非常安全,很多用户发起交易后却屡次失败,可能在交易传播中发生了丢包问题。同时,虽然通过 RPC 节点快速将交易给到 Lead 节点 (1-3 秒),也就是出块节点,vs (以太坊的 gossip 协议, 接下来会介绍)但是整个设计 Lead 的节点压力非常大,而且很多交易也并非能够像以太坊一样经过其他验证节点的(bloom filter)过滤和处理。所以当出现大量的 MEV 攻击者,以及 NFT 相关的交易等,Solana 中的 Lead 节点宕机也不足为奇。


至于权重问题,我感觉设计还是根据质押权重来划分等级的。权重高的离 lead 节点近,因此接受信息更为快速,vice versa。每个节点可以独立计算出同样的树(节点树)。同时,Easer code 也不是万能的。当出现所谓的 eclipse 攻击时(和女巫攻击的全网攻击方式不一致,Eclipse 攻击网络某些特定玩家),我们需要根据每个包的电子签名,针对每个数据包生成一个根据质押权重决定的树。所以通过此种优化,Tendermint 一般节点数量被限制在 100-200 个,而 Solana 可以实现 200-1000 个节点数量的扩展。


4) 这篇最后我们提下 Gulf Steam,主要为了解决 mempool 的优化问题。上文提到了,一般客户端用户发起交易,会指向特定的区块哈希,第一轮共识中,该区块哈希需要被全网确认,之后出块节点才能出块,出块时间大概为两轮共识时间 + 延迟 (Solana 出块时间 1 秒 -3 秒左右,一轮共识 0.4 秒 )。同时当有新区块投票后,之前区块 / 投票的 Timout 也会呈现指数级别的增长。这里还有个区块哈希有效性问题。如果第一轮共识结束后,超过这个有效时间(比如 32 个区块),那么这个交易就无效了。所以对于 Client 和 RPC 节点来说,他们也需要去关注并且签名那些注定会执行或者失败的交易,根据他对于该区块哈希到期的时间以及交易在网络确认的时间等信息而决定。所以这里又回到 RPC 节点的作用,一部分是将数据传给 Lead 节点,同时也负责签名相应的交易。通过这种方式大大提升了交易的传播效率 (1-3 秒)。而以太坊池子中,往往是通过 P2P 的 mempool 来进行的。上文也提到,每个节点会设置 Bloom filter,防止交易和其他 filter 相互冲突。通常单笔交易的传播需要 LogN 步骤 (Solana LogN, Tendermint N*2?),会造成网络的拥堵,以及大量的带宽资源,存储以及过滤等步骤带来的计算资源消耗。受到光纤等物理因素限制,单笔交易传播至整个网络需要 6-12 秒,所以出块节点收到待处理交易的时间不容乐观。


在这种机制下,验证节点可以快速执行交易,减少确认时间,Lead 节点转换频率更快速,同时也减少了 mempool 给节点带来了记忆压力。同时,在这种机制下,强调了质押权重给投票过程带来的影响。质押权重高的相应节点可以更快速地获取数据包,参与投票。这个设计,目前来讲我觉得还有待优化的空间。所以只要 2/3 资产质押权重的大户节点都确认,那么一个区块就可以快速敲定,理论上不可回滚。所以金主爸爸们不仅有资金优势,还有信息优势。极端情况下,collude 共谋问题也不能幸免,比如同时 2/3 同时签署了无效的状态转换,肿么办。POS 的确提升了治理的有效性,但是从公平性角度来看,POW 似乎更符合客观逻辑。


相关Wiki

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

CFG Labs
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开