2

突破区块链不可能三角(八)——分片(中)

 2 years ago
source link: https://learnblockchain.cn/article/3330
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

本系列文章:


突破区块链不可能三角(八)——分片(中)

重新审视交易系统

当我们已经十分习惯区块链的设定之后,交易的逻辑就变得模糊了起来。

区块链的设定是,所有人都维护一个共同的账本来防止双重支付,这个方法的问题是效率——因为所有人都需要获取,验证并储存所有交易。

于是,分片的逻辑是每个人都只储存这个总帐本的一部分——各个分片各维持自己的分账本,然后,所有的人都不获取其他账本中的交易,但也只能相信别的账本维护者关于它们账本的结果。

分片牺牲的是安全性——在区块链的逻辑中,想要完成一次双重支付需要能够篡改总帐本,因此需要打破所有节点通过共识算法达成的共识,而这通常需要大多数恶意节点的配合。也就是说,除非能和网络中的超过半数(或者1/3)的节点合谋,否则无法进行双重支付。但如果采用了分片,想要进行一次双重支付,只需要和一个分片里维持该分片的节点合谋就够了。

举个例子,假设小红处于分片A,她从分片B收到一笔钱,而这笔钱之前是分片B从分片C收到的,然后分片C又是从分片D收到的……

那么,在什么情况下这可能是一笔假钱呢?

如果分片B中有了超过半数的恶意节点,那么这笔钱可能是假的,因为小红不会验证分片B的账本;同时,如果跨片节点中的超过半数的节点是恶意的,那么这笔钱也可能是假的,因为也许这笔钱在之前已经被付给了其他分片。但除此之外,如果C分片有问题,那么可能这笔钱在付给B分片的时候就已经是假币了,而如果D分片有问题也同样……所以说,最终系统的安全性就干系在安全性最薄弱的一个分片的安全性上。于是,我们降低容错,用随机方法来减小这件事发生的概率,然后要么用一个全局的跨链账本,要么通过经济惩罚来防止这件事发生。

从区块链的分割账本的思路上看,分片到此似乎已经走到了死胡同。

但实际上这里面我们忽略了重要的一环——

最开始,我们是为什么认定“数字货币=一致的账本”的?

作为读者,如果你看到这里还没有晕,说明你已经对于区块链的了解已经相当深了。那么“去中心化的数字货币=一个所有人有的一致的账本”这件事应该已经深深印进你的脑海了。

的确,现在所有的对于区块链的科普实际上都在反复论述为什么这两者是等价的——

小红想付给小明一笔钱,那么小明如何知道这笔钱是真的呢?除了小红的签名来确保小红确实授权了这笔交易并且无法抵赖之外,为了防止双重支付,他还得知道之前的所有交易来确保这笔钱的确从来没有双重支付过——从产生到现在,始终是从一个人手中流向另一个人的。

从这个角度讲,的确,所有人都拥有一个一致的账本是最为直接的思路。

但现在我们面临的问题是:我们已经知道了如果要追求无限扩展,这个思路走不通。

于是,从交易的本质上看,有没有别的思路呢?

我们来看看刚才交易的过程——

小红想付给小明一笔钱,那么小明如何知道这笔钱是真的呢?

我们来结构一下这个问题中的概念——什么是“付钱”,什么又是“真钱”?

先来说什么是“钱”。实际上,在数字货币支付系统中,钱实际上就是一个“我拥有了支配这笔钱的权力,并且我确信我在未来可以成功地向任何人证明这一点的能力”。

这句话听起来有些拗口,实际上的意思就是——我为什么要在乎这笔钱是不是真的?因为我知道如果这笔钱是假钱我以后就有可能花不出去,所以我在收钱的时候一定要验证这笔钱的的确确属于我了,并且未来我想花的时候一定花得出去。

那接下来,“付钱”又是什么意思呢?

