如果您将交易历史记录视为已经结算,并且只是试图计算状态转换函数,则该过程变得更容易。有几种方法; 一个相当简单的方法可以描述如下:
- 一个事务可以指定一个可以在其中操作的一组碎片
- 为了使交易有效,它必须包含在所有这些碎片的同一块高度处。
- 块中的事务必须按照它们的散列顺序(这确保了执行的规范顺序)
如果分片X上的客户端看到具有分片(X,Y)的事务,则请求分片Y中的Merkle证明,以验证(i)分片Y上存在该事务,以及(ii)分片上的前置状态Y表示交易需要访问的那些数据位。然后执行事务并提交执行结果。请注意,如果在每个块中有许多不同的“块对”,那么这个过程可能是非常低效的; 由于这个原因,只需要块来指定姊妹碎片就可能是最佳的,然后可以在每块级别更有效地进行计算。这是这样一个计划如何运作的基础; 人们可以想象更复杂的设计。
那么半异步消息呢?火车旅馆问题
Vlad Zamfir创建了一个方案,通过这个方案,异步消息仍然可以解决“预订火车和旅馆”的问题。这工作如下。状态记录了最近所做的所有操作,以及任何给定操作(包括交叉分片操作)触发哪些操作的图形。如果操作被还原,则创建收据,然后可以使用该收据来恢复该操作对其他碎片的任何影响; 那些回复可能会触发他们自己的回复等等。这个论点是,如果一个人偏好系统使得回复消息可以像其他类型的消息一样快地传播两次,那么一个在K个回合中完成执行的复杂交叉分片事务可以在另外的K个回合中完全恢复。
这个计划会引入的开销可以说没有得到充分的研究。可能存在触发二次执行漏洞的最坏情况。很显然,如果交易具有更加孤立的影响,这种机制的开销较低; 也许可以通过有利的天然气成本规则激励孤立执行。总而言之,这是高级分片更有前途的研究方向之一。
什么是火车旅馆问题?
下面的例子是Andrew Miller提供的。假设用户想要购买一张火车票并预订一家旅馆,并且想要确保这个行动是原子性的 - 无论是保留成功还是两者都不成立。如果火车票和酒店预订应用程序在同一个分支上,这很容易:创建一个事务,试图进行两个预留,并引发异常,并恢复所有事物,除非两个预订都成功。但是,如果两者在不同的碎片上,这并不是那么容易; 即使没有隐含经济/分散关注的问题,这实质上也是原子数据库事务的问题。
只有异步信息,最简单的解决办法是首先预定火车,然后预定酒店,然后一旦两个预订成功确认,预订机制将阻止任何其他人预留(或者至少会确保有足够的地点开放以允许所有预订被确认)一段时间。然而,这意味着该机制依赖于额外的安全假设:来自一个碎片的交叉碎片消息可以在某个固定的时间段内被包括在另一个碎片中。
使用跨分片同步事务,问题更容易,但创建能够进行跨分片原子同步事务的分片解决方案的挑战本身是非常重要的。
如果单个应用程序的使用量超过O(c),则该应用程序需要存在于多个链中。这样做的可行性取决于应用程序本身的具体情况。一些应用程序(例如货币)很容易并行化,而另一些应用程序(例如某些类型的市场设计)则不能并行化,必须进行串行处理。
有分片区块链的属性,我们知道一个事实是不可能实现的。
阿姆达尔的法则 指出,在应用程序具有任何不可并行化组件的任何场景中,一旦容易获得并行化,不可并行化组件就很快成为瓶颈。在一个像以太坊这样的通用计算平台中,很容易想出非并行计算的例子:一个跟踪内部值x并设置x = sha3(x,tx_data)的契约就是一个简单的例子。没有分片方案可以给这种形式的个别申请超过O(c)的表现。因此,随着时间的推移,区块链协议将会越来越好地处理越来越多的应用程序类型和应用程序交互。