欢迎访问中科网!

中科网

您现在的位置是:中科网 > 问答 >

问答

以太坊1.x的同步原子可组合编程技术

发布时间:2021-07-20问答评论
介绍应用程序开发员工需要可以在2平台上创建在不同实行环境中拥有不同分片合约的程序。应用程序开发员工需要可以用他们习惯于与以太币1平台一块用的同步原子可组合编程技术。这

无效的Merkle证明或无效的系统事件
该应用程序可能会提交无效的Merkle证明或无效的System Event消息,从而使System Event消息与Merkle Proof结合用的哈希不会产生与Cross Link的状况根匹配的Merkle根。在这样的情况下,有关事务将失败。
应用程序未提交事务段
应用程序可能会看到从属事务段失败,并决定不再提交任何其他事务段,根事务或信令事务。为知道决这个问题,另一个用户可以等待跨分片事务超时,并提交一个根事务以使整个跨分片事务失败,并提交信令事务和清除事务以解锁所有锁定的合约并移除跨分片事务Id。
应用程序不提交根事务
应用程序可以看到一个从属事务段失败,并决定不提交根事务或发送事务信号。为知道决这个问题,另一个用户可以等待跨分片事务超时,并提交一个根事务以使整个跨分片事务失败,并提交信令事务和清除事务以解锁所有锁定的合约并移除跨分片事务Id。
重放攻击(Replay Attacks)
根事务和事务段与用于签署“开始事务”的帐户有关联,但在交叉分片超时已过期的失败状况下除外。该帐户的买卖将具备一个帐户随机数,这将阻止重放。尝试重放“根事务”和“事务段”的其他用户将失败,由于他们将没办法用签署了“初始事务”的私钥对事务进行签名。
拒绝服务攻击
攻击者可能提交带有正确数据的清除买卖,并带有一个错误的Merkle证明。攻击者可能会重复提交买卖,以试图在ETH推广客户端上进行很多处置。一个大的调用图将致使ETH顾客需要处置很多Merkle证明。通过对无效的清除买卖进行处罚来阻止这种行为。除此之外,任何用户提交有效的清除买卖都会获得少量奖励。
信标链分叉
假如信标链分叉,则需要依据修订的交叉链接重播所有分片上分片块的事务。一些重播的事务可能期望不再存在交叉链接,因此这部分事务将失败而不是通过。在这样的情况下,交叉分片事务将失败,并且任何状况更新的临时状况都将被丢弃。
终结性
一旦最后一次信令买卖完成后的检查点,交叉分片买卖将是最后的。这一般是一个时期中的第一个信标区块。一旦检查点是最后的,所有先前的区块都是最后的,并且隐含地所有先前的交叉链接将是最后的,因此所有分片块都是最后的。

买卖种类

2. 应用程序将叶事务段提交给Shard 3、5、6和7。事务实行可以更新状况并返回值的函数调用。实行事务的EEs会发出系统事件,其中包含有关事务调用和函数调用的信息,包括错误状况和返回结果。在本例中,假设只有Shard 7有任何状况更新。

5. 提交包含调用其他事务段的函数的事务段。对嵌套事务的每一个“层”重复此操作。

安全与活性

7. 应用程序提交根事务,与Shard 2和4上事务段的系统事件信息和Merkle证明。发出系统事件信息,指示应提交整个跨分片事务。

实时参数检查

示例
理解这项技术的最好办法是通过一个例子。想象一下下面显示的调用图。下面写入的段事务是读取状况并返回值的函数调用。下面写入的段事务是写入状况并返回值的函数调用。

8. 该应用程序等待产生一个信标链区块,该信标链区块包括包含提交事务的Shard块的交叉链路。

7. 状况更新被放入临时存储,合约被锁定。

根买卖

应勉励有效清除买卖,以确保参与者提交了此买卖。但无效的清除事务应该惩罚用户。惩罚不应是繁重的,由于信标链重组可能致使无效的清除买卖。

事务处置:

4. 验证“初始事务”事件中的调用图是不是与传入的事务段调用匹配。

实时参数检查用于确保在实行合约代码时,传递给跨分片函数调用的参数的实质值与已签名的买卖段中的参数值匹配。回想一下,在实行事务时,“事务段”的参数值在系统事件中发布,并且应用程序将此信息馈送到“事务段”或“根事务”中,以调用它们所代表的函数。这意味着当代码实行时,EE可以访问来自Transaction Segments的跨分片函数调用的预期参数值。
图显示了在另一个返回值的shard)上调用函数的示例约定代码,然后依据state1的值,可以在另一个不返回值的shard)上调用函数。

