三選二
工匠們對任何專案都有句老話:又快、又便宜、又好——三樣裡只能挑兩樣。想要又快又便宜?那它就不會好。想要又好又快?那它就不會便宜。這三個角彼此較著勁,從來沒有哪個聰明的把戲能讓你一把抓全三樣。區塊鏈有一個頑固的、形狀一模一樣的版本,它有個名字:可擴展性三難困境。
這裡的三個角是去中心化、安全和可擴展性。去中心化,意思是網路由一大群普通參與者來運行,沒有哪個小圈子說了算。安全,意思是攻擊者無法在不付出巨大代價的前提下改寫歷史或偽造交易。可擴展性,意思是這條鏈能又快又便宜地處理大量交易。每一樣單看都實實在在地令人想要。三難困境所主張的是:以今天已知的種種設計,你能把其中任意兩樣佔滿,卻沒法三樣同時佔滿。
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
陷阱就在這兒。你去夠可擴展性,也夠到了——可你是拿去中心化付的帳。當只有十幾家財力雄厚的公司還負擔得起驗證這條鏈,這個小圈子就能悄悄串通、審查交易,或者被外部權力施壓拿捏。曾經把每個人管得誠實的那群人,已經稀薄到幾近於無。你並沒有逃出三難困境;你只是沿著它的某一條邊滑了下去。
為什麼買單的總是第三個角
無論你抓的是哪兩個角,同樣的擠壓都會冒出來。想要徹底的去中心化加徹底的安全?那就把區塊保持得足夠小、讓誰都能驗證,於是吞吐量只能維持在平平的水平——可擴展性受了委屈,這也正是為什麼一條最去中心化的鏈,在繁忙時段會讓人覺得又慢又貴。想要徹底的可擴展性加安全?那就跑在少數幾台壯實的伺服器上,讓它們處理海量交易、並把它們守得嚴嚴實實——可這下,掌權的成了一小撮營運者,去中心化沒了。每一種配對都夠得著;那第三個角,就是要付的帳單。
留意一下去中心化和安全為什麼是連在一起的。一條鏈的安全,歸根結底靠的是大量獨立的各方拒絕接受無效的區塊。如果驗證變得貴到只有寥寥幾個能做,攻擊者就不必再去擊敗一整個全球性的人群——他們只需要奪取、施壓或勾結那寥寥幾個。所以放任去中心化被侵蝕,你賠進去的就不只是開放性;它還在悄悄啃食著安全。正是這一點,讓三難困境變得鋒利,而不是一個你可以從中間一切兩半的軟性取捨。
把三角扳彎,而不是扳斷
下面是誠實的部分:沒有人證明過三難困境是一條鐵打的自然定律。它是一個鋒利的、來之不易的觀察,針對的是我們試過的每一種簡單設計——而不是一條定理。這個領域的整片前沿,就是在搜尋一些聰明的結構,能把這個三角扳彎,在不偷偷把去中心化變賣掉的前提下緩解那股擠壓。它們共有的竅門是:不再要求每個全節點都把每筆交易重做一遍,卻仍然讓它有把握確認沒有任何無效的東西矇混過關。
前面的幾篇裡,等著兩大類答案。分片把這條鏈切成許多條並行的車道,於是任何一個節點都只需驗證自己那一段,而不必驗證整條路,從而在不讓每個節點的負擔也跟著翻倍的情況下成倍地擴大容量。第二層則把重活挪到一旁去幹——在另一層上執行成千上萬筆交易,再把這些交易的資料連同一份證明或承諾一起發回底層鏈,好讓那個廉價的底層節點不必把每一步重做一遍,也照樣能確認結果是有效的。兩者都是在設法把吞吐量做大,同時把驗證的門檻保持在一個業餘愛好者夠得著的範圍之內。
所以,把這一幅圖帶進接下來的一切。三個角——去中心化、安全、可擴展性——彼此相互倚靠著,而一個樸素全節點的成本,就坐在這一切的正中心。這條軌道裡每一種擴容思路,歸根到底,都是對同一個問題的不同回答:我們怎樣才能做多得多的活,卻不至於悄悄把普通人擠出「親自核對真相」的門外?把這個問題攥在手裡,前沿剩下的部分讀起來就像一連串機巧的嘗試——去智取一道拒絕被正面智取的難題。