状态通道
状态通道让参与者可以安全地进行链下交易,同时最大限度地减少与以太坊主网的交互。 通道对等方可以进行任意数量的链下交易,但只提交两个链上交易以开启和关闭通道。 这样便可实现极高的交易吞吐量,并为用户降低了成本。
前提条件
什么是通道?
公共区块链,如以太坊,由于其分布式架构而面临可扩展性挑战:链上交易必须由所有节点执行。 为了保持网络去中心化,节点必须能够使用普通硬件来处理区块中的交易量,因而限制了交易吞吐量。 区块链通道允许用户在链下交互并依靠主链的安全性完成最终结算,从而解决了这个问题。
通道是简单的对等协议,允许双方进行多笔交易,然后只将最终结果发布到区块链。 通道使用加密算法证明其生成的摘要数据确实是一组有效中间交易的结果。 “多重签名”智能合约确保交易是由正确的各方签署。
相关方通过通道执行和验证状态变化,最大限度减少以太坊执行层上的计算量。 这就减少了以太坊拥塞,也提高了用户的交易处理速度。
每条通道都由一个在以太坊上运行的多重签名智能合约管理。 要开启一条通道,参与者需要在链上部署通道合约并将资金存入其中。 双方共同签署一项状态更新来初始化通道的状态,之后便可以快速、自由地进行链下交易。
要关闭通道,参与者将最后一个双方协定的通道状态提交到链上。 然后,智能合约根据每个参与者在通道最终状态下的余额分配锁定的资金。
对等通道在下列情况下非常有用,即某些预先确定的参与者希望频繁进行交易而不会产生明显的开销。 区块链通道分为两类:支付通道和状态通道。
支付通道
由两个用户共同维护的“双向账本”,是支付通道的最佳描述。 账本的初始余额是通道开启阶段锁定到链上合约中的存款总额。 支付通道转账可以立即执行,而且除了最初在链上创建一次通道以及最终关闭该通道外,其余时间无需区块链实际参与。
账本余额的更新(即支付渠道的状态)需要渠道中所有各方的批准。 通道更新在所有通道参与者签署后被视为最终确定,这和以太坊上的交易非常相似。
支付通道是最早的扩容解决方案之一,旨在最大限度减少简单用户交互(例如,以太币转账、原子交换、小额支付)中的高成本链上活动。 通道参与者相互之间可以进行不限金额的即时、无费用交易,只要他们的转账净总额不超过存入的代币。
状态通道
除了支持链下支付外,尚未证实支付通道可用于处理通用状态转换逻辑。 创建状态通道是为了解决这个问题,并使通道可用于扩展通用计算。
状态通道与支付通道仍有很多共同点。 例如,当用户通过交换加密签名的信息(交易)进行交互时,其他通道参与者也必须对该信息签名。 如果提出的状态更新没有获得所有参与者的签名,则被认为是无效的。
但是,除了保存用户的余额外,通道还会跟踪合约存储的当前状态(即合约变量的值)。
这使两个用户之间在链下执行智能合约成为可能。 在这种情况下,智能合约内部状态的更新只需由创建通道的对等方批准即可。
虽然这解决了前文描述的可扩展性问题,但它对安全性有影响。 在以太坊上,以太坊状态转换的有效性是按照网络的共识协议强制执行的。 因此,不可能对智能合约状态提出无效更新,或者修改智能合约的执行。
状态通道没有同样的安全保障。 在某种程度上,状态通道是主网的缩小版。 由于执行规则的参与者有限,发生恶意行为(例如,提出无效的状态更新)的可能性增加。 状态通道的安全性源自基于的争议仲裁系统。
状态通道如何运作
状态通道中的活动基本上是一系列涉及用户和区块链系统的交互。 用户大多数情况下在链下相互交流,只有在开启通道、关闭通道或解决参与者之间的潜在争议时才会与底层区块链交互。
以下部分概述了状态通道的基本工作流程:
开启通道
开启通道需要参与者将资金存入主网上的智能合约。 存款还可以用作虚拟标签,因此参与者可以自由交易,而无需立即结算付款。 只有当通道在链上最终确定时,各方才会相互结算并提取各自标签的余额。
这笔存款还可以作为保证金,保证每个参与者诚信行事。 如果在争议解决阶段判定存款人犯有恶意行为,合约将罚没他们的存款。
通道对等方必须签署一个他们一致同意的初始状态。 该初始状态将作为状态通道的创世块,之后用户便可以开始交易。
使用通道
在初始化通道的状态后,对等方进行交互,他们签署交易并相互发送交易进行批准。 参与者使用这些交易发起状态更新,并签署来自其他人的状态更新。 每笔交易包括以下内容:
一个随机数,作为交易的唯一 ID 并防范重放攻击。 它还标识状态更新发生的顺序(这对于解决争议很重要)
通道的原有状态
通道的新状态
触发状态转换的交易(例如,Alice 向 Bob 发送 5 个以太币)
通道中的状态更新不会像用户在主网上交互时那样在链上广播,这与状态通道最大限度减少链上足迹的目标一致。 只要参与者一致同意状态更新,它们就与以太坊交易一样最终确定。 如果出现争议,参与者只需依赖主网的共识。
关闭通道
要关闭状态通道,需要将各方一致同意的通道最终状态提交至链上智能合约。 状态更新中引用的详细信息包括每个参与者所实施行为的次数和获准交易的列表。
在验证状态更新有效(即,已由所有各方签署)后,智能合约最终确定通道状态并根据通道结果分配锁定的资金。 链下进行的支付被应用到以太坊状态,每个参与者都会收到其剩余部分的锁定资金。
上述场景代表了成功案例下的情况。 有时,用户可能无法达成一致并最终确定通道状态(失败案例)。 失败案例可能包括以下任何一种情况:
参与者离线并且未能提出状态转换
参与者拒绝共同签署有效的状态更新
参与者试图通过向链上合约提出旧的状态更新来最终确定通道状态
参与者提出无效的状态转换供其他人签署
每当通道中的参与者之间无法达成共识时,最后的选择是依靠主网的共识来强制执行通道的最终有效状态。 在这种情况下,要关闭状态通道,就需要在链上解决争议。
解决争议
通常,通道中的各方事先同意关闭通道并共同签署最后一个状态转换,然后将其提交到智能合约。 一旦更新在链上获得批准,链下智能合约的执行就会结束,参与者会带着他们的资金退出通道。
但是,一方可以提交链上请求以结束智能合约的执行并最终确定通道状态 — 而无需等待对方的批准。 如果出现上述任何破坏共识的情况,任何一方都可以触发链上合约以关闭通道并分配资金。 这样就实现了去信任,确保诚实的参与方可以随时撤出他们的存款,无论另一方的行为如何。
要处理通道退出,用户必须将应用程序的最后一次有效状态更新提交至链上合约。 如果该状态更新得到证实(即,带有所有参与方的签名),那么资金就会按照有利于它们的方式重新分配。
但是,执行单用户退出请求会有延迟。 如果关闭通道的请求获得一致批准,则会立即执行链上退出交易。
由于存在欺诈行为的可能性,延迟在单用户退出中开始发挥作用。 例如,通道参与者可能尝试通过在链上提交较早的状态更新来最终确定以太坊上的通道状态。
作为一种对策,状态通道允许诚实用户通过在链上提交最新的有效通道状态来挑战无效的状态更新。 状态通道的设计使得一致同意的较新状态更新优先于较早的状态更新。
一旦某个对等方触发了链上争议解决系统,另一方需要在一定时限内(称为挑战窗口)做出响应。 这样用户就可以挑战退出交易,尤其是在另一方应用过时更新的情况下。
不管是哪种情况,通道用户总是拥有强大的最终确定性保障:如果他们拥有的状态转换已由所有成员签署并且是最新的更新,那么它便与常规链上交易具有相同的最终确定性。 他们仍必须在链上挑战另一方,但唯一可能的结果是最终确定他们所拥有的最新有效状态。
状态通道如何与以太坊交互?
尽管状态通道是以链下协议的形式存在,但仍具有链上部分:开启通道时部署在以太坊上的智能合约。 该合约负责控制存入通道的资产,验证状态更新,并对参与者之间的争议进行仲裁。
与二层网络扩容解决方案不同,状态通道不会向主网发布交易数据或状态确认。 然而,它们与主网的联系比侧链更紧密,这使得它们更加安全。
状态通道依赖以太坊的主要协议来实现:
1. 活性
开启通道时部署的链上合约负责通道的功能。 如果合约在以太坊上运行,则通道始终可用。 相反,即使主网正常运行,侧链也会随时失效,致使用户资金面临风险。
2. 安全
在某种程度上,状态通道依靠以太坊来提供安全性并保护用户免受恶意对等方的侵害。 正如后面部分所讨论的,通道使用欺诈证明机制,允许用户挑战以无效或过时的更新最终确定通道状态的企图。
在这种情况下,诚实参与方将通道的最新有效状态作为欺诈证明提供给链上合约进行验证。 欺诈证明使互不信任的各方能够进行链下交易,而且不会让他们的资金在交易过程中面临风险。
3. 最终确定性
由通道用户共同签署的状态更新被认为与链上交易一样有效。 尽管如此,所有通道内活动只有在以太坊上关闭通道时才能获得真正的最终确定性。
在乐观情况下,双方可以合作、签署最终状态更新并在链上提交以关闭通道,然后根据通道的最终状态分配资金。 在悲观情况下,若有人试图通过在链上发布不正确的状态更新进行欺骗,双方的交易在挑战窗口结束之前不会最终确定。
虚拟状态通道
状态通道的简易实现是在两个用户希望在链下执行应用程序时部署新合约。 这不仅不可行,而且否定了状态通道的成本效益(链上交易成本可能迅速增加)。
为了解决这个问题,人们创建了“虚拟通道”。 与需要链上交易才能开启和终止的常规通道不同,虚拟通道可以在不与主链交互的情况下开启、执行和最终确定。 甚至可以使用这种方法在链下解决争议。
该系统依赖于所谓的“账本通道”(已在链上获得资金)的存在。 双方之间的虚拟通道可以建立在现有账本通道之上,并由账本通道的所有者作为中间人。
每条虚拟通道中的用户通过一个新的合约实例进行交互,账本通道能够支持多个合约实例。 账本通道的状态还包含多个合约存储状态,允许在链下于不同用户之间并行执行应用程序。
就像常规通道一样,用户交换状态更新以推进状态机。 除非出现争议,否则仅在开启或终止通道时才必须联系中间人。
虚拟支付通道
虚拟支付通道的运作原理与虚拟状态通道相同:连接到同一网络的参与者可以传递信息,而无需在链上开启新通道。 在虚拟支付通道中,价值转移通过一个或多个中间人进行,并保证只有预期的接收者才能收到转移的资金。
状态通道的应用
支付
早期的区块链通道是简单的协议,允许两个参与者在链下进行快速、低费用的转账,而无需在主网上支付高额交易费。 如今,支付通道仍然适用于专为兑换和存入以太币和代币而设计的应用程序。
基于通道的支付具有以下优势:
吞吐量:每条通道的链下交易数量与以太坊的吞吐量无关,而以太坊的吞吐量受各种因素的影响,尤其是区块大小和出块时间。 通过在链下执行交易,区块链通道可以实现更高的吞吐量。
隐私:因为通道位于链下,参与者之间的交互细节不会记录在以太坊的公共区块链上。 通道用户只有在向通道中存入资金和关闭通道或者解决争议时才需要进行链上交互。 因此,通道适用于希望进行更多私密交易的个人。
延迟:如果双方合作,通道参与者之间进行的链下交易可以即时结算,从而减少了延迟。 相反,在主网上发送交易需要等待节点处理交易、产生包含该交易的新区块并达成共识。 用户可能还需要等待进行更多的区块确认后,交易才能视为最终确定。
成本:当一组参与者需要长时间交换大量状态更新时,状态通道尤其适用。 唯一的成本是开启和关闭状态通道智能合约;在通道开启和关闭之间,每个状态变化的成本都比上一个更低,因为结算成本是相应分配的。
在二层网络解决方案(例如卷叠)上实施状态通道,可以使它们对支付更具吸引力。 虽然通道可以降低支付成本,但在通道开启阶段在主网上建立链上合约的成本可能会变得很昂贵 — 尤其是当燃料费飙升时。 基于以太坊的卷叠提供了更低的交易费,并且可以通过降低设置费用来减少通道参与者的开销。
微交易
微交易是指低价值的支付(例如,不足一美元),商家无法在不产生损失的情况下处理它。 这些实体必须向支付服务提供商付款,但如果客户支付的利润太低导致无法盈利,这些实体就无法支付这笔款项。
支付通道通过减少与微交易相关的开销来解决这个问题。 例如,互联网服务提供商 (ISP) 可以为客户开启支付通道,允许他们在每次使用该服务时逐一进行小额支付。
除了开启和关闭通道的成本外,参与者不会在微交易上产生更多费用(无燃料费用)。 这是一种双赢局面,因为客户在为服务支付多少费用方面拥有更大的灵活性,而且商家也不会失去有利可图的微交易。
去中心化应用程序
与支付通道一样,状态通道可以根据状态机的最终状态进行有条件的支付。 状态通道还可以支持任意状态转换逻辑,因而也可用于在链下执行通用应用程序。
状态通道通常仅限于简单回合制应用程序,因为这样可以更轻松地管理提交到链上合约的资金。 此外,由于定期更新链下应用程序状态的参与方数量有限,对不诚实行为实施惩罚相对简单。
状态通道应用程序的效率还取决于其设计。 例如,开发者或许可以在链上部署一次应用程序通道合约,并允许其他玩家不必上链就能重复使用该应用程序。 在这种情况下,初始应用程序通道将作为支持多条虚拟通道的账本通道,每条虚拟通道在链下运行应用程序智能合约的一个新实例。
状态通道应用程序的一个潜在用例是简单的两人游戏,在游戏中根据游戏结果分配资金。 其中的好处是玩家不必相互信任(去信任),由链上合约而不是玩家来控制资金分配和争议解决(去中心化)。
状态通道应用程序的其他可能用例包括以太坊域名服务名称所有权、非同质化代币账本等等。
原子转账
早期的支付通道局限于两方之间的转账,限制了它们的实用性。 然而,虚拟通道的引入允许个人通过中间人(即多条对等通道)进行转账,而无需在链上开启新通道。
这种路由支付通常被描述为“多跳转账”,属于原子转账(即,交易的所有部分要么全部成功,要么全部失败)。 原子转账使用哈希时间锁合约 (HTLC),确保只有在满足特定条件时才会发放付款,从而降低了另一交易方的风险。
使用状态通道的缺点
活性假设
为了确保效率,状态通道对通道参与者响应争议的能力设置了时限。 此规则假定对等方将始终在线,以监控通道活动并在必要时应对挑战。
但在现实中,用户可能会因为无法控制的原因(例如,互联网连接不佳、机械故障等)离线。 如果诚实用户离线,恶意对等方就可以利用这种情况,将旧的中间状态提供给裁决者合约并窃取提交的资金。
一些通道使用“瞭望塔”机制,这类实体负责代表他人监控链上的争议事件并采取必要行动,例如提醒相关方。 但是,这可能会增加使用状态通道的成本。
数据不可用性
如前所述,挑战无效的争议需要提供状态通道的最新、有效状态。 这是另一个基于假设的规则,即用户可以访问通道的最新状态。
尽管预计通道用户会存储链下应用程序状态的副本非常合理,但这些数据有可能因为错误或机械故障而丢失。 如果用户没有备份数据,就只能寄望于另一方不要使用其拥有的旧状态转换最终确定无效的退出请求。
以太坊用户不必处理这个问题,因为该网络会强制执行数据可用性规则。 交易数据由所有节点存储和传播,并在必要时供用户下载。
流动性问题
要建立区块链通道,参与者需要在通道的整个生命周期将资金锁定在链上智能合约中。 这会降低通道用户的流动性,也会限制通道只能由那些有财力将资金一直锁定在主网上的用户使用。
然而,链下服务提供商 (OSP) 运营的账本通道可以减少用户的流动性问题。 连接到账本通道的两个对等方可以创建一条虚拟通道,他们可以根据需要随时且完完全全在链下开启和最终确定该通道。
链下服务提供商还可以开启包括多个对等方的通道,让通道可用于路由支付。 当然,用户必须为使用的服务而向链下服务提供商支付费用,这对某些人来说可能是不乐意的。
悲伤攻击
悲伤攻击是基于欺诈证明的系统的共同特征。 悲伤攻击不会直接让攻击者受益,但会给受害者带来悲伤(即伤害),因此得名。
欺诈证明容易受到悲伤攻击,因为诚实的一方必须对每一个争议做出响应,即使是无效的争议,否则会面临失去资金的风险。 恶意参与者可以决定在链上重复发布过时的状态转换,迫使诚实方以有效状态进行响应。 这类链上交易的成本会迅速增加,导致诚实方在此过程中遭受损失。
预定义的参与者集
根据设计,组成状态通道的参与者数量在通道的整个生命周期固定不变。 这是因为更新参与者集会使通道的运行复杂化,尤其是在向通道存入资金或解决争议时。 添加或移除参与者还需要进行额外的链上活动,这会增加用户的开销。
虽然这使得状态通道更容易推断,但它将通道设计的实用性局限于应用程序开发者。 这在一定程度上解释了为什么状态通道已被其他扩容解决方案,例如卷叠所取代。
并行交易处理
状态通道中的参与者轮流发送状态更新,这就是状态通道最适合“回合制应用程序”(例如,两人棋类游戏)的原因。 这样就无需处理同时出现的状态更新,并减少了链上合约为惩罚提出过时更新的发布者而必须完成的工作。 然而,这种设计的副作用是交易相互依赖,因而增加了延迟并削弱了整体用户体验。
一些状态通道通过采用“全双工”设计解决了这个问题,该设计将链下状态分成两个单向“单工”状态,从而实现并发状态更新。 这种设计提高了链下吞吐量并减少了交易延迟。
使用状态通道
有多个项目提供了状态通道实现,你可以将它们集成到自己的去中心化应用程序中:
扩展阅读
状态通道
- 认识以太坊的二层网络扩容解决方案:状态通道、Plasma 和 Truebit – Josh Stark,2018 年 2 月 12 日
- 状态通道 - 详解 2015 年 11 月 6 日 - Jeff Coleman
- 状态通道基础知识 District0x
- 区块链状态通道:前沿技术
你还知道哪些对你有帮助的社区资源? 请编辑本页面并添加进来!