eltoo:适用闪电网络即链下合约的简化升级机制
Lightning Network

eltoo:适用闪电网络即链下合约的简化升级机制

Christian Decker
Christian Decker

一年多前,三支闪电网络部署团队共同合作开发协议栈的通用规范。到如今,这项通用规范以及我们的三个闪电网络部署都已稳定并且可用,现在是时候继续前进了:进一步改善协议、添加新的功能,进行简化的同时修复缺陷。

使得闪电网络成为可能的核心创新之一是一个链下更新机制,能够重新商议一个新的状态,并确保旧状态无法在链上进行结算。今天我们很高兴发布最新的研究论文,此论文的内容是关于第2层协议的全新、简化的更新机制,我们称之为eltoo

eltoo的工作原理

我们可以将链下协商看作几方之间的一个合约协议,将清算看作向法庭呈现证据以供判断最终状态,而这里的法庭就是区块链。因为所有的更新都在链下进行,我们需要想一个办法,让链上的法庭能够在下判决之前听到各方呈现的论据。假设交易一方提出要对合同进行清算,我们就需要有一个机制来推迟最后的清算,好让交易中的另一方有机会提供一个更加近期的状态。法庭必须继续等待新的状态,指导最终决定根据最后一次更新的状态来作出裁决。令人出乎意料的是,创建这个为第二层协议定制的区块链所需的要求,比特币区块链都已经满足了。

图1:eltoo协议执行的一个例子,展示将一个更新交易重新绑定到一个更早的交易上,或直接绑定到最初的交易上,从而能够跳过中间状态。只有最后的清算交易会在区块链上确认。

在eltoo中,每个状态都由一组两个交易代表:一个更新交易花费合约的输出(output)并创建一个新的输出,以及一个清算交易花费新创建的更新输出,并根据预先约定好的方式分开资金。输出拥有一个脚本,允许新的更新交易能够立即被附上,否则在可配置的超时之后会附上一个清算交易。如果交易参与者在超时失效之前就更新达成一致,他们将创建一个新的更新交易,花费之前的输出,并双重花费相关的清算,从而使之无效。

反复让之前状态失效,以在新的状态上达成一致,这就构成了一长串由更新交易组成的链,这条链最终会被最新的清算交易终结。但这就产生了一个重大的缺点:如果我们要清算的话,就不得不在区块链重播整个更新的链。这还不如就在链上进行整个协议。eltoo最主要的贡献就是使得我们可以跳过中间的更新,将最终的更新交易连接到合同创建。为了实现跳过中间的更新,我们提出了一个新的SIGHASH旗——SIGHASH_NOINPUT,这将使得交易输入可以被绑定在任意一个具有匹配脚本的交易输出上。由于所有之前更新交易输出的输出脚本都能匹配之后的输入脚本,我们就能将一个之后的更新绑定到任意一个之前的更新,于是就能够跳过任意数量的中间更新了。这篇论文包含了该协议的全部结构,包括如何建立这些脚本的细节。

改进闪电网络

上文展示的是一个更新机制,让一个交易通道的终端能够重复地调整其余额以及为状态添加更多像HTLC之类的高级建设。

原本的闪电网络论文主要的贡献就是这样一个更新机制,那么是不是表示我们要用这个协议替代闪电网络?当然不是!

图表2:闪电网络栈中不同的子协议。

闪电网络规范不再是单个协议的规范,而是一整个协议栈的规范,每个协议都有自己的职责。eltoo并不是要取代整个闪电网络栈,而是要替代原本的更新机制,保持与堆栈其他部分的向后兼容性。

和在原本的闪电网络论文中展示的机制——LN-惩罚(LN-penalty)——相比,eltoo拥有本质上完全不同的平衡取舍;LN-惩罚使用一个惩罚系统来整治不遵守规则者,而eltoo则只需要执行链下合约最新达成协议的状态。这将为基于此更新机制的协议带来重要的可用性和安全性。

其中一些原因是,在eltoo中,所有参与者共享一组共同的交易,不像LN惩罚需要参与者在可以访问的交易上具有不对称,以便定制对行为不端者的对策。这项改变可以消除闪电网络中的有毒信息(toxic information)。有毒信息来自状态过时的交易,如果发生泄露的话则将导致资产损失。除了交易参与方不遵守规则之外,如果一个节点忘记了升级版本(例如从备份中恢复),则也会导致这种情形。而eltoo则完全避免了这种情况的发生,因为只有达成一致的状态才能被清算(也就是说eltoo是没有惩罚机制的)。

参与者的数据管理也被简化了:参与者不再需要储存失效状态的算力原象,也不再需要储存失效的HTLC了,因为其所附着的清算交易将永远不会被区块链承认。唯一需要储存的是最新的更新交易、相对应的清算交易,以及可能还需要储存该笔清算花费的HTLC。此外清算过程也被简化了,只需要将最新的更新交易绑定至最初的设置输出,等待超时失效后即可广播清算交易。

我们可以将升级输出与SIGHASH_SINGLE结合,来使得能够在清算时可以将额外的输入和输出附加到更新交易上。这可能看起来只是个小改动,但却能够允许清算时将费用附加到更新交易中,而不需要提前制定一个固定的费率。在目前的安装中,我们可能要在试图链上确认交易前几个月就确定一个固定的费率,这就会强迫我们预测费率市场将如何变化;这将导致过度保守的估计。如果能够推迟费率选择,我们将不再需要在费率上达成一致,甚至在费率过低的情况下修改提高费率。

功能旗(feature flag)允许一个节点在第一次连接到同伴节点时为一个新的功能表示支持,而这个功能使得eltoo能够在如今的网络上逐步进行部署,而不需要创建一个全新的网络。

闪电网络之外

作为一个普通的第2层更新机制,eltoo也可用于闪电网络之外的任何系统。例如,eltoo可以帮助创建多方链下合约,现在的条件下最多可以允许7个不同参与方,和Schnorr签名结合后则可以允许任何数量的参与方。

其中一个这样的多方链下合约是Burchert等人的论文中提到的通道工厂,作为一种可扩容的方式在单一链上交易的基础上来为任意数量的支付通道提供资金,以及以动态的方式重新平衡或重新分配,而完全无需涉及区块链。

通往eltoo之路

在安装eltoo之前,还需要对比特币进行一个小小的改动:引入SIGHASH_NOINPUT签名旗。几个月前,在研究瞭望塔以加强闪电网络通道安全性时,曾经讨论过这个问题,但并没有正式提出方案。现在这个方案被写进了eltoo的论文中。

我们邀请比特币社区来阅读我们的提案,并参与讨论。我们希望能够就SIGHASH_NOINPUT的使用达成共识,从而使之能够被收入未来的比特币脚本软分叉中。这样做将能够使得闪电网络更加可靠、简单,安装新的更新机制,这个机制将能被用于许多其他应用。

If you have specific preferences, please, mark the topic(s) you would like to read: