LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 硬核 | 一份关于支付网络中路由问题的全面研究 - 律动BlockBeats

硬核 | 一份关于支付网络中路由问题的全面研究 - 律动BlockBeats

2020-10-16 区块律动BlockBeat 来源:区块链网络
原文来源: Shor ,上海交通大学博士


区块链因 Layer 1 的交易吞吐量上限而常被诟病,离线支付网络(off-chain payment channel network,PCN,下文统称「支付网络」)提供了一种「线下支付+线上结算」的解决方案,为区块链世界的支付(及其泛化成的各类交互)赋予了几乎无限的交易吞吐量。因而,支付网络成为了当前最为热门的区块链研究与工程实践方向之一。


经过多年国际学者与工程的发展,支付网络的若干子研究方向已有了大量的论文研究和工程实践,已经不易遍历阅读和详尽了解。然而,当前阶段对于这一重要的研究方向,虽然多数区块链领域的人士对其基本思想有所了解,但对其最新进展具有较全面追踪的国内极客与学者还不多。


本综述系列面向对这一领域具有兴趣的极客和学者,剖析若干子方向,归纳最新研究进展、提出笔者的思考。作者是热爱研究的 Nervos 小伙伴Shor,现为上海交通大学博士。


本文中,我们默认读者具备了对于支付网络(off-chain payment network)的基本了解。在部分描述中,我们会将支付网络看作一张图论意义上的图(graph),每个参与者看作一个节点(vertex),每个支付通道看作一条图上的边(edge)。所以下文中笔者会不自觉地用「图」来指代一个支付网络,用「节点」来指代一个参与者,「边」字来指代一个支付通道。


路由,即一个需要在支付网络上发送交易的人和交易接收者与图上其他节点共同互动而决定支付路径的过程。当然,严格而言,这不一定是一条路径,而可能是一系列路径组成的一个有向无环图(directed acyclic graph, DAG),由于其他学者似乎尚未对此范畴采用新名词,因而笔者将此系列路径的总和命名为transaction pattern。


基于网络流的路由协议


用一个网络流模型刻画支付网路的整体状态具有以下优势:首先,网络流准确刻画了各支付通道的总额度、余量,使用现有的最大流算法可以找到两点之间可以达到的最大支付总额,并且高效地找出一组可行路径。接下来,笔者简要介绍一下网络流问题。


Hint:「基于网络流的路由协议」是笔者所拟的名称,其在大多数文献中对应的词组是Source Routing。其原因是这一类路由的过程得由源节点本地完成,其过程中默认源节点掌握了整张支付网络的拓扑结构,并且可以动态探测(probe)任意支付通道中的余量。然而,所有已有的 Source Routing 方案都是基于最大流算法的,所以笔者大胆地改换了称呼,以便读者理解(另一大原因是笔者在研究展望部分将提出一种并非source routing范畴的基于网络流的路由协议)。


网络流问题简介


我们用网络流模型中的一个残量网络(residual network)表述一个支付网路的整体状态(configuration),其本质是一个四元祖,其中 V

是节点集合,每个节点代表一个支付网络中的参与节点,是边集,每条边代表了一个支付通道,

表示各边的残余通量。结合支付网路的应用需要,我们不同于网络流传统地增加表示各通道建立之时确立的最大通量


最大流是在网络流模型上的一族线性规划问题。其中从 s

