三选二
工匠们对任何项目都有句老话:又快、又便宜、又好——三样里只能挑两样。想要又快又便宜?那它就不会好。想要又好又快?那它就不会便宜。这三个角彼此较着劲,从来没有哪个聪明的把戏能让你一把抓全三样。区块链有一个顽固的、形状一模一样的版本,它有个名字:可扩展性三难困境。
这里的三个角是去中心化、安全和可扩展性。去中心化,意思是网络由一大群普通参与者来运行,没有哪个小圈子说了算。安全,意思是攻击者无法在不付出巨大代价的前提下改写历史或伪造交易。可扩展性,意思是这条链能又快又便宜地处理大量交易。每一样单看都实实在在地令人想要。三难困境所主张的是:以今天已知的种种设计,你能把其中任意两样占满,却没法三样同时占满。
DECENTRALIZATION
/\
/ \
/ \
/ pick \
/ any two\
/__________\
SECURITY SCALABILITY
push two corners hard -> the third gives way是谁守着这条链的诚实:全节点
要体会这股张力从何而来,你得先认识去中心化里那位沉默的英雄:全节点。全节点是一台计算机,它把每一个区块都下载下来,并亲自把每一笔交易重新核对一遍,从最早的那个区块一直查到最新的。它不信任何人的一面之词;它去验证。当成千上万个互不相干的人各自跑着一个全节点,就没有哪个中心方能决定真相是什么——规则由这群人来执行,并行地、同时在每一个角落里。
关键之处在于,全节点的力量来自它运行起来很便宜。如果一个普通人用一台不起眼的电脑、一根寻常的家用宽带就能让它一直跑下去,那么就会有很多人去跑——而正是这一大群独立的人,构成了去中心化本身。一个网络抵抗被夺取的能力,大致就等于:真到了那个份上,有多少人能够亲自去核对规则、并拒绝一次作弊。把这个成本压低,那扇门就对所有人敞开着。
那个诱人的捷径:把区块做大就好了
现在,挤压来了。假设你的链感觉很慢、手续费感觉很贵,而你想要可扩展性。最显而易见的一招,就是往每个区块里塞进更多交易——把区块做大,或者出块更快。纸面上这立刻就奏效:一个大十倍的区块装下十倍的交易,吞吐量于是猛涨。许多真实的项目都伸手去拉过这根杠杆。那么,代价在哪?
代价在于,每一个全节点都必须把这些更肥的区块统统下载、验证、并存储下来。十倍的数据,意味着十倍的带宽、十倍的硬盘,以及多得多的算力去把它们逐一重新核对——而且这事永不停歇,一个区块接一个区块,永远如此。家用宽带上的业余爱好者再也跟不上,于是退出。很快,唯一还能跑得动全节点的,就只剩下专业数据中心里那些昂贵的服务器了。
small blocks big blocks ------------ ---------- node cost: low node cost: high who can run one: who can run one: you you you data center you you you data center -> thousands verify -> a handful verify -> hard to capture -> easy to capture
陷阱就在这儿。你去够可扩展性,也够到了——可你是拿去中心化付的账。当只有十几家财力雄厚的公司还负担得起验证这条链,这个小圈子就能悄悄串通、审查交易,或者被外部权力施压拿捏。曾经把每个人管得诚实的那群人,已经稀薄到几近于无。你并没有逃出三难困境;你只是沿着它的某一条边滑了下去。
为什么买单的总是第三个角
无论你抓的是哪两个角,同样的挤压都会冒出来。想要彻底的去中心化加彻底的安全?那就把区块保持得足够小、让谁都能验证,于是吞吐量只能维持在平平的水平——可扩展性受了委屈,这也正是为什么一条最去中心化的链,在繁忙时段会让人觉得又慢又贵。想要彻底的可扩展性加安全?那就跑在少数几台壮实的服务器上,让它们处理海量交易、并把它们守得严严实实——可这下,掌权的成了一小撮运营者,去中心化没了。每一种配对都够得着;那第三个角,就是要付的账单。
留意一下去中心化和安全为什么是连在一起的。一条链的安全,归根结底靠的是大量独立的各方拒绝接受无效的区块。如果验证变得贵到只有寥寥几个能做,攻击者就不必再去击败一整个全球性的人群——他们只需要夺取、施压或勾结那寥寥几个。所以放任去中心化被侵蚀,你赔进去的就不只是开放性;它还在悄悄啃食着安全。正是这一点,让三难困境变得锋利,而不是一个你可以从中间一切两半的软性取舍。
把三角扳弯,而不是扳断
下面是诚实的部分:没有人证明过三难困境是一条铁打的自然定律。它是一个锋利的、来之不易的观察,针对的是我们试过的每一种简单设计——而不是一条定理。这个领域的整片前沿,就是在搜寻一些聪明的结构,能把这个三角扳弯,在不偷偷把去中心化变卖掉的前提下缓解那股挤压。它们共有的窍门是:不再要求每个全节点都把每笔交易重做一遍,却仍然让它有把握确认没有任何无效的东西蒙混过关。
前面的几篇里,等着两大类答案。分片把这条链切成许多条并行的车道,于是任何一个节点都只需验证自己那一段,而不必验证整条路,从而在不让每个节点的负担也跟着翻倍的情况下成倍地扩大容量。第二层则把重活挪到一旁去干——在另一层上执行成千上万笔交易,再把这些交易的数据连同一份证明或承诺一起发回底层链,好让那个廉价的底层节点不必把每一步重做一遍,也照样能确认结果是有效的。两者都是在设法把吞吐量做大,同时把验证的门槛保持在一个业余爱好者够得着的范围之内。
所以,把这一幅图带进接下来的一切。三个角——去中心化、安全、可扩展性——彼此相互倚靠着,而一个朴素全节点的成本,就坐在这一切的正中心。这条轨道里每一种扩容思路,归根到底,都是对同一个问题的不同回答:我们怎样才能做多得多的活,却不至于悄悄把普通人挤出「亲自核对真相」的门外?把这个问题攥在手里,前沿剩下的部分读起来就像一连串机巧的尝试——去智取一道拒绝被正面智取的难题。