在所有的分片当中,状态分片是最具挑战的分片方式。状态分片的关键是将整个存储区分开,让不同的分片存储不同的部分,每个节点只负责托管自己的分片数据,而不是存储完整的区块链状态。状态分片可以减少状态的冗余存储,使得整个区块链网络具有存储的可扩展性。
⑴ 跨分片信息通信不可避免
在账户型系统中,状态分片是按照账户的地址进行分片的,并且一个特定的分片只会保留一部分状态,而不像是交易分片那样每个节点都保存整个网络中的所有状态。
假设A创建了一笔交易,将支付B一笔钱。这笔交易将由第一个分片进行处理,一旦该笔交易被验证,关于B的新余额的信息就必须与他所在的分片进行共享。如果这两个帐户由不同的分片进行处理,那么这可能需要进行频繁的跨分片通信和状态交换。跨分片通信可能又会降低状态分片的性能。
⑵数据的可用性是必须考虑的问题
状态分片的第二个挑战是数据的可用性。我们必须考虑这样的场景:由于某种特定的原因,一些特定的分片遭到了攻击而导致其脱机。由于分片并没有复制系统的全部状态,所以网络不能再验证那些依赖于脱机分片的交易。
解决此问题的方法是维护存档或进行节点备份,这样就能帮助系统进行故障修复以及恢复那些不可用的数据。但是,这样就使得一些节点将不得不存储系统的整个状态,同时这还会引发一些中心化的风险。
⑶网络节点调整需要逐步进行
任何分片机制中需要考虑的另一个要点是,确保分片在抵御攻击和失败时是具有弹性的,网络分片必须接受新的节点并以随机的方式将这些分配给不同的分片。简而言之,网络必须能够在一段时间内进行节点的重新分配。
在状态分片的情况下,重新分配节点是非常困难的。由于每个分片只保留了状态的一部分,所以在一次重新调整网络的过程中,必须要防止调整过大而导致在同步完成前可能会出现的整个系统失效的问题。为了防止系统的中断,我们必须对网络进行逐步调整,以确保每个分片在所有节点被清空前仍有足够多的旧节点。
而新节点在加入分片之前,需要等待同步完该分片中的状态信息之后才可以正式加入分片并提供算力。
值得注意的是,一条公链可能会同时使用多种分片技术,它们之间并不互相矛盾。从网络分片到交易分片再到状态分片,在技术实现难度上来看,它们的难度依次递增。我们在描述一条公链所采取的分片技术的时候,往往以它用到的最难的技术作为其标签。