1. 应用程序将开始事务提交给Shard 1。这将为跨共享事务保留跨共享事务Id,并指定组成跨共享事务的根事务和事务段的调用图。

6. 该应用程序等待产生一个信标链区块,该信标链区块包括包含提交事务的Shard块的交叉链路。

从没有完成的唯一ID列表中删除唯一ID。
买卖字段包括:

初始买卖日志和证明, 根事务日志和证明 买卖细分日志和Merkle证明, 信令事务日志和Merkle证明。

这部分买卖应该是不收费的,或者甚至应该给予鼓励,以确保参与者在失败/锁定合约的实体停止参与时提交此买卖。无效的信令买卖应惩罚用户。惩罚不应太重,由于信标链重组可能致使无效的信令买卖。

以太坊1.x的同步原子可组合编程技术 以太坊1.x的同步原子可组合编程技术

清除买卖

1. 验证“初始事务”和每一个事务段的日志信息,检查Merkle证明,直到“分片交叉链接”。

除上述买卖种类外,EE需要支持的其他买卖包括:

部署可锁定的合约。 部署不可锁定的合约。 在某些状况下,可以创建专门的事务种类来消除对“start”和“clean”事务的需要。比如假如有一个根事务和一个实行跨碎片读取并且不更新状况的事务段,则可能可以创建无需启动和清除事务的专用根事务。现在正在进一步考虑。

2. 假如根事务日志指示“忽视”,则放弃临时更新并解锁合约。

1. 用动态程序剖析确定事务的调用图和参数值。

信令事务

4. 应用程序将事务段提交给Shard 2以实行函数调用。该事务包括来自在Shard 3和Shard 5上实行的事务的系统事件信息,与显示该信息与作为在Shard上实行的块的一部分的事务有关的Merkle证明。Merkle根可以与分片的信标区块中的交叉链接进行比较。在本例中,假设Shard 2上的事务不会致使状况更新。

其他买卖

5. 在将事务段提交给Shard 2的同时,应用程序将事务段提交给Shard 4以实行函数调用。事务包括在shard 6和shard 7上实行的事务的系统事件信息和Merkle证明。在本例中,假设此事务致使Shard 4上的状况更新。

6. 等待一个区块以发布交叉链接。

以太坊1.x的同步原子可组合编程技术 以太坊1.x的同步原子可组合编程技术

以下内容介绍了一组可能的失败策略,并描述了怎么样处置该策略。
根买卖失败
假如根事务因任何缘由失败,则会创建一个系统事件,该事件指示所有事务段的所有更新都要被丢弃。基于此系统事件,可以用信令事务来解锁所有EE中所有碎片上的所有合约。根事务可能失败,由于:

根事务中的代码可能会引发错误。 传递到根事务中的系统事件消息可能表示事务段之一发生错误。 调用交叉分片函数的参数与函数调用的事务段的系统事件消息中的参数值不匹配。 交叉事务处置块超时后提交根事务。

3. 该应用程序等待产生一个信标链块,该信标链块包括包含提交事务的Shard块的交叉链路。

2. 假如区块编号在超时之后,或者任何“事务段”日志指示错误,则发出指示错误的系统事件。

8. 当这个shard的入口点函数调用完成时,发出一个系统事件消息,该消息与为根事务描述的消息相同。

7. 提交根事务。

1. 假如根事务日志指示“提交”,则应用临时更新并解锁合约。

跨分片处置

3. 提交叶事务段。“leaf”事务是指其函数调用不调用其他跨碎片函数的事务。

逐步处置:

这部分事务用于解除由事务段锁定的合约的锁定。
此买卖包括:

根事务日志信息和显示根事务已成功完成或已失败/超时的Merkle证明。 此分片日志和Merkle证明的事务段,显示哪些合约被锁定。

酒店列车示例

事务处置:

4. 等待一个区块以发布交叉链接。

介绍

以太坊1.x的同步原子可组合编程技术 以太坊1.x的同步原子可组合编程技术

以太坊1.x的同步原子可组合编程技术 以太坊1.x的同步原子可组合编程技术

