Nervos Fans

简易同步跨片交易协议

2018-08-31  本文已影响3人  526ba0512193

 每晚八点,我们在社区分享知识,等你。

NervosFans 微信公号:Nervosfans

入群请加乐乐微信:sensus113 美果大冰微信:xj73226

备注入群,谢谢!


已知支持异步跨分片通信相对容易,且可以借助跨分片锁定对其进行扩展以解决车票酒店问题。但这个方案远不完美,原因是多轮跨分片通信等待中固有的延迟。若能够在一次交易中同步执行跨分片操作就太棒了,所以,要怎么做呢?

首先,解决方案本身需要将数据/状态执行分离。究其原因,假设在分片A和分片B间存在一笔交易,这笔交易依赖状态并且能改变分片A和B(的状态)。简单起见,假设交易正在预订车票和酒店。绿色是链头。

现在,假设分片A重组,分片B不变。

看到没?酒店订好了但是车票没订。为避免此情形,需要添加一个分叉选择规则,其中A2不再是规范链的一部分时B2也会被(从规范链中)踢走。但这也意味着单个分片上的单场重组有可能会破坏所有分片的稳定性。

这里使用的抽象是状态执行引擎。假设节点知晓某分片(分片A)在N-1高度的状态、N-1高度其他分片的状态根,以及正确的N高度区块哈希(还有分片A中完整区块)。节点的工作是计算出分片A的状态并了解N高度其他分片的状态根。注意,这里假设的是正确的区块哈希是预先提供给出的;若分片恢复,则执行过程也需要恢复,但其他分片上的数据排序会得到保留。

绿色代表已知状态,灰色代表未知状态,黄色代表区块,正方形代表根,圆形代表完整数据。

定义区块包含能够映射address =>tx的交易稀疏Merkle树(或者Patricia树或任意类似的键值结构)。每笔交易本身都是一组[shard[1],address[1], shard[2], address[2] ... shard[n], address[n], data]。想要执行任意分片中的交易tx,必须满足以下条件:

对于tx中指定的所有(分片、地址)对,在给定地址访问给定分片中区块N的键值树时,应该返回交易。

也就是说,交易指定[A, 123, A, 485, B, 769, data]时,想要执行data,交易必须(同时)出现在分片A中区块N的第123位、分片A中区块N的第485位以及分片B中区块N的第769位。

这样,同一高度就不可能出现可以影响到同一个账户的两笔不同交易。这是故意为之,否则,就有可能出现相互依赖的交易塔,而客户端则不得不递归地从其他分片下载非常大的交易集来验证自己分片中的给定交易。这种设计有个可能的不足之处在于分片内允许无限数量的交易,而不需要去指定地址。

客户端可以按如下方式实现此模型:

1. 从分片A种下载区块N。

2. 收集所有“外部引用”(即分片A中来自其他分片的交易地址引用)。对于每个外部引用,向网络请求相关地址在N-1高度的状态Merkle分支,以及N高度的区块。

3. 验证分片A中所有交易的引用是否一致;也就是说,对于(外部或本地)交易T中的每个引用(s_id, addr)),使用在2阶段中为外部引用获取的数据,验证分片s_id的区块值在addr处是否等于T。若不等于,则抛出该交易。

4. 对于通过了步骤3交易,可使用在2阶段中获取的状态数据执行之。

5. 使用加密经济声明、ZK-SNARK或其他机制来收集N高度处有关其他分片的状态根意见。

为保持高度的完美同步,可以使用槽号(代替高度);某个分片无槽号时,视其为空块。注意,此算法在每个高度上需要两轮网络通信:一轮用于获取外部Merkle分支;另一轮用于收集其他分片的状态根声明。


https://ethresear.ch/t/simple-synchronous-cross-shard-transaction-protocol/3097

上一篇下一篇

猜你喜欢

热点阅读