其实,付钱就代表着小红有义务向小明提供一个“你以后能够放心地花这笔钱”的证据。而这里实际上有个误区,就是无论在现实的支付系统中,还是区块链里,似乎“验证”都是接收者的义务,比如比特币里——似乎付钱的人只要提交交易给矿工,接下来验证交易的工作就是矿工的了,而等着矿工将交易打包上链,然后等待5个确认是接收者的任务。但实际上,这里面的逻辑是——作为交易的发起者,比如小红,她作为主动发起交易的这方,她有义务保证这笔交易成功。比如说,她想要从小明那买个衣服,那么如果小明没有收到款,或者是小明没法确定收到的是真钱,那他肯定是不发货的。于是,实际上提供一个“我的钱已经付给你了”的证据,是小红的义务。就如同现在你去小卖部买东西,让店主听到一声“某某宝收款xx元”才能拿东西走人一样。

这个证据,在比特币中是一笔在比特币的区块链上的,输出是小明的地址的交易,并且后面还要有5个确认。然而,在比特币中,尤其是现在的比特币中,这件事是由专门的人,称为矿工来完成的。所以说,实际上小红委托了矿工小刚来向小明提供交易成功的证明。作为回报,小红付出交易费。实际上,在早期的比特币中,或者另一些数字支付系统比如Iota中,小红是可以选择不付交易费不通过矿工亲自来做这件事的。

于是,再回头看“小红付给小明一笔钱”这件事,它在数字货币系统中,实质的意义是——小红向小明提供了一份证据,记为P,于是小明能够十分确信他在未来再向其他人任何人,比如Mike,提供P以及一些小明自己可以生成的其他证据之后,Mike也会如同他一样确信未来一定能够花掉这笔钱。

在比特币中,P就是包含了小红付款并且有了5个以上确认的完整的比特币的区块链。这样的证据就可以让小明完全放心地把货发给小红了,因为首先他知道小红没法伪造这个证据,其次他知道由于任何在这个系统中的人都知道这个证据无法伪造,所以,当然未来将一个指向这笔交易的,付款给Mike的交易发上链并且有5个以上确认之后,他可以将这条链作为证据向Mike证明自己已经付款。换句话说,小红给他的证据,是一个所有人包括Mike都能够验证的,这笔钱属于小明的证据,而这个区块之后到小明给Mike的交易所在区块之后的五个区块的链,是小明额外提供给Mike的,自己付款的证据。两者加在一起,是一个完整的“Mike现在拥有这笔钱”的证据。

除了交易的逻辑之外,我们还需要重新审视的一个概念,是比特币中的“理性假设”。

在前文中我们已经介绍了,几乎所有的系统的安全性假设都是一个,即假设大部分节点都是诚实的,而恶意节点的数量(或者所能控制的资源)不超过1/2(或者1/3)。这里的诚实节点和恶意节点的假设就是经典分布式系统中诚实节点和拜占庭节点的假设,也就是说,我们认为诚实节点会忠实地执行算法中的每一个步骤,而恶意节点的行为则是任意的。

但可能很多人都还记得除此之外中本聪曾经在白皮书中做了另一个假设——假设所有节点都是理性的。所谓的理性,就是说节点非诚实也非恶意,他们只是单纯逐利的,如果诚实地执行算法中的步骤是有利的,那么他们就是诚实节点。但同时,他们又要弱于拜占庭节点,因为他们的行为并非任意,而只限于能够为其牟利的行为。

然而,为什么这种理性假设最终在学术论文中消失了呢?

原因很简单——因为这种理性假设不正确。

在第7章中,我们已经介绍了很多关于比特币的改进方案,其中很多是因为比特币有着一些安全性缺陷,比如自私挖矿。这说明理性假设的前提已经被破坏了——因为如果所有的节点都是理性的话,他们在某些条件下应该采用自私挖矿而不是诚实地挖矿。而在后面,有许多论文也给出了比特币算法中的许多行为是不“激励兼容(incentive compatitive)”的,即,实际上理性的节点其实不该做这些行为,也就是说,不该诚实地执行挖矿步骤。