要进行跨碎片买卖,应用程序将实行以下操作。请注意,用户的应用程序并没做不少事情,大部分复杂性将由库包装程序处置。

根事务包含函数调用,该函数调用是跨分片事务的整体调用图的入口。此事务种类指示代码应根据正常的事务段实行,并且应提交或忽视所有分片上的所有锁定合约。假如事务在超时块之前成功完成,则作为跨碎片事务一部分的所有事务段的结果,所有状况更新都应提交。假如任何事务段失败,或者假如在超时后提交事务,则应丢弃所有事务段更新。
买卖字段包括:

跨分片事务Id 要调用的Shard、EE、Contract、函数和参数。 启动事务日志消息和Merkle证明 对于从该事务实行的代码中调用的每一个事务段: 带有Shard、EE、Contract Address、Function Name、被调用函数的参数值的日志消息 返回结果 是不是有状况更新,并且事务已致使锁定的协定。 对特定区块的交联进行Merkle证明。 注意,事务列表需要根据预期调用函数的顺序。

3. 检查事务是不是已由启动事务日志指示的同一实体提交。

8. 等待一个区块以发布交叉链接。

9. 该应用程序在Shard 4和7上提交信号买卖以解锁Shard 4和7上的合约。

下图显示了实行此复杂的跨分片事务的事务。在该图中,区块由方形框表示,买卖由圆角框表示。编号为N-1的分片区块的已签名状况根会馈入编号为N的信标链块,称为交叉链接。编号为N的信标链块中所有分片块的交叉链接都可用于编号为N的分片块。虚线表示从分片块将交叉链接提交到信标链区块中,与它们可用于信标链块中的分片块。实线表示应用程序将事务提交到事务池中,然后将其包含在分片块中。

2. 提交开始买卖。这可以与下一步并行进行,也可以在下一步之前的一个插槽中完成。

酒店被表示为一个不可锁定的router contract和多个可锁定的酒店room contracts。酒店向旅游社发放ERC 20代币,用于支付酒店客房成本。ERC 20合约包括router contract和每一个帐户的一个或多个付款槽合约。类似地,火车由不可锁定的router contract和多个可锁定的火车seat contracts表示。
为了预约房间,旅游社创建了交叉分片功能调用,用于预约酒店房间和火车座位并支付成本。酒店router contract的工作原理是找到一个适合的房间,该房间在请求的当天可用,但现在尚未预约,然后预约该房间。搜索房间时,代码将跳过目前锁定的room contracts。同样在支付房间成本时,ERC的router contract需要将钱从旅游社的竞价推广账户转到酒店的竞价推广账户。它通过为酒店找到一个没上锁的付款槽合约来达成这一点。
假如可以以编程方法确定哪些合约已被锁定,从而防止合约被锁定,则可以撰写酒店,火车和ERC20合约,以便两家旅游社可以同时实行预约而不会遇见锁定的合约。
其他需要注意的地方
帐户随机数:帐户随机数被视为处于可锁定状况。如此当一个帐户提交一笔买卖,并且买卖现值增加时,该帐户就不会被锁定。
转移:现在该策略只关注函数调用。用这种技术可以在分片之间进行以太币转移。
为所有分片上的Gas付费:假如用户可以在一个碎片上用ETH,并用它为跨分片事务实行的所有分片上的Gas付费,那就太好了。这种技术现在还不可以做到这一点。或许当以太币转移被解决时,这是可能的。
事务大小:此提案中的买卖一般包含多个Merkle证明和其他数据。需要剖析对买卖规模的可能影响。
ETH1.x:假设ETH1.x在分片中的EE中,所有现有合约都可以标记为不可锁定。EE可以支持本文中描述的功能。可以添加其他EVM操作码以允许跨分片函数调用。
应用程序代码:我听到你说,“在应用程序中听起来非常复杂。这种技术难道不应该简化应用程序开发吗?” 答案是,绝大部分复杂性将被吸收到Web3J之类的库中。合约代码和其他应用程序代码应容易明了。

这种跨分片买卖技术依靠于添加到实行环境中的以下功能:

