Skip to main content

Solana 集群

Solana 集群是一组验证人,共同为客户交易服务并保持账本的完整性。 可能存在着多个集群。 当两个集群都来自同一个创世区块时,它们会趋向收敛。 否则,他们就会忽略了另一个集群的存在。 发送到错误集群的交易会慢慢被拒绝。 在本章节,我们将讨论创建集群、节点加入集群、共享账本、确保账本被复制以及处理有漏洞和恶意的节点。

创建一个集群#

在启动任何验证节点之前,首先需要创建一个创世配置。 该配置引用了两个公钥,一个铸造和一个引导验证节点。 拥有引导验证节点私钥的验证节点负责将第一个条目附加到账本。 它使用铸造帐户初始化其内部状态。 该帐户将保存由创世配置定义的原生代币数。 然后,第二个验证节点联系引导验证节点,来注册为一个 验证节点。 然后,其他验证节点将在集群的任何已注册成员中注册。

验证节点会收到领导者的所有条目,并提交投票以确认这些条目的有效性。 投票后,验证节点需要存储这些条目。 一旦验证节点发现存在足够多的副本,它将删除自身的副本。

加入一个集群#

验证节点通过发送到控制台(control plane)的注册消息进入集群。 控制台使用 八卦(gossip) 协议实现,这意味着节点可以向任何现有节点注册,并期望其注册传播到集群中的所有节点。 所有节点同步所需的时间与参与群集节点数的平方成正比。 从算法上讲,人们都认为它非常慢,但是牺牲时间所换来的,就是一个节点可以确保它最终拥有与每个其他节点相同的信息,并且任何一个节点都无法审查该信息。

将交易发送到集群#

客户端将交易发送到任何验证节点的交易处理单元(TPU) 端口。 如果该节点处于验证节点角色,则它将交易转发给指定的领导者。 如果处于领导者角色,则该节点将传入的事务捆绑在一起,对其打上时间戳,来创建一个条目(entry),然后将其推送到集群的 数据中心(data plane)。 进入数据中心后,交易将由验证节点进行验证,从而将交易有效地添加到账本中。

确认交易#

Solana集群能够在亚秒级的时间内确认(confirmation) 最多150个节点,并计划扩展到成千上万个节点。 一旦完全实施,确认时间预计只会随着验证节点数量的对数而增加,而对数的基数又很高。 例如,如果基数为一千,则意味着对于前一千个节点,确认将是三个网络跃点的持续时间加上一个最慢验证节点进行投票所花费的时间。 对于接下来的一百万个节点,确认仅增加一个网络跃点。

Solana将确认定义为从领导者为新条目添加时间戳到达成账本的绝大多数投票为止的持续时间。

八卦网络增长到一定规模后,就会变得太慢而无法实现亚秒级确认。 将消息发送到所有节点所花费的时间与节点数的平方成正比。 如果区块链想要获得低确认率并尝试使用八卦网络来做到这一点,它将被迫集中到少数几个节点上。

可以使用以下技术组合来实现可扩展的确认:

  1. 使用VDF样本对交易打上时间戳并签名。

  2. 将交易分为几批,将每笔交易发送到单独的节点,同时

    每个节点都与对等节点共享其批次。

  3. 递归地重复上一步,直到所有节点都具有所有批次。

Solana以固定的时间间隔(称为插槽)轮换领导者。 每个领导者只能在其分配的时段内产生条目。 领导者因此对交易加上时间戳记,以便验证节点可以查找指定领导者的公钥。 然后,领导者对时间戳进行签名,以便验证节点验证签名,证明签名者是指定领导者公钥的所有者。

接下来,将交易分成批处理,以便节点可以将交易发送给多方,而无需进行多份复制。 例如,如果领导者需要将60笔交易发送到6个节点,则它将把60笔交易的集合分成10笔交易的批次,并向每个节点发送一个交易。 这能够让领导者将60笔交易放在网络上,而不是每个节点60笔交易。 接着,每个节点都与对等节点共享其批次。 一旦节点收集了全部6个批次,它将重建60个交易的原始集合。

一批交易只能进行多次拆分,直至它变得非常小,信息头成为网络带宽的主要负载。 在撰写本文时,该方法最多可扩展至约150个验证节点。 为了扩展到成千上万个验证节点,每个节点可以将与引导者节点相同的技术应用于另一组相同大小的节点。 我们称这种技术为 (涡轮区块传播)Turbine Block Propogation