到 t 的单源单汇最大流 (问题是:



这个基于线性规划的严谨定义并不方便观众们理解。笔者画了以下的图片来帮助读者理解最大流问题的定义。下图中,

s1 到 t1

的最大流为 10 单位。



倘若把 s1

到 t1

的 10单位的额度全部用尽,并不只一种方案,其中一种「增广」方案使用后如下图。


常用的最大流算法包括预留推进算法(HLPP)和一类基于增广路定理的最大流算法,其中包括了Edmonds-Karp算法以及他的衍生算法如ISAP算法和Dinic算法。


这些算法都具有极高的最坏情况下的理论复杂度,和往往远低于理论复杂度的可观运行效率。例如,考虑一张有 N节点 M

条边的流量图,Edmonds-Karp 算法的理论计算复杂度高达,Dinic 算法的理论计算复杂度高达

,而他们在正常的稀疏随机图上的执行效率很高,普通 CPU 可以在百毫秒内求出千量节点的最大流。


不难发现,对于大额支付,我们可以通过最大流算法得到两节点之间的最大可能支付额度。如果支付金额小于这个额度,我们也就通过最大流算法确立了一个支付方案。


2. 基于灯塔节点的路由协议


基于灯塔(landmark)节点的路由协议的总体思路如下。首先,每个节点都有资格成为灯塔节点,每个节点都有权利选择让哪些灯塔节点来协助路由。这个大前提基本保证了路由方案的去中心化特性不被打破。


然后,为了提供一定的额度隐私性并增加支付成功的概率,每一笔支付的额度被分为

份,每一份由不同的灯塔节点协助完成传输。对于不分片的情况,我们认为

。而灯塔协助传输的方式则是根据自己的视野为这笔金额安排一条通道,并通过与这些通道上的节点通讯获取这个通道上可以通过的最大额度。


早期方法


基于 Landmark 的路由协议思路来自于计算机网络领域的研究。其中的常见组件如下。


双向 BFS 寻找最短路径


熟悉算法的读者了解,在无边权的有向图上,从单源出发的广度优先搜索(Breath-First Search, BFS)序列性质保证: BFS 树中各节点到源节点的路径,即该节点到源节点的最短路径或最短路径之一。每一个 Landmark 节点维护两棵以自己为源节点的 BFS 树,一棵 T1基于 PCN 图,一棵 T2

基于将所有通道方向反转后的 PCN 图。当然,对于无向图而言,这两棵树是一致的。由此,对于一个从u 到

v 的路由需要,先在 T1中找到 u

到 landmark 节点的路径,再在 T2

中找到 landmark 节点到 v

的路径。这两个路径拼接起来,就得到了从 u

到 v

的一条最短路径。




图嵌入


树基图嵌入(tree-based graph embedding)让每个灯塔节点把所有的视图内的节点视为一棵树,树上的每条边对应了一条支付通道。这样,可以用一种类似 Trie 树的方式,为每个节点用从根节点到该节点的路径编号。例如下图中,

D 节点的标号即为 (0,1)

H 节点的标号即为 (0,1,0)

,J节点的标号即为 (1,0,1)

。当然,我们只是在用二叉树举例,现实实现中这是一颗多叉树,此时的编码范围就不再是 0

与 1之间。对于 k叉树而言,编码范围就成了 0

至 k-1。


通过这样的编码方式,可以高效地确定两个节点之间的一条路径——即从付款节点到两节点的最近公共祖先(lowest common ancestor, LCA)的唯一路径拼接上从 LCA 到收款节点的唯一路径。


SilentWhispers与SpeedyMurmurs


SilentWhisper 的协议本身并不考虑支付网路的动态性,文章中的方案没有考虑额度分片,因而 一次支付仅利用 1

个灯塔节点 L。当然,这个方案可以被扩展到

的分片支付方案,不过这个方案的通讯复杂度随着支付所用灯塔节点的数量平方线性增长。假设现需要处理一笔从 u到 v

的支付,总金额为 c

。支付者将支付金额分为 m

,第的路由交由协助完成。对于每一个


首先,通过双向 BFS 寻找 u

到 v

的最短路径,


随后,通过与路径上各个节点的通讯,确定可以在这条路径上通过的支付金额数量,即这条路径上的最小余量。这一步可以通过安全多方计算(secure multiparty computation, MPC)来完成以保证隐私性。


SpeedyMurmurs 直接采用了分片支付的方案。除此以外,与 SilentWhispers 的一大不同是,SpeedyMurmurs 中灯塔节点利用树基图嵌入的方式提供支付路径,其出发点针对 SilentWhispers(1)双向 BFS 树在动态网络环境下维护的困难性,(2)即使是拓扑距离非常靠近的两个节点间路由也要经过 Landmark 节点,(3)以及极差可并发性的问题。


每一个 Landmark 都根据现有支付通道维护一棵以自己为根节点的 k

叉树。并以此维护对每个视野中节点的编号。假设现需要处理一笔从 u

到 v

的支付,总金额为 c

,利用 m

个灯塔节点。支付者将支付金额分为 m

,第的路由交由协助完成。对于每一个,通过两个节点的编号寻找的树上 u 到 v

的树上路径,完成对应的支付。


3. 基于数据网络方法的路由协议


由于以上的路由方案都没有充分考虑实际支付网路的动态性。所以部分来自计算机网络背景的学者提出了将数据网络中的路由办法直接用到支付网络中的若干方案。由于数据网络的路由理论已经在计算机网路领域非常成熟,这一类方案具有较高的可靠性。动态性也给这类方案提供了非常可观的效率。其中最为经典的是Spider协议。


Spider将支付网络类比为数据传输层,使用数据网络的方法进行动态路由。为了和数据网络的模型匹配,在此方案中,我们依旧假设所有的通道都是双向的。类似于数据网络中的数据包,每一笔交易被拆分为若干金额包通过不同路径寻路。每个金额包被直接通过支付网路通道传输并最终抵达收款者,其转发过程中的节点都锁定了相应额度。在完成了寻路后,根据各个金额包的转发路径完成最终支付。


然而,支付网路和数据网络的一大区别在于通量限制的存在。因此,每个通道都会对应一个队列(pending list)保存所有还没能以当前通量完成传输的金额包。只有当有足够的通量从通道的另一侧传来(等价于本方向的余量增加),这个队列中的金额包才能继续传输。值得注意的是,虽然我们用一个金额包的传输过程来描述动态路由过程,其实质是一 个寻路与锁定的过程,倘若不加注意会把这个路由过程误以为是支付过程。


4. 混合路由协议


通过对Ripple和Bitcoin支付网络的实际分析,最新的调研(Flash 的论文中)发现:


· 支付网路有必要支持大额交易(这一点曾经被质疑过);

· 大额交易需要更加侧重支付成功率,小额交易应该更加注重效率。



基于这一发现,Flash协议用基于最大流的路由方案来完成大额金额的支付,用基于数据网络的路由方法进行小额金额的支付。由此,大额交易的支付成功率和小额交易的效率得以两全。


各类路由方案的对比与分析


笔者在以上表格Tab.1中,列举了各类非混合路由协议的优势与劣势。由于难以量化,具有一定的主观色彩。


5.未来研究展望


接下来,笔者提出若干研究展望,并在文末提出这方面科研中可能遇到的问题。


? 熟悉「基于增广路的最大流算法」的朋友们应该了解,这类算法都需要为每条边配备上 一条「反向边」用来描述一种算法中需要用到的回流。而我们可以惊讶地发现,这种回流正好对应地刻画了双向支付通道中从另一个方向的额度冲抵。因而增广路定理保证了哪怕在支付网络上无规则地「增广」,最后也一定会完成任一笔不超过最大流额度的支付。这样,我们就得到了一种完全「动态」的基于最大流的路由算法。这一点似乎并未被现有文献提及。当然,对于绝大多数小额交易,用这个算法太过于杀鸡用牛刀了。但笔者相信对于早期支付网络中遇到的巨额交易,这个思路会派的上用处。


? 可以用「最小费用最大流」来取代底层最大流,使得有多种选项时算法可以挑出一组长度最短、总过路费最少的路径方案。学过一种「最小费用最大流」算法的朋友此时应该能明白笔者的寓意,在此不再展开。


? 通过支付网络相关智能合约代码的重构,或者通过另类landmark节点的设立,「指导」参与节点建边,以系统性地改进网络的拓扑结构。笔者曾对可能由各个landmark引向的结构做过不少畅想,其中包括基于hypercube、以landmark为根的平衡树、以landmark为根的link-cut-tree等等。


如想在这一方向(支付网络中的路由问题)深入科研,尤其如果在以缩短平均跳数(hop)为目的,可能存在两大问题:


第一个问题


实事求是地,当前的支付方案在当前的支付网络规模中已经做得够好了。根据SpeedyMurmurs论文中的实验数据,其已经可以在鼎盛时期的Ripple网络中达到平均2到4跳数(hop)的水准。在此之上再做优化又能如何呢?更优美且能在未来百千万、上亿规模支付网络中取得更好结果的算法,在当前支付网络下兴许反而因为较大的「常数」而并不能取得一个更好的结果。当然,基础研究是要面向未来大规模支付网络的未来的,但面向未来的研究得要在大规模的网络上进行模拟实验才能具有公信力。接下来笔者来阐述一下大规模支付网络的拓扑结构的模拟是如何不可为的。


第二个问题


难以进行合理的模拟实验。首先,实事求是地说,当前阶段的现实网络中的多数参与者尚且是少数极客精英和资本,其拓扑结构肯定和未来的真实网络大相径庭。其次,笔者认为社交网络中的若干模型并不能真实反应支付网络未来之拓扑结构,例如,笔者并不觉得社交网路中常用的「Watts图」可以刻画好未来的这个网络,因为大多数节点不会去建很多条边使得图的density达到出现small-world phenomenon的threshold,Watts图的大前提不会成立。总而言之,笔者认为,一个对未来支付网络拓扑结构的研究,于今至关重要,是若干支付网络更多研究发展的大前提。


原文链接

—-

编译者/作者:区块律动BlockBeat

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

知识 支付 Nervos
LOADING...
LOADING...