于是,后面共识算法的论文中都抛弃了这个不严谨的“理性假设”,而采用传统的“诚实大多数”的假设。

但理性的问题并没有因为假设的改变而消失。

现在,共识算法的确在“诚实大多数”的假设下安全了,但这个“诚实大多数”的假设是否符合实际,还是取决于节点的理性以及激励机制——如果对于诚实的要求有悖于节点自身的利益,那么这个共识算法的安全性仍旧有问题。

实际上,“诚实大多数”并不是天然成立的。在比特币之前,实际上BFT算法就已经在诚实大多数假设下成立了,但是他们无法被应用到去中心化数字货币中,是因为在没有准入门槛有可能出现女巫攻击的情况下,诚实大多数的假设是不成立的。而比特币引入了一系列的机制,才让我们看到在非许可的网络中,“诚实大多数”这个假设是有可能成立的。而现在,我们其实只是在凭感觉,认为一个“类似比特币”的区块链之中,如果采用了类似比特币的激励机制,那么诚实大多数的假设是成立的,于是这些共识算法可以被采用。但究竟诚实大多数的假设成立的条件是什么,怎样的激励机制才能在非许可的网络里保证诚实大多数,这个问题时至今日仍旧是共识算法研究的一个未解之谜。

而现在,这个问题在分片中变得更加尖锐了——因为分片的区块链已经不是“类似比特币”的区块链了。如果我们还能通过感觉说诚实大多数在其他的区块链中成立,那么它在分片了的区块链中是否还成立就需要打个问号——

打个比方,原本,我们有一个中心化的支付巨头阿狸,它是中心化管理的。当有一笔A地的小红转到B地的Mike的跨境付款的时候,A地和B地当地账本的负责人和一个跨境交易的负责人三个人按照事先约定的流程各司其职:A地账本负责人小刚先改动自己的账本发给跨境交易负责人小兰,后者批准后发给B地负责人Bob,Bob再更改当地的账本,大家通力合作完成了这笔付款。之后,付款人付一笔交易费给阿狸公司,而阿狸公司将交易费平分给他们三个人作为工资。

接着,我们认为小刚,小兰和Bob看上去都是好人,所以我们觉得他们之中最多有一个可能会做出不诚实的举动,于是我们可以用一个去中心化的容错50%的区块链取代这个支付巨头,然后让这个去中心化的机构中的所有交易都通过所有人验证,然后每笔交易的交易费大家分摊。接着,由于大家获得记账权的概率是一致的,所以我们干脆不用分摊每笔交易的交易费,直接让记账的人获得交易费就好了。

然而,现在我们为了提高效率,想进行分工,于是还按照本来阿狸的方法分成了若干部门,每个部门负责一部分交易。而且,为了防止交易者串通公司的人,我们让负责每笔交易验证的部门是随机的。当出现跨部门业务的时候,需要按照流程执行。于是,比如现在来了一笔交易,提交交易的矿工是小刚,于是他收到交易费之后将交易记录在他分片账本,接着将交易传给负责跨境交易账本的处理者小兰,后者处理完之后,交给Bob,然后Bob开始更新他的分片的账本。

这样的做法也许一开始还行得通,但是时间久了问题就会出现。尽管从总体来说,分工之后总体收到的交易费没变,每个人的任务还轻了,而且,由于交易验证是随机的,所以大家赚的钱也没变。但具体到每笔交易里,比如又遇到了刚才我们说过的那笔交易:本来中心化系统大家各司其职挺好的,后来去掉了中心,换成所有人都验证所有交易大家也都能配合,但现在去掉了中心,还要求所有人各司其职,这问题就出现了——

这笔交易里只有小刚收到了交易费,但小兰和Bob都相当于是义务在配合小刚的工作。对于他们而言——既然我拿不到交易费,那么我为什么需要对将这笔交易写入账本这件事上心?那么久而久之,即便是他们三个再怎么是“好人”,也不可能保证自己的行为就能始终是“诚实的”。比如说,如果交易量很大,超出了每个人的处理极限,那么三个人是不是会优先处理自己能获得交易费的交易呢?

