技术解析如何用虚拟通道来创建新型状态通道网络?

    虚拟通道不仅使得付费文件流等新型应用场景成为可能,还可以简化去中心化的Graph查询支付、Filecoin内容检索等应用场景。在本文中,我们介绍了一种叫作虚拟通道(virtualchannel)的新型状态通道结构。虚拟通道不仅使得付费文件流(点击,查看demo!)等新型应用场景成为可能,还可以简化去中心化的Graph查询支付、Filecoin内容检索、带有经济激励机制的状态提供者网络等有趣的应用场景。?动机让我们来设计一个免信任的付费文件流支付系统。这个系统中有seeder(上传文件者)和leecher(下载文件者)。leecher从多个seeder那里付费下载一份文件的不同部分。使用以太坊主网交易来支付费用是不可能的,因为以太坊主网的吞吐量低于每秒50笔交易,而且(截至5月28日发稿时)最低转账成本也在2美元以上。OptimisticRollup和ZKRollup可以提高吞吐量并降低交易成本。StarkEx的ZKRollup可以将吞吐量提高至每秒3000笔交易,同时将每笔交易的成本降至0.03美元。假设leecher愿意支付1美元下载1GB大小的文件,且整个文件以256KB为单位切分成了多个部分,leecher需要支付大约5000笔费用。当网速为20MB/s时,用户每秒支付80次费用,且每笔费用为0.0002美元。Rollup的吞吐量达不到许多leacher的要求,而且交易成本还是太高了。为了达到交易吞吐量和成本要求,基础状态通道是个不错的选择。状态通道创建完成后,leecher就可以免费进行多笔小额付款,且吞吐量只受leecher和seeder之间通信信道的带宽以及二者所使用硬件的影响。基础状态通道带来的挑战是,leecher需要提交交易到主网上,与每位拥有他所需文件部分的seeder都建立状态通道。由于leecher与多位seeder都需要短暂交互,创建多条状态通道的成本是极其昂贵的。虚拟通道可以完美解决我们的设计问题。虚拟通道尤其适用于轴辐式拓扑结构。多位参与者先与一个免信任的中间方建立连接,然后任意两位(或多位)参与者再通过质押的方式创建私密通道。中间方并不知道私密通道内运行的是什么应用。另外,任何参与者都可以发起链上挑战找回自己的资金,即使通道内的其他参与者和中间方处于离线状态或作恶。通过虚拟通道连接各方总的来说,只要Alice和Bob之间有经过中间方的路径,无论网络拓扑结构是什么样的,虚拟通道都可以让Alice开设与Bob之间的私密通道。?背景知识不同的区块链生态系统都将状态通道视为一种可以让少数参与者:建立链上联系(通道)并存入资金;私下交换信息,有条件地在参与者之间转移资金;关闭链上通道,完成各方之间资金结算的方法。我们之前已经在statechannels.org网站上发文介绍了如何构建状态通道(中文译本),以及如何通过一个叫作账本通道(ledgerchannel)的架构让一条状态通道为另一条状态通道提供资金。这些架构要求通道参与者必须在链上建立直接联系。换言之,如果Alice和Bob之前从未交互过,现在却想开通状态通道,他们必须签署(链下)协议,并将资金存入合约内。但虚拟状态通道可以实现以下应用场景:Alice与免信任的中间方创建状态通道。假设这个中间方叫作Irene。Bob同上。在Irene以及创建好的通道的帮助下,Alice和Bob可以创建一条新的私密通道并存入资金。创建这个私密通道不需要通过链上交互。

    我们将Alice和Bob之间的通道叫作虚拟通道。就付费文件流这个应用场景而言,Alice先要通过主网交易与中间方Irene创建一条通道。接着,她可以通过虚拟方式与任意数量的对等节点相连,只要后者与Irene之间也存在链上通道。一旦连接成功,Alice就可以持续支付数据下载费。我们的协议Nitro可以实现以下应用场景:帮助Alice和Bob创建虚拟通道的中间方Irene实际上不在这个虚拟通道内。Irene只是帮忙创建通道,并在通道关闭时结算资金而已。因此,Alice和Bob之间可以实现完全私密的交流,并将Irene排除在这个应用的关键路径之外。更重要的是,Alice和Bob可以在私密通道内运行多个不同的应用,无需Irene针对这些应用实现任何新的逻辑。因此,虚拟通道是通用可编程的多跳状态通道(就像以太坊赋予区块链可编程性那样),因为每条状态通道都可以根据自己的一套「规则」来创建。Alice可以向Bob付费购买某个文件内容。Bob也可以向Alice付费进行Graph查询。所有Nitro通道都是可组合的。因此,获得资金的通道可以通过递归的方式为其它通道提供资金,无论前者是通过何种方式获得资金的。一旦某条通道(直接通过链上合约、账本通道或虚拟筹资的方式)获得资金,它就可以运行任何应用或为其它通道提供资金。?Nitro的替代方案其它协议(如Raiden)可以让两位参与者无需在链上存入额外资金,即可通过中间方创建通道。一个成熟的模式是,使用经过哈希的时间锁通过中间方将Alice的付款路由给Bob。这个模式有一个很明显的缺点:所有付款必须通过中间方路由。一些比较新颖的架构(如Scalar)可以让Alice和Bob通过中间方创建通道后实现点对点付款。然而,这些架构依然需要中间方理解Alice和Bob所运行的应用,因为通道余额最终要通过中间方取回。有了Nitro虚拟通道,中间方就可以被隔离在Alice和Bob之间的通道外。?通道内部的资金转移本文将深入介绍Nitro通道是如何获得资金的,以及免信任的安全虚拟通道是如何实现的!Alice和Bob之间的Nitro通道的资金来自:Alice和Bob联合签署链下协议,使用特定的初始结果创建通道。Alice和Bob按照初始结果指定的顺序存入资金,增加链上裁决者(adjudicator)合约中记录的通道holdings。这里的「结果」是一个指示裁决者在通道最终敲定时如何分配资金的结构(查看我们的最新文章!)在Nitro中,「结果」列出了{目标、数量}对的优先级:{A:7,B:3}命令通道C的裁决者先将7枚代币支付给A(Alice),再将3枚代币支付给B(Bob),并将C的结果归零。这么说有一点不准确:我们其实是按照字典中键的顺序在为目标分配优先级。因此,{B:3,A:7}会先付款给Bob,然后才轮到Alice。你可以将它看作是Python3.7+式的有序字典。上图显示了Alice和Bob是如何根据{A:7,B:3}这一结果从通道C中取走代币的。根据链上裁决者的记录,通道中共有10枚代币。Alice或Bob将通道结果记录到链上。这个结果记录下来后,Alice和Bob就可以取走代币。

    于是,Alice的外部账户中增加了7枚代币,Bob的外部账户增加了3枚代币虽然上述结果暗示目标是用户账户(EOA),但是在Nitro中,通道本身也可以是目标。这样一来,通道L也可以充当「私密账本」,因为Nitro可以让一次性一次性将资金存入账本通道,然后为多条子通道提供资金。Nitro避免了回到Layer1的需求,以及由此产生的延迟和成本!例如:假设C2是一条Nitro通道,{A:4,B:1,C2:5}命令裁决者向Alice支付4枚代币,再向Bob支付1枚代币,然后将C2的代币持有量增加5。C1是账本通道,C2是从账本通道获取资金的通道以上是一个简短的介绍。如果你想要深入了解Nitro,请查看我们的相关博客文章!?如何利用保证来实现免信任架构接下来,我们将介绍当两位参与者没有链上关系时,如何通过一个安全的架构来创建三方通道。这个架构不仅能让账本通道为其它通道提供资金,还能实现虚拟通道。两位参与者分别是Alice(A)和Bob(B),中间方是Irene(I)。我们首次尝试使用一个通道来连接A、B和I。请注意,这不是免信任型架构初始设置:三条独立通道首先要有一对账本通道L(位于Alice和Irene之间)和L'(位于Bob和Irene之间)。通常情况下,L和L'是早就创建好的。这是因为Irene存在的目的就是在人们之间建立连接——Alice可以使用L来同时连接Bob、Cheryl、David和Eve。如果L和L'不存在,L可以使用结果{A:4,I:6}创建,L'可以使用结果{B:6,I:4}创建。L和L'各自在链上存储10枚代币。另外还有一条独立通道J是使用结果{A:4,B:6,I:10}创建的。请注意,在向通道存入资金之前,参与者必须先就这一结果达成共识。一旦J有了资金之后,这条通道就可以用来为Alice和Bob之间创建的任意一条私密应用通道提供资金。步骤1和2:账本通道转变为向J提供资金Alice和Irene将L的结果转变为{J:10}。Bob和Irene将L'的结果转换成{J:10}。这个设计够好了吗?Alice必须考虑以下几点:Bob和Irene是不是可信的?Alice无法控制L'上发生的事。我们来思考一下步骤2之后如何取走J的资金。L和L'的结果被记录到链上。L和L'的资金都被转移到J。代币经由转账操作从一条通道转移到另一条通道。J现在有了20枚代币,可谓资金充足。Alice可以从J中取走4枚代币,Bob可以从J中取走6枚代币。Irene可以从J中取走10枚代币。漂亮!现在每个人都取走了自己应得的代币。

    但是,我们来设想一个场景:Alice和Bob串谋起来欺骗Irene。假设步骤1发生后,Bob拒绝参与步骤2。然后就会发生以下情况:L的结果被记录在链上。现在,J有了10个代币,记录在链上的结果是{A:4,B:6,I:10}。Alice和Bob分别取走4枚和6枚代币。请注意,Bob从J那里获得了6枚代币,尽管他自己根本没有向J转过代币。结果变成了:Alice获得了4枚代币,Bob获得了6枚代币,Irene什么也没有。Irene被坑惨了!你可能会想,如果调换一下结果{A:4,B:6,I:10}中目标的顺序,就可以创建出一个安全的架构。然而,无论怎么调换顺序,总会有人蒙受损失!保证是如何发挥作用的在上述场景中,我们使用了转账操作在通道之间转移资金。通过_转账_操作,资金可以从一个通道转移到目标通道。在本小节中,我们将引入_索取(claim)操作来将资金从目标通道转移至特定的目标地址1。为了实现_索取_操作,我们需要_保证。我们先来介绍一个新的数据结构。保证是指定以下的结果:目标,即,一条通道;数量;优先级,即,目标的优先级列表。优先级的作用是指示裁决者如何改变目标通道的结果项的优先级。我们第二次尝试使用一个通道来连接A、B和I。这次已经是免信任架构了!我们来看一下J是如何获得资金的:初始设置:创建三个独立的通道。通道J是使用结果{A:4,B:6,I:10}创建的。L是使用结果{A:4,I:6}创建的。L'是使用结果{B:6,I:4}创建的。步骤1和2:账本通道转变为向J提供资金(没有先后顺序之分):L的结果更新为{J:{amount:10,priorities:[A,I]}。请注意,我们使用了一种新的符号来表明L的结果只有一项,即,包含目标J、数量和地址优先级列表的保证。L'的结果是{J:{amount:10,priorities:[B,I]}。L和L'的结果各自包含一个_保证_。由于转账操作不支持这些保证,我们代之以索取操作。索取操作接受保证以及保证的目标通道作为输入。我们来看一下索取操作是如何运作的。假设J的结果{A:4,B:6,I:10}被记录到了链上。L的结果{J:{amount:10,priorities:[A,I]}}被记录到了链上。

    如果有人请求执行L的结果中的保证,则会触发三个效果:将4枚代币发送给A,6枚代币发送给I。因为(1),A和I的余额在J的结果中被调整为{B:6,I:4}。L的结果被调整为{}——保证被删除。在这个操作中,优先级的目的是告诉裁决者_跳过_带有B的结果项,这样Irene就可以拿回她在创建L时出的那部分资金。因此,裁决者会先看到保证中优先级最高的目标A,并将4枚代币转给A,J的结果会相应更新。然后,裁决者才会看到目标I。在J的结果中,Irene应该获得10枚代币,但这时(L的结果中)只剩下6枚代币。因此,这6枚代币被发送给了Irene,J的结果再次更新。请注意,优先级一定要是[A,I]而非[I,A]。如果优先级是[I,A],Irene就会通过索取操作获得10枚代币,Alice就失去了原本属于她的4枚代币!有了索取操作,Alice和Bob再也不能串谋起来骗取Irene的资金了。?最理想的情况你可能已经注意到了,为了让Alice他们取回资金,总共需要3个链上操作:将联合通道和转账结果记录到链上,并调用_索取_操作。请注意,这是最糟糕的情况。假设Bob将4枚代币转给Alice后,Alice和Bob想要关闭J。如果Bob和Irene配合的话,则:Alice、Bob和Irene同意以结果{A:8,B:2,I:10}敲定J。Alice和Irene可以更新L,安全地删除为J提供资金的保证。L的结果变成了{A:8,I:5}。现在,Alice可以使用L里的代币为其它通道提供资金了。Alice也可以选择取走资金。总而言之,在协作式案例中,Alice可以使用L内的资金为多条不同的应用通道提供资金,也可以从这些取走资金,无需进行任何链上交易。?虚拟通道在上一节中,我们已经介绍了如何在两个参与方不存在链上关系的情况下创建三方通道。细心的读者应该注意到了,更新J必须经过中间方签字。在本文的开头,我们打算在A和B之间创建一条私密通道。幸运的是,Nitro的可组合性让我们可以创建一条由J提供资金的私密应用通道X。具体架构如下图所示。你已经掌握理解这个架构所需的一切概念了。不过,如果你有任何问题,欢迎向我们提问!X是一条虚拟通道⛵未来计划本文介绍的虚拟通道架构是Nitro协议论文中介绍的架构的进化版。最值得一提的是,这个架构不需要创建专门的保证者通道。Nitro虚拟通道即将引入另一个更新,免去对联合通道的需求。有了这个更新,账本通道L和L'就可以为应用通道X提供资金。本文由MikeKerzhner和AndrewStewart基于TomClose所著论文《Nitro协议》撰写,感谢RobertDrost、JosephChow、GeorgeKnee和ColinKennedy的反馈。注我们还可以将_索取_操作理解成:将资金从L转入J,改变J的结果。将资金从J转入目标地址。如果账本通道的结果是{J:{amount:10,priorities:[A,I]}且J的结果是{A:4,B:6,I:10},索取可以描述成:将10枚代币从L转入J。J的结果变成{A:4,I:6,B:6,I:4}然后在J上调用面向A和I的转账。

声明:文章内容不代表本站观点及立场,不构成本平台任何投资建议。本文内容仅供参考,风险自担!

Pixel Artist Pixel Artist
Happy Kittens Puzzle Happy Kittens Puzzle
Penguin Cafe Penguin Cafe
Animal Connection Animal Connection
Snakes N Ladders Snakes N Ladders
Pixel Skate Pixel Skate
BeeLine BeeLine
Draw Parking Draw Parking
Draw Racing Draw Racing
Soccer Balls Soccer Balls
Happy Fishing Happy Fishing
Crashy Cat Crashy Cat

FREE GAMES FOR KIDS ONLINE