异构 Paxos 和多链原子提交
探讨异构 Paxos 共识机制在多链原子提交中的应用,实现跨链事务的一致性。
目录
异构 Paxos 和多链原子提交
> 异构 Paxos 利用不同区块链验证者集之间的高交集,创建了一种异构共识协议,用于原子多链交易,并扩展了 IBC 的能力,允许在原子交易内链间进行任意通信。
在某些条件下,异构 Paxos 允许进行原子跨域交易,其中学习者不一定共享相同的故障假设。基于异构 Paxos,我们希望利用不同区块链验证者集之间的高交集,创建一种异构共识协议,用于原子多链交易。这将扩展 IBC 的能力,允许在原子交易内链间进行任意通信。
目标
我们希望能够在多个链上原子性地提交一批交易。另一种看待每个批次的方式是将其视为一个单一的、多链交易,由每个链上的子交易组成,以及它们之间的通信。
酒店和火车示例
考虑一个经典示例:如果用户能够在目的地购买酒店房间,他们才想要购买火车票。他们希望这两个交易原子性地完成。如果他们购买了其中一个,而另一个变得不可用,用户会感到失望。
想象酒店预订系统和火车票预订系统分别由不同的区块链管理( 红链和蓝链 )。每条链可能有多个提议的下一个区块,每个区块包含一些交易。在这些区块中,有些用户成功购买,有些则失败:
然而,最终每条链必须选择要提交哪个区块:即下一个区块要参考哪个区块。任何一条链用来做出这个决定的过程都称为共识 。在当今的区块链系统中,它们独立做出选择
希望对用户来说,要么两次购买都成功,要么都失败。不幸的是,我们还没有添加任何内容来提供任何保证!
我们想要提供一种方式将交易捆绑在一起。我们可以想象它们是两条链上的单个区块
实际上,这样的区块将包含一些运行在一条链上的交易,以及一些运行在另一条链上的交易。
遗憾的是,仅仅将交易捆绑在一起是不够的。有可能一条链选择使用组合区块,而另一条链不使用。例如,如果蓝链采用了组合区块,而红链没有采用,那么组合区块中的红链交易将实际上毫无意义。
我们需要的是某种对链的共识协议的调整,使其能够保证(在某些条件下)它们会都同意选择或忽略组合区块。这样用户就可以确信(在某些条件下)最终会同时得到酒店房间和火车票,或者两者都没有(而不是只有其中之一)。
异构 Paxos 是一种可能允许我们构建此类多链原子交易的共识协议。
为什么要在多链原子交易中折腾共识?
虽然 IBC 允许跨链验证信息传输,但它只能通信于交易之间 。具体来说,IBC 无法支持一个交易,其中链 A 上的智能合约向链 B 上的合约发送消息,然后链 B 在同一交易中回复链 A
为什么不用多阶段提交?
当然,我们可以通过构建一个多阶段提交协议来模拟原子交易,让不同的链的状态机作为参与者,并使用 IBC 作为网络。这本质上就是原子跨链交换所采用的方法。这个计划有三个缺点:速度、活性以及一个博弈论问题。
- •速度
多阶段提交需要每个链至少2轮共识。我们提议在一个组合轮内提交所有内容。
- •活性
多阶段提交协议的最终提交阶段,只有当所有链都完成前一个阶段后才能进行。这意味着每条链(或至少参与多链原子交易的资产)最多只有最不活跃的链那么活跃:如果任何一条链崩溃,它们都无法继续。我们希望获得更细致的协议/活性权衡,让交易和链能够明确指定它们要求达成共识和终止的条件。
- •博弈论问题
必须有一条链在提交阶段开始之前执行最终状态转换。这在某种程度上给了这条链一个自由选择 :它可以选择何时(或是否)跨链原子交易完成。这在跨链交易和价格波动的情况下可能很有用。 原子跨链交换试图通过使用哈希锁定资产来解决这个问题,以阻止某条链永久延迟交易。不幸的是,这无法推广到所有可能的跨链交易(具有任意智能合约)。当然,这个“最后预提交”问题也存在于每条链的共识算法中,因此我们希望将现有的共识公平性技术扩展到包括跨链原子提交。
- •多数签名
任何具有即时最终性的共识都可以用法定人数来描述。法定人数是指任何一组能够相互通信的参与者(机器,也称为节点、验证者、接受者或投票者),他们可以最终决定哪个区块将添加到链上,而无需与其他任何人通信。通常, 包含超过三分之二参与者 (或持有超过三分之二权益的参与者)的任何集合都是一个法定人数。关键在于, 同一共识内的任何两个法定人数都必须在其交集中有诚实参与者 ,以确保链不会分叉。否则,如果法定人数 A 和 B 的交集中的所有参与者都是不诚实的,他们可以模拟 ,在法定人数 A 的目的是一种行为方式,而在法定人数 B 的目的是另一种行为方式,因此无法保证法定人数 A 和法定人数 B 会就同一个区块达成一致。如果两个法定人数各自决定不同的区块,链就会分叉。
陪审团
- •示例
考虑红色链和蓝色链。红色链有3个陪审团,绘制为红色三角形。每个红色陪审团都与其他红色陪审团相交,红色链用户接受如果其中一个交点不包含诚实参与者,红色链可能会分叉。
同样,蓝色链也有3个陪审团,绘制为蓝色矩形。每个蓝色陪审团都与其他蓝色陪审团相交,蓝色链用户接受如果其中一个交点不包含诚实参与者,蓝色链可能会分叉。
请注意,两条链都没有单点故障:没有任何参与者位于任何链的所有陪审团中。
现在假设, 正如在权益证明区块链中常见的那样 ,有一些参与者同时出现在红色投票团和蓝色投票团中。在我们的图中,这些交集变成了紫色三角形
- •最佳情况
如果用户认为每个红蓝交叉点都包含一个诚实参与者,那么他们应该能够提交由红链和蓝链组成的原子多链批处理交易。每条链的法定人数保持不变:红链的法定人数足以让红链做出决定,蓝链的法定人数足以让蓝链做出决定。然而,我们需要调整红链和蓝链的共识算法,以便两个链中的诚实参与者能够确保他们不会就提交共享的交易批次是否一致产生分歧。这正是异构 Paxos 所做的事情。
- •当假设错误时
关键在于,每个这样的原子多链批次交易都带有关于其原子性的假设条件:在这种情况下,即每个红蓝交集都有一个诚实参与者。当这样的批次存在错误假设时,有可能一条链会提交多链批次,而另一条链不会。在我们上面提到的火车和酒店房间示例中,这可能导致用户拿到火车票,但没有酒店房间。
幸运的是,Heterogeneous Paxos 不会因为另一条链上出了问题而导致任何一条链卡住:每个法定人数仍然足以使其链做出决定。这与例如 Stellar Consensus Protocol 不同,在后者中,用户无法提前知道自己的法定人数是什么,并且其法定人数取决于其他参与者的信任选择。
有点像一座桥梁
在某些方面,我们的异构共识可能会创建某种类似于可信桥梁的东西:它允许跨多个链进行操作,基于特定的信任假设。其他桥梁设计往往基于多阶段提交,因此我们的将更快,并且不需要锁定资产。
挑战
决定执行哪种异构共识
直观地看,一条链可以尝试同时与其他多条(链的集合)提交多链批次,并在这样做时导致死锁。
示例
假设我们有3条链:红色、蓝色和绿色。每条链有3个见证组。
- •红色链的见证组以红色三角形表示。每对红色链见证组相交,只要这些交点中每个都包含诚实参与者,红色链用户就能确保链不会分叉。
- •蓝色链的见证组以蓝色三角形表示。每对蓝色链见证组相交,只要这些交点中每个都包含诚实参与者,蓝色链用户就能确保链不会分叉。
- •绿链有3个由绿色矩形表示的委员会。每对绿链委员会都相互交集,只要这些交集中的每个都包含一个诚实参与者,绿链用户就可以确信链不会分叉。
请注意,每个红色多数派都交叉每个蓝色多数派(紫色区域)。原则上,应该能够提交一批红色和蓝色交易(一个组合区块),并确保如果每个紫色区域内都有诚实节点,这次提交将是原子的。如果红色多数派决定提交组合区块,多数派交叉中的诚实节点将阻止任何蓝色多数派提交其他区块。
请注意,每个蓝色多数节点都交叉每个绿色多数节点(青色区域)。原则上,也应该可以提交一批蓝色和绿色交易,并确保如果每个青色区域内都有诚实节点,这次提交也将是原子的。如果绿色多数节点决定提交组合区块,多数节点交叉内的诚实节点将阻止任何蓝色多数节点提交其他区块。
回想起来,一个绿色的共识足以让绿色链决定一个区块而无需与任何人沟通 ,而一个红色的共识足以让红色链决定而无需与任何人沟通 。这意味着即使所有参与者都是诚实的,红色的共识也可能决定蓝色-红色组合区块,而绿色的共识可能决定蓝色-绿色组合区块:这些共识不重叠,所以它们可能根本不会互相听到对方的消息。
红链决定了一个红蓝组合块,而绿链决定了一个蓝绿组合块。显示的红方多数节点已经决定了一件事,而显示的绿方多数节点决定了一件不同的事。
在这种情况下,蓝方多数节点除了蓝绿块外无法决定任何其他内容,因为每个蓝方多数节点在与已经决定蓝绿块的那个绿方多数节点相交时,都包含一个诚实节点。同样,蓝方多数节点除了红蓝块外无法决定任何其他内容,因为每个蓝方多数节点在与已经决定红蓝块的那个红方多数节点相交时,都包含一个诚实节点。由于红蓝块和蓝绿块并不相同(在本例中,我们假设它们冲突),蓝链陷入僵局:它无法决定任何内容。
请注意,如果每个红色共识组都与每个绿色共识组有交集(包含诚实参与者),那么这不会成为问题:红色和绿色可以避免做出相互矛盾的决定。
基本局限性
正如我们上面的例子所示,仅仅因为链 A 可以与链 B 达成异构共识,链 B 可以与链 C 达成异构共识,并不意味着链 A 可以与链 C 达成异构共识。关键在于避免在不相容的共识中存在竞争性区块。从某种意义上说,每一轮共识都需要提前知道它将要运行哪种异构共识。直观上,这非常令人沮丧:似乎在我们开始做决定之前,我们必须已经做出了某种决定。幸运的是,我们有一些有前景的方向来解决这个问题。
旁注
David Mazieres 提出,当你事先不知道参与者集合时,共识至少需要 4 轮通信。而 Heterogeneous Paxos 假设我们事先知道所有使用的法定人数,只需要 3 轮通信。这表明我们可能需要至少再一轮来"决定运行哪种异构共识"。相比之下,Stellar Consensus Protocol 基于略微不同的模型,需要 4 轮。在 Stellar 中,参与者对希望进入法定人数的成员有意见,而法定人数也依赖于其他参与者的意见。与 Heterogeneous Paxos 不同,事先无法知道法定人数的大小(因此也无法知道你实际上能否做出决定,甚至无法精确知道你一定能与谁达成一致)。
可能的解决方案方向
提前安排共识
原则上,每条链都可以提前决定每个区块将运行哪种异构共识,而异构共识只有在所有链都同意该异构共识的情况下才会选择一个共享区块。从表面上看,这听起来像是一个多阶段提交:每个区块需要一个(提前)共识轮次,然后一个异构共识轮次。然而,存在两个关键区别:
直到异构共识开始之前,无需指定交易集。
链可以提前任意长的时间安排任意多的异构共识轮次:摊销那次"首次共识"的成本。
每个可能的共识一个链
给定任意一组区块链的投票权要求,我们可以为它们各种投票权要求之间的任意可能的异构共识创建一个新的区块链。在上面的例子中,这意味着除了红、蓝和绿链之外,还会有一个"红-蓝"链和一个"蓝-绿"链 除此之外 :
红蓝链中的红色交易将由红色多数决定,而红蓝链中的蓝色交易将由蓝色多数决定,因此如果存在没有诚实参与者的红蓝多数交集,链可能会分叉,但只追踪蓝色交易或只追踪红色交易的人将不会观察到分叉。
蓝绿链中的绿色交易将由绿色多数决定,而蓝绿链中的蓝色交易将由蓝色多数决定,因此如果存在没有诚实参与者的蓝绿多数交集,链可能会分叉,但只追踪蓝色交易或只追踪绿色交易的人将不会观察到分叉。
在蓝链与红蓝链之间,以及蓝链与蓝绿链之间,我们可以允许直接、无需信任(或许基于 IBC)的通信,这种通信保证在固定数量的区块内到达。这仅仅是因为所有链上的蓝交易都由相同的仲裁团决定。原则上,智能合约可以在需要与绿智能合约进行业务往来时,将状态“移动”从纯蓝链转移到蓝绿链,并在完成业务后返回蓝链。
作为锁
想象在这个"每个可能的共识都有一条链"的世界中编程的一种方式是,将链视为持有对状态的独占锁。特别是,同一时间只有一个链能持有某个状态上的锁,而唯一可能的链是那些存在异构共识的链。每个状态(每个智能合约)需要特定于应用代码来决定哪个链在何时持有它的锁。例如,用户可能会允许酒店-火车-银行链暂时持有他们对银行账户的锁,而他们试图原子性地预订酒店房间和火车票。
降低活性或提高安全性
到目前为止,我们只考虑了使用链已经信任的委员会。然而,如果用户能够启用更多可能的原子交易,或者提高该原子性的安全性,他们可能愿意让某些状态稍微不那么活跃。例如,我们可能会想象一个用户想要将某些交易原子性地提交到红色、绿色和蓝色链上。如果只使用链的原生委员会,这是不可能的:红色链不愿意等待绿色链的任何参与者来决定,反之亦然。然而,假设用户拥有这些交易中涉及的所有状态,并且愿意只在所有三条链都活跃时使用这些状态。
我们可以想象构建一条新的链,其中每个共识组都包含来自红色链、绿色链和蓝色链的共识组。这条链比任何红色、绿色或蓝色链都更安全:它只有在红色、蓝色和绿色链都分叉的情况下才会分叉。这条链也比任何红色、绿色或蓝色链更不活跃:它只有在红色、蓝色和绿色链都提交新区块的情况下才会提交新区块。然而,将状态从任何红色、绿色或蓝色链转移到组合链,再转回,肯定是安全的:数据不会面临损坏的风险,最多只是被卡住。如果用户被授权这样做,他们可以选择这样做。
这完美契合了我们的"每个可能的共识链"模型。在我们的"锁"模型中,我们可以想象某些锁持有者会承担活性惩罚,但可能更安全。应用程序将不得不自行决定何时将数据锁定在哪些链上。
改变仲裁委员会
到目前为止,我们一直假设每条链都有一个静态的投票委员会集合。然而,情况并非如此。例如,在权益证明链中,每当权益发生转移时,投票委员会就会发生变化。如果我们维护一组“桥梁”链,这些链为每种可能的异构共识操作异构共识,那么所有这些链需要同步更新其投票委员会,以保持相同的信任保证。这意味着任何可能改变链的投票委员会的交易都特别难以提交
编程模型
为了利用任何多链原子提交,我们需要将此功能暴露给链内的交易。我们应该提供什么样的 API 或语言功能,以在仍然能够实现异构多链提交的全部功能的同时,最大限度地提高灵活性?我们如何才能让这个功能尽可能易于使用,而又不设置开发人员自寻短见的陷阱?
原子多链交易批处理
对于我们的交易本身,我们希望保留每个源链状态机的灵活性。为了尽可能少地假设它们的状态机,人们可能会像不同计算机交互一样考虑它们之间的交易交互:作为网络通信。我们可以编写一个 API(可能类似于 IBC),其中每个交易可以向和从批次中的其他交易发送和接收字节。这种通信将是同步的:交易实际上是在相同的参与者上一起执行的,甚至可能是在单个执行线程中。区分“原子网络”通信与传统跨链通信有两个关键特征。
- •原子网络通信允许在同一交易内进行通信循环:蓝色链上的交易 A 可以向红色链上的交易 B 发送消息,然后 B 可以再将消息发送回 A,所有这些都可以原子性地完成。IBC 不允许这样做:所有通信都必须在交易之间进行。
- •原子网络通信依赖于共识集合中诚实节点来证明发送了哪些消息。通常,我们不假设所有参与者都能计算所有状态机的所有交易:仅计算他们所在共识集合的状态机。在我们的红/蓝示例中,蓝色共识集合不能等待听取整个红色共识集合的消息,以了解红色交易发送给蓝色交易的消息。他们唯一能保证听到的红色参与者是那些与决定性蓝色共识集合相交的参与者。没有保证这些参与者中的多数是诚实的,仅保证其中一个是诚实的。这个诚实参与者必须能够证明批次中红色交易发送给蓝色交易的消息,以便计算蓝色交易的参与者能够正确计算。
每个可能的共识模型一个链
任何人都可以随时使用异构共识和任何投票权开始一条新链。异构共识链可以为每笔交易设置不同的投票权(只要它们都相交,并且我们接受那些投票权交集缺乏诚实参与者的交易可能存在原子性违规)。我们应该能够在具有相同投票权的不同链上的交易之间建立无信任通信(或许通过 IBC)。这将允许应用程序将“数据”移动到可以执行原子提交的共享链,然后再返回。我们需要的是一个特定的接口,用于指示何时此类移动是安全的,何时批量原子性得以保留,以及一种轻松将状态从一个链转移到另一个链的方法。
这进一步复杂化,因为可能存在希望改变安全或活性保证的交易(见上文),这些交易需要明确承认它们正在转移到活性更低甚至安全性更低的链。这在某种程度上与信息流控制系统中的背书有些不同。
结论
多链批处理交易从根本上非常有益:它们将区块链的一个关键优势(原子交易)扩展到多链环境,使应用程序摆脱单一链的全球排序限制。我们拥有实现这一目标的基本工具,但仍有一些挑战需要克服。我们必须确定在不同时间使用哪种共识机制,并提供相应的编程模型。如果我们能正确处理这个问题,跨链应用的未来将更加光明。