这个问题和分片带来的安全性下降是两码事。安全性下降的问题是——一个100个节点的系统,67个诚实节点可以容错33个节点,分片了之后80个诚实节点可以容错20个恶意节点。但这个理性的问题是,由于分片了之后每个节点的工作不再相同,激励机制和每个节点各自的工作不再匹配,所以我们其实没法假设那80个节点仍旧会是诚实的。这个时候,再指着之前的“诚实大多数假设”,说:“根据我们的计算,系统在恶意节点不超过20个的时候仍旧是安全的”,虽然从理论上无懈可击,但在实际中很有可能是行不通的。

顺着这个逻辑,我们也能很快找到通过经济惩罚来防止跨分片交易的问题——好比说,现在我们发现实际上小刚和Mike在大多数情况是诚实的,或者说,大概率所有负责本地分片的人都是诚实的,各个分片之间的账本都能对上,于是为了减轻工作量我们去掉了小兰这个角色,改成大家互相监督,如果谁出了错那么就罚款并且将罚款奖励给举报人。这个解决方案放在公司老板的眼中简直就是神来之笔——撤掉了一个负责监督的人,少发一份工资,然后让其他人义务进行监督,没有额外的报酬,只是罚犯错的人然后把罚款给举报的人。但从打工者的视角看,这种行为同样是不“激励兼容”的——既然没有额外报酬,我为什么要付出额外的劳动去和我的同事做这种零和博弈呢?

自下而上的分片思路

因此,实际上分片这件事从一开始就被数据库分片和以太坊提出的根据网络(地域)分片这两个先入为主的概念带跑偏了。以一个中心化系统的思路去给区块链分片,实际上是一种自上而下的分片思路,相当于从老板的角度,把一个公司拆成了许多部门,然后在没有中心管理的情况下期望所有的部门还按照之前的方式去处理业务。却忽略了这些部门之间的关系也忽略了分片自身的利益,而这实际上和区块链的初衷是相违背的。最终的结果,要么如同网络分片一样,从开始就能看出问题,要么就如同随机分片一样,尽管在“诚实大多数”的假设之下看上去没有问题,但其实诚实大多数这个假设是否成立成了问题。

实际上,从自下而上的角度看,我们应该考虑的是——在已经有分片,即,区块链的每个状态都只储存在部分节点的情况下,应该如何处理交易,换句话说,就是当这个公司已经被拆成独立地部门之后,我们应该重新考虑如何开展业务。

于是,我们回归交易的本质——小红有一笔钱,想要转给Mike,她需要怎么做?

正如前文所述,她需要向Mike提供一个通用的,“Mike现在是这笔钱的所有者”的证据。

当没有分片时,这个证据是一个完整的账本,包含一笔小红给Mike的交易。任何一个矿工都拥有这个完整的账本,于是,小红委托一位矿工打包她的交易,在确认之后,Mike可以从他信任的矿工那里获得这个证据。

需要注意的是——这只是简单易行的现实操作,但从逻辑上讲,需要提供这个证据并且证明它的合法性的人,不是Mike,不是Mike委托的矿工,也不是小红委托的矿工,而是小红本人。

而在分片之后,Mike,Mike委托的矿工,小红委托的矿工,也许都无法独立地提供这个证据,因为它们都只拥有所有状态的一部分,但这笔跨片交易确实又需要从不同的分片那里获得证据。于是此时,之前提过的所有分片方法都会设定一个规则,例如,让小红片区的矿工,或者是Mike片区的矿工,负责联络和提供一部分证据,然后再从Mike委托的矿工以及一个负责协调所有分片的矿工那里获得证据,再把这个证据提交给Mike。这里的证据包括分片中交易通过验证的证据,以及跨片交易中交易通过跨片交易节点验证的证据,或者,通过抵押押金的方式,担保自己片区的交易验证没有问题。

