问题
这篇文章主要解决一个问题是,在sharding的时候,如果是基于账户或者状态的分片,以往的算法在分片的时候会根据账户地址或者哈希值进行划分。这是一种随机的分片。这种分片会造成一个问题是会导致跨分片交易过多。
因为一个跨分片交易会转换成为两个子交易。这就导致要处理的交易数量太多,工作负载太大。
并且,存在热分片的情况,各个分片之间的工作负载可能不均衡会产生偏斜。
算法
将账户建模成图的机构,边权位两个账户之间的交易数量。
点为账户。
C(x) 为一个划分下的跨分片交易数量
D(x) 为一个划分下的各个shard 负载不均衡的度量
既要减少跨片交易,又要均匀分配,我们得到如下的优化函数
虽然现有已经有一些 community 检测算法,能够减少跨片交易的数量,但是不能限制各个community的大小,因此会造成负载的不均衡。
CLPA
有限的LPA,LPA会给每个节点一个标号,然后更新标号直到收敛
但是在这个问题中,限制他的迭代次数,就是防止他不收敛,估计是作者在跑这个算法的时候发现部分情况下没法收敛。
在这个函数中也考虑到某个shard的负载太大的问题,因此会有 W k W_k Wk 这个参数来平衡,防止某个shard中的交易太多。
M-shard W-shard
M-shard 负责打包区块。收到state block之后,进行账户的重新划分。
W-shard负责监听,构建state graph,然后运行CLPA算法,生成并共识 state block,将state block
state block中会记录所有 shard的 state root。