添加到买卖收据中的系统事件消息,可以通过信标链交叉链接从其他分片上的其他EE引用。在EE中,当作为事务目的的函数调用结束时,EE会生成系统事件消息。系统事件消息与合约代码可能产生的应用程序事件消息不同。合约代码不可以产生伪造系统事件消息的事件。 实时参数检查:当合约代码调用进行跨分片函数调用时,请检查实质分片,EE,合约,函数和参数是不是与预期被调用的那些相匹配。 合约可锁定性:部署合约时,需要将其指定为可以锁定或不可以锁定。实行买卖细分时,任何具备状况更新的合约都需要被锁定。假如将合约部署为不可锁定,则没办法将其锁定,并且事务将失败。 临时状况存储和合约锁定:当合约作为跨分片事务的一部分进行更新时,其更新状况存储在临时存储中,并且合约被锁定。假如提交了跨分片事务,则临时状况将替换合约状况并且合约将被解锁。假如忽视交跨分片事务,则临时状况将被丢弃,合约将被解锁。 新的事务种类:EE需要支持本建议后面描述的事务种类。

应用程序开发职员需要可以在2平台上创建在不同实行环境中具备不同分片合约的程序。应用程序开发职员需要可以用他们习惯于与ETH1平台一块用的同步原子可组合编程技术。这篇文章提出了一种可以做到这一点的技术。
比如在下图中,用跨分片调用来获得oracle的值。假如返回的值低于少量,则用“跨分片”调用来购买产品。

5. 用事务段的缓存返回值实行代码。

事务段失败
假如事务段因为任何缘由失败,则会创建一个系统事件,指示它失败。此系统事件可以传递到根事务,以致使整个跨分片事务失败。事务段可能会失败,由于:

事务段中的代码可能引发错误。 传递到事务段的系统事件消息可能指示某个从属事务段发生错误。 用跨分片函数调用的参数与函数调用的事务段的系统事件消息中的参数值不匹配。 在跨分片事务块超时后提交事务段。

9. 提交更新状况下实行事务段的所有分片上的所有信令事务。

以太坊1.x的同步原子可组合编程技术 以太坊1.x的同步原子可组合编程技术

6. 检查代码调用的事务段是不是与开始事务日志中预期调用的事务段匹配。

当应用程序创建用于调用funcC和funcD的事务段时,它需要模拟代码实行。比如假如_param1将为5,state1为2,state2为3,并且在参数为5的状况下funcC将返回10,则需要创建事务段,并将参数值5传递给funcB,将5传递给funcC ,并将13传递给funcD。请注意,假如state1为1,则事务段将仅针对对funcB和funcC的调用进行架构,由于funcD将从来不会被调用。

旅馆和火车问题是一个场景的示例,其中涉及旅游社,该旅游社需要确保跨越三个分片的复杂多合约买卖的原子性。旅游社需要确保他们既预约酒店房间又预约火车座位,或者既不预约酒店房间,也不预约火车座位,因此防止了成功预约酒店房间但火车预约失败的状况,反之亦然。除此之外只有在进行预约后,才需要通过ERC20付款。最后的需要是,买卖需要以其他用户可以预约酒店房间和火车座位并同时付款的方法进行。
想象一下,其中涉及三个分片:旅游社在shard 1上运行,旅馆在shard 3上运行,火车在shard 4上运行。还有第二个在shard 2上运行的旅游社。这是下面的示意图。

事务处置:

假如用跨分片事务Id,则失败。 检查超时区块号是不是为适合的值。 注册跨分片事务Id. 发出包含以下内容的启动系统事件: Tx Origin/Msg Sender:签署买卖的帐户。 跨分片事务Id 从根事务开始的交叉分片函数调用/事务段的分层调用图。对于每一个调用,包括: Shard EE Contract address Data: 函数名字和参数

跨分片事务包含多种事务种类。
初始事物
初始事物指示跨分片事务的开始。此事务用于保留每一个shard和每一个EE的“唯一”跨shard事务Id,并注册根事务和事务段的整体调用图。
买卖字段包括:

跨分片买卖ID. 超时区块编号。 根事务信息。 对于从作为该买卖结果实行的代码中调用的每一个买卖细分: 带有Shard、EE、Contract Address、Function Name、被调用函数的参数值的日志消息 返回结果 是不是进行状况更新和买卖是不是致使合约锁定。 将指定行的Merkle证明合并到交叉链接。 请注意,事务列表需要根据期望调用函数的顺序进行。

10. 应用程序在Shard 1上提交清理买卖,以从未清唯一ID列表中删除交叉分片买卖ID。

广告位