以太坊:通过绕过信标链(TxFlow)重新路由事务,实现更快的交叉分片交易
作者:互联网
我们在构建一条竞争分片链的同时也在研究实现快速跨分片交易的方法。
本文中,假设跨分片交易的执行同一系列单片执行步骤,有某种 proof (或 Receipt/ 凭条)证明之前的步骤已妥善执行,这些证明在各步骤间从一个分片传递到另个分片。
抛开因为讨论延迟的状态变化,接收片需要相当确定交易已实际发生且结果不可逆(比方说不会因为分叉被恢复)。
目前的以太坊分片设计(或者我理解的以太坊分片)认为分片中的验证人几乎没有责任,最终确认的工作只是由 beacon chain 和 casper 来完成。
我们的分片设计中,使用了一种特殊的连续共识算法(我们称之为 TxFlow/ 交易流),这种算法比每 8 秒发送一次区块的提议人机制更为复杂,有自己的一套证明和公证(机制)。
我们的主要关注点在于与 beacon chain 不同步的情况下将跨分片交易路由到另个分片的方法(即确定交易是否正确应用于该状态的方法,且交易不可逆)。
为避免发布区块后出现分叉,运行的算法要有一定的拜占庭共识保证。文章最后,会简单提一下‘分片中恶意验证人数量不太可能低于 1/3’这个事情,毕竟也是当前研究中相当活跃的领域。
TxFlow 非正式规范
消息 DAG
TxFlow 中,分配给单个分片的全部参与者(我们称之为验证人)都参与构建消息的 DAG。验证人收集进入自己分片的交易。有时,每个验证人会创建一条消息,其中包含此验证人收集的全部新交易以及来自其他验证人的消息哈希。随后验证人将消息发送给同分片中的其他若干 peer。其他验证人没看到该验证人引用的部分消息时,会主动获取这部分消息。最终形成消息 DAG 的 gossip 协议
消息 A 包含消息 B 的哈希时,定义为消息 A 直接批准消息 B。两条消息间存在一条路径时,为 A 间接批准 B。简单起见,“直接或间接批准”统称为“批准”。
验证人发布消息时,会选择自己已知的全部消息(包括自己的消息),但不知道批准这些消息的其他消息。参考一下消息 DAG:
Carol 发布自己的新消息时,批准了来自 Dave 和 Bob 的消息,但不清楚批准(Dave 和 Bob)消息的其他消息。Carol 不用批准自己以前的消息,因为知道该消息已被 Bob 的消息批准了。
纪(Epochs)
每条消息都有分配给自己的纪。 以下是分配了纪的消息 DAG 示例:
消息 M 直接或间接批准来自超过 2/3 参与者的 E-1 纪消息时,消息 M 被分配到 E-1 纪。上图中有四位参与者。来自 Dave 的灰色消息仍在纪 0,原因是消息仅批准了纪 0 中来自两个验证人(Bob 和 Dave 自己)的消息,这个数字小于 4*2/3 (四位参与者的 2/3)。Dave 的下条消息在纪 1,因为该消息还批准了一条来自 Carol 的纪 0 消息,那么,此消息批准的纪 0 验证人消息数量为 3。
类似地,来自 Bob 的黑色消息批准了纪 1 中来自三个验证人的消息:Carol、Alice 和 Bob 自己,数量超过所有验证人的 2/3,因此消息在纪 2。
简单起见,还是希望每个验证人在每个纪中有条自己的消息。根据上面的定义,验证人可能会跳过某个纪。譬如,考虑下纪 1 中来自 Alice 的消息。该消息在纪 1 中批准了三条消息,因此应该可以在纪 2 中,这样的结果是 Alice 在纪 1 中没有任何消息。为确保每个验证人在每个纪都有消息,我们将纪的计算规则变为计算出的纪的最小值,验证人的最后一个纪加 1 (theminimum of the computed epoch, and last epoch from the validator plus1)。启用此规则会鼓励验证人发布一条跳过的纪中的多条消息(链),如上图所示,Alice 立即在纪 2 中发布一条消息,批准了纪 1 中应用该规则的消息。
领袖(Leaders)
除纪 0 外,我们为每个纪分配一个验证人。假设 Alice 被分配到纪 1,Bob 到纪 2,Carol 到纪 3,Dave 到纪 4。我们把这些被分配到相应纪的验证人叫做领袖。领袖在自己的纪首次发布的一条消息叫做该纪 X 的代表消息,同时发布一个纪 X 的区块。由纪 X 的代表消息批准(较低纪的代表消息不能批准)的全部消息中的全部交易都被包含在此种区块中。代表消息还包含来自领袖的 BLS 签名部分。
其他验证人(直接或间接)批准代表消息时,会发布验证人自己的 BLS 多重签名。此类消息称为背书(Endorsement)。为简化术语,我们假设代表消息是一种自我背书。超过 2/3 的验证人批准代表消息(及其对应的区块)时,意味着超过 2/3 的验证人背书并签署了该消息。此类区块可被路由块至其他分片执行依赖此区块中包含交易的最终性的一些动作。
考虑下上面的 DAG。Alice 被分配到纪 1,Bob 到纪 2,Carol 到纪 3。纪 1 中来自 Alice 的首条消息是她的代表消息。Bob、Dave 和 Carol 首先发布了直接或间接批准 Alice 代表消息的消息时,说明他们(Bob、Dave 和 Carol)每个人都包含自己的 BLS 签名部分。代表消息和签名(背书)消息如图所示。
得到超过 2/3 是验证人背书时,区块被发布。因此,上面的图片中得到 3/4 的背书后,Alice 的区块被发布(3/4 包括 Alice 自己的代表消息本身,如,Dave 和 Bob 在纪 2 中发布了各自的背书时,区块即可),而 Bob 和 Carol 的区块则尚未发布,因为 Bob 只有 2 个背书,Carol 有 1 个(包括领袖自己的背书部分)。
跳区块
这里还有最后一个问题需要解决。某个纪的领袖离线或故意延迟区块该怎么办? 或者说,纪 X 的一个区块在纪 X-1 的区块之前被发布(可能出现这种情形),会怎样?可以通过以下方式解决:首先,我们来修改下消息被认定为已背书的条件(已背书说明区块被签名)。符合以下情形时,验证人 V 才能在其发布的消息 M 中为纪 X 的区块背书并签名:
· M 批准纪 X 的代表消息;
· V 之前发布的其他消息未批准纪 X 的代表消息;且
· V 之前发布的其他消息未批准任何纪高于 X 的纪的代表消息。
尽管文中没有明确地证明上述条件,但根据加粗段中描述,纪 X-1 的区块不可能在纪 X 的区块之后发布。注意,M 本身批准多个代表消息是没问题的(例如,上图中 Carol 在纪 3 中的消息仍可背书并签名 Alice 和 Bob 的代表消息);来自同一验证人的之前的某消息批准了后来纪的代表消息时,批准代表消息的消息不被认作是背书(因此跳过了签名),如下图所示:
这种方法在简单用例中的效果很好,简单修改方也能用在一般用例中。我们先考虑下这些简单的情形:
-
一个纪 X-1 的区块被发布、一条纪 X 的代表消息被发布并得到超过 2/3 验证人的背书。这种情形下,区块 X 可被发布,系统可继续其操作处理更多区块 .
-
一个纪 X-1 的区块被发布,纪 X 的代表消息尚未发布,纪 X+1 的代表消息已发布且得到超过 2/3 的验证人背书。此情形下(假设恶意验证人不超过 1/3)纪 X 的代表消息不可能得到超过 2/3 的验证人背书,原因是背书了纪 X+1 的消息的(超过 2/3 的)验证人中已经没有诚实的验证人可以背书纪 X 的代表消息(原因见加粗部分有关‘认定消息为已背书的条件’)。因此,发布纪 X+1 的区块不受未来发布纪 X 区块的影响(因此跳过了纪录 X 的区块)。
接下来,再考虑另外一种情形:· 纪 X-1 的一个区块被发布,纪 X 的代表消息被发布并得到 2/3-1 的背书,纪 X+1 的一条代表消息被发布并得到 2/3+1 的背书。在这种情况下,可能有三种情况:这个例子,有三种可能情形:
-
观察者不知道还有另外两个验证人已签名 X 的代表消息且已发布纪 X 的区块;
-
观察者不知道其他的验证人已签名区块 X+1,因此不再签名区块 X 且区块 X+1 已发布;
-
未签名 X 和 X+1 的验证人(此类验证人数量少于 1/3)均为恶意或离线验证人,且不会发布任何其他消息。
没有验证人能发布区块 X+1,原因是区块 X 可能由于(1)的原因被同时发布。没有验证人能发布区块 X,原因是无法得到超过 2/3 的签名。没有验证人能能等待进一步的信息,原因是由于(3)可能没有更多的信息可用。
为解决这个问题,我们对 TxFlow 做了两条最终修改。
首先,纪 X+1 的领袖发布自己的代表消息时,若此消息直接或间接批准 X 的代表消息,则区块 X+1 被发布时,区块 X 也得以发布,即使区块 X 没有超过 2/3 的背书。
其次,纪 X+1 的领袖准备好发布自己的代表消息但暂未看到 X 的代表消息时,领袖在 DAG 上发布了一条特殊的消息,要求其他验证人保证若未来出现 X 时不对其进行背书(或较低纪中任何未经纪 X+1 代表消息批准的代表性消息)。
我们把这类特殊消息称为出界消息。有其他验证人发布了批准区块 X 出界消息的消息,但是没对纪 X 本身的代表消息做背书,则未来来自该验证人的任何消息都不能被视为对纪 X 的背书,即使此类消息已批准纪 X 的代表消息。若验证人发布的消息首次批准了区块 X 的出界消息,也批准了区块 X 本身,则视该消息为 X 的背书。
一旦出界消息得到超过 2/3 的批准,纪 X+1 的领袖发布自己的代表消息批准对出界消息的全部批准。
若对出界消息的批准也对 X 背书,则自然生成 X+1 对 X 的间接批准,因此两个区块都被发布。否则,有超过 2/3 的验证人不再能够签名 X (除非是恶意验证人),因此可以安全地发布 X+1。
考虑以上的 DAG。Bob 错过了 Alice 发布的代表消息,因此 Bob 发布了一条出界消息,要求他人不签署 Alice 纪的区块。
Alice 批准了这条消息,但同一条消息也批准了她自己的代表消息。Carol 和 Dave 只批准了该条出界消息,未批准 Alice 的代表消息。若最右边来自 Bob 的消息(Bob 的代表消息)批准了 Carol 和 Dave 的消息但未批准 Alice 的消息,则 Alice 纪的区块被踢出(因为 Bob、Carol 和 Dave 已经承诺未来不会背书和签名区块)。若 Bob 的消息批准了 Alice 的消息(Dave 和 Carol 的消息可批可不批),那么一旦 Bob 在自己的代表消息上积累了超过 2/3 的背书,Alice 的区块就会与 Bob 的区块一起被发布。
这种方法存在一定的活跃性(liveness)问题(X 的领袖要求他人拒绝 X-1 时,X+1 的领袖由于看不到自己的代表消息,也可以要求他人拒绝 X)未在本文中直接涉及。
交易执行与验证
上述的协议只能就区块(以及交易)的顺序达成共识,不能就新状态达成共识。
确定顺序前不能执行或验证交易,因此知晓纪区块之前不能执行任何交易。
为解决这个问题,我们将背书与签名分离:验证人首先发布带有背书的消息(根据上述有关“背书认定”的规则),随后开始验证区块中的交易,交易被验证并执行后,使用新的 Merkle 根为状态和签名发布第二条消息。
注意,决定区块顺序的第一条消息(背书)。必须始终按照 TxFlow 共识定义的顺序处理交易。验证人 V 看到纪 X 的代表消息时方可验证纪 X 的交易。即使 X+1 的领袖错过了 X 的代表消息,V 也会发布 X 的代表消息作为对来自 X+1 的出界消息的回应,只要 X+1 的领袖不会试图审查 X (若审查,领袖会忽略来自 V 的消息),纪 X 的纪区块会被发布。
注意,若超过 2/3 的验证人错过了来自 X 的代表消息,X+1 的领袖只能审查来自 X 的纪区块。否则,领袖将无法收集足够数量(拒绝 X 的)承诺来跳过 X.
超过 2/3 验证人验证执行全部交易并使用 Merkle 叶子(tips)发布自己的签名后,一个纪区块被签名并发送到其他分片。验证人无恶意行为时,来自所有验证人的 Merkle 叶子(tips)都会匹配。
何以如此复杂?
到目前为止,提案看上去像是过度复杂的以太坊提议人和证明人机制,但复杂性有助于规避上面讨论到的诸多问题。
最重要的是,只要每个分片中恶意验证人占比低于 1/3,就能避免分叉。若经常轮换验证人,恶意者就没办法及时有效的进行破坏,那么也就提供了一种有意义的最终化手段。每个纪的区块被发布之后,可以将跨分片交易路由到其他分片。
其次,所有的不良行为都记录在 DAG 中,因此试图创建分叉、审查区块或者以任何方式偏离协议的行为始终能被轻而易举的检测并惩罚。特别是,若验证人逐个轮换,即使到 beaconchain 的交联跳过了多数最近的区块,验证人仍继续在这些被跳过的区块之上构建消息 DAG (实际上此时并不需要 TxFlow,以太坊分片中也也使用了类似的技术)。
最后,TxFlow 消除了对现实世界时间的依赖(如今的以太坊依赖时钟同步,误差在几秒),实现了去中心化系统中是一项非常艰巨的任务。以太坊中 8 秒的区块时间也是相当随意的,而在 TxFlow 中,区块间隔接近于拜占庭多数验证人认可区块创建所需的最短时间。
最终确定的程度?
上面提到过,除非单个分片中的恶意验证者人占比低于 1/3,否则区块是不可逆。 即便有作恶者试图破坏验证人,只要交联前无法影响到 1/3 的验证人,区块就不可逆。
还有普遍存在的认知是区块链协议无法兼顾扩展、去中心化和安全性。 以太坊和 NEAR 协议的分片设计专注扩展和去中心化,因此在安全性方面将面临一定的挑战。
特别是,分片数量 s 较大时(比方说数百或数千),每个分片只有 1/s 个验证人。控制了系统总权益大部分(比如 30%)的恶意人应该会掌握一个分片中拜占庭多数(超过 1/3)的验证人以及比较大的作恶成功机会。
显然,这样的恶意人可以通过不签署任何消息来拖延分片。尽管拖延不可取,但不会损害安全性本身。
我们观察一下,若攻击者控制了超过 1/3 的验证人,就有能力借由双重支付攻击危及系统的安全性。只要在自己是领袖的纪中创建两条冲突代表信息并将其中一条发送给(未被控制的中)一半验证人,另一条发送给(未被控制的)另一半用于背书和签名即可。幸运的话,签名会在(诚实)验证人发现冲突消息被创建之前产生,那么 1/3+的恶意验证人就会签署这两条消息,使得该纪中的两条代表消有超过 2/3 签名。这两条消息可能包含一笔从同一帐户发送资金到两个不同分片上两个不同帐户的交易,且生成的两个区块会被路由至这两个分片。
控制超过 1/3 验证人的恶意人可以创建任何区块、伪造任何状态变并任意分叉纪区块所在的链。若及时检测到分叉和伪造的状态变化,则可以对其进行挑战和罚没。
如果攻击者控制的验证人数量少于 1/3,则验证交易时 TxFlow 通信期间很可能发觉分叉纪区块链的恶意尝试。那么,如何弄清楚此处确切的保证数量则是目前最有趣的开放性问题。
如果攻击者控制超过 1/3 的验证人,除非引入些人工延迟,否则攻击者可以提议并以无网络或 CPU 开销进行假装验证,进而危及系统。
为此,我们观察到如果攻击者控制系统中低于 1/3 总权益的 N 个验证人,且有 K 个分片,每个分片有 N/K 个验证人,那么对于多数合理的 N 和 K 的值,攻击者控制任意分片中超过 2/3 验证人的可能性可忽略不计。下面给出了一些值(零表示小于 10e-15 的机会):
因此,只要验证人是随机选出的,且经常轮换(使攻击者无法及时适应),那么诚实的验证人就有时间挑战试图分叉链或伪造状态的恶意人。
讨论
如上所述,TxFlow 的价值在于:
1)消除对真实世界时钟的依赖;
2)减少分叉性以及
3)分片中恶意验证人占比低于 1/3 假设下纪区块的最终性(且只要分片中的恶意人数量是不到 2/3,还可能是个检测并预防恶意行为的合理方法)。
重要的是,与多数其他可用 BFT 算法不同,每个块的通信数量非常少(更快的纪区块共识来自于纪区块共识根本无法达成这个事实,若领袖错过了自己的区块的话)。
对我们来说,最有趣的价值是最后一个(某些假设下不用与 beacon chain 通信的也能最终确定),因为跨分片交易变成分片不用交联到 beaconchain 也能最终确定区块的状态这一点还是非常可取的。
标签:背书,验证,批准,消息,分片,TxFlow,区块,路由 来源: https://blog.csdn.net/shangsongwww/article/details/89239180