这里的问题是,对于所有矿工的这些额外工作,都被视为了整个系统的一部分,而并没有给出相应的单独的激励,因此,最终以上的分片机制都会陷入前文所述的困境之中。因为最终出现的问题是,每个验证节点在每笔交易上的利益并不一致——他们也许并不会从诚实地执行确认这笔交易所需的每个跨链步骤中获益。

但是,如果我们回到交易的本质上,自下而上地看这个问题的话,我们发现实际上,这一切的工作本来就不是这些矿工的,而是小红自己的责任——是她应该去找到相对应的分片,确认这些分片不同的分片收集这些证据,并且提供给Mike。

Chainspace

Chainspace向这种“交易者负责”的方向上改进了分片机制——

首先,不同的状态,比如“小红拥有10块钱”这个状态,根据某种特定的算法,被放在某个确定的分片之中,我们先假定分片中2/3以上的节点是诚实的。

然后,与其他分片方案的不同点是——这笔交易的逻辑,是写在一个名为比如“点对点转账交易”的智能合约里的,这个智能合约里规定了这类的交易合法的逻辑以及会涉及到的分片。比如,这样一笔交易实际上是想要把“小红拥有10块钱”这个状态替换为“Mike拥有10块钱”这个状态,前者放在分片A中,后者放在分片B中。那么,这个交易的逻辑就是小红需要分片A中所有节点的共识,然后把这个证明写进交易并提交给分片B里的节点来完成这笔交易。于是,这笔交易的发起者,也就是小红,有义务提供这个智能合约里面规定的证据来完成这笔交易 ——也就是说,小红需要将这笔交易提交给分片A中的诚实节点达成共识,然后将共识的结果写进交易提供给分片B的节点,包括Mike,而且,需要向他们证明这笔钱不会被发去其他分片。当这些在分片B达成共识之后,Mike可以确认收到这笔钱,因为他知道接下来他可以用同样的方法根据同样的逻辑进行一笔转账。

Chainspace和其他分片算法比起来最大的区别在于:在其他分片算法中,小红只管将交易提交给矿工,矿工负责进行后续的步骤,包括在本分片达成共识,在跨片账本达成共识,并将共识的结果作为证据发给目标分片的验证节点,在目标分片达成共识。在这种场景下,这看上去并不难,但是如果是更复杂的场景,例如一个DeFi交易涉及到多个分片的状态时,那么无论是这个任务交给哪个分片的矿工,这个工作量都很大。而这也正是我们在之前提到的所有自上而下的分片算法出问题的地方——对于不同交易不同验证者的利益是不一致的,只要激励机制无法协调这种不一致,久而久之就会带来上文说的所有的问题。

但采用了自下而上的思路之后,比如Chainspace里,这些问题可以被非常轻松地解决——小红只要根据交易涉及到的节点的多少和计算的难度给相应的分片中节点验证和上链的费用就行了,而至于收集证明,提交证明,和敦促整个交易上链得到确认的繁琐过程,则理所应当地交给小红本人来解决。

当然,从安全性上,Chainspace对于安全性的牺牲取决于证明本身——

如果证明是全账本,那么安全性并没有下降,但输出也就没有提升。但如果证明是分片内所有节点的共识的话,那么如同其他分片算法一样,安全性是下降的。同时,由于分片是随机的,Chainspace也无法避免有恶意分片存在的可能。于是,对于恶意分片和恶意交易者发起的双重支付,也需要通过事后追责的方法来惩罚。

总体而言,Chainspace依旧用了一种自上而下的分片方式,也就是随机将节点拆分成片。但在处理跨片交易这一点上,采用了之前介绍的自下而上的思路,从而避免了其他分片机制的很多令人头疼的问题。

那么,有没有可能更进一步,设计一个完全自下而上的分片方法呢?

本文首发于:https://zhuanlan.zhihu.com/p/449264381


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK