分片中的挑战之一是,在进行调用时,默认情况下没有硬协议保证,由该调用创建的任何异步操作都将在任何特定时间范围内完成,甚至完全没有; 而是由某方在目的地碎片中发送触发收据的交易。这对于许多应用程序来说是可以的,但是在某些情况下,由于以下几个原因可能会有问题:
- 可能没有任何明确的激励方可以触发给定的收据。如果发送交易的好处很多政党,那么有可能是悲剧的最公地效应如果当事人试图等待更长的时间,直到别人发送的交易(即玩“肉鸡”),或者干脆决定送交易是不值得单独交易的。
- 横跨碎片的天然气价格可能是波动的,在某些情况下,执行上半年的操作迫使用户“追踪”,但用户可能不得不以更高的天然气价格来追踪。这可能会由于DoS攻击和相关的悲伤形式而加剧。
- 一些应用依赖于交叉分片消息的“等待时间”(例如火车和旅馆示例)的上限。由于缺乏硬性保证,这些应用程序将不得不具有较低的安全裕度。
人们可以试着想出一个系统,在某些碎片中生成的异步消息在一定数量的块之后自动触发目标碎片中的效果。然而,这要求每个分片上的每个客户在计算状态转换函数的过程中主动检查所有其他分片,这可能是低效率的来源。最熟知的折衷的办法是这样的:当从碎片A以高度的收据height_a
被包括在高度碎片乙height_b
,如果在框高度差超过MAX_HEIGHT
,则在碎片B中的所有验证器创建的块从height_a + MAX_HEIGHT + 1
给height_b - 1
受到惩罚,这个惩罚成倍增加。这些处罚的一部分给予最终包括该块作为奖励的确认者。这使状态转换功能保持简单,同时仍强烈激励正确的行为。
但是如果攻击者同时从一个碎片向碎片X发送一个交叉碎片调用呢?在数学上不可能及时包含所有这些联络吗?
正确; 这是个问题。这是一个建议的解决方案。为了从分片A到分片B进行跨分组联络,呼叫者必须预先购买“凝结分片B燃料”(这是通过分片B中的交易完成的,并记录在分片B中)。凝结碎片B燃料具有快速滞期费率:一旦下令,每块失去1 / k的剩余效能。碎片A上的交易随后可以将凝结的碎片B燃料与其创建的收据一起发送,并且可以在碎片B上免费使用。碎片B块专门为这些交易分配额外的燃料空间。请注意,由于滞期规则,对于给定的碎片,在任何时候最多可以存在GAS_LIMIT * k的凝结燃料,当然可以在k个块内填充(事实上,由于滞期,但由于恶意验证器,我们可能需要这个松弛的空间)。如果太多的验证人恶意地不包括收据,我们可以通过免除验证者来填充收据空间,尽可能多地从最旧的收据开始。
在此预购机制下,想要进行交叉分片操作的用户将首先预先购买所有将要进行操作的分片的燃料,过度购买以考虑滞期费用。如果操作会创建一个收据,触发在B碎片中消耗100000瓦斯的操作,那么用户将预先购买100000 * e(即271818)碎片B凝结的瓦斯。如果该操作反过来在碎片C中花费100000天然气(即,两个间接级别),则用户将需要预先购买100000 * e ^ 2(即738906)碎片-C凝结的燃料。注意,一旦购买被确认,并且用户开始主要操作,用户可以确信他们将与燃气价格市场的变化隔离,除非验证者自愿地从收据非包含惩罚中失去大量的资金。
燃料?这听起来很有趣,不仅是跨分片操作,还有可靠的分片内调度。
确实;
您可以购买碎片A中的凝结碎片A燃料,并从碎片A向其自身发送保证的交叉碎片。虽然注意到这个方案只支持在很短的时间间隔内进行调度,并且调度对于这个块是不准确的; 只能保证在一段时间内发生。
是否有保证的调度,分割内部和交叉分割,有助于抵制试图审查交易的大多数共谋?
是;
如果用户未能获得交易,因为共谋验证者正在过滤交易并且不接受任何包含该交易的块,则用户可以发送一系列消息来触发一系列有保证的预定消息,最后一个消息重建交易在EVM内部并执行它。如果不彻底关闭有保证的调度功能,并严重限制整个协议,防止这种规避技术实际上是不可能的,因此恶意的验证者将无法轻易做到。