原文:Blockchain Proof-of-Work Is a Decentralized Clock
原文從區(qū)塊鏈如何保持交易有序的基本問題出發(fā),對(duì)該問題進(jìn)行了詳細(xì)闡述,并提出 PoW 本質(zhì)上是實(shí)現(xiàn)了一個(gè)“時(shí)鐘”的觀點(diǎn),這個(gè)時(shí)鐘的一個(gè)滴答對(duì)應(yīng)的就是 PoW 算出一次的解。
本文解釋了比特幣 PoW(Proof-of-Work, 工作量證明) 的關(guān)鍵要素,尤其對(duì) PoW 來說不可或缺的一個(gè)特性,同時(shí)也表明關(guān)于 PoW 經(jīng)常談到的一些其他特性其實(shí)是次要作用,比如安全性,這些次要效應(yīng)有用,但是非必要。
要想理解本文,首先要懂得在區(qū)塊鏈中,PoW 是如何工作的一些有趣的屬性,這些屬性并不那么直觀,甚至可以說相當(dāng)反直覺,比如參與者如何在從來沒有相互交流的情況下,共同地求解一個(gè)問題。
當(dāng)理解了這些屬性,你應(yīng)該能夠得出一個(gè)結(jié)論:PoW 的機(jī)制主要實(shí)現(xiàn)了一個(gè)分布式,去中心化的時(shí)間系統(tǒng),即一個(gè)時(shí)鐘。
注意本文并非關(guān)注 PoW 算法本身的細(xì)節(jié),而是探究區(qū)塊鏈如何“嚴(yán)絲合縫”地將 PoW 運(yùn)用其中。如果你還沒聽過 PoW,請(qǐng)先閱讀 這里。
分布式賬本時(shí)間排序問題
在講解決方案之前,先來關(guān)注問題本身。很多 PoW 的相關(guān)資料都很令人費(fèi)解,因?yàn)樗鼈兂3T跊]有闡明問題的情況下,就試圖講清楚解決方案。
毫無疑問,任何賬本都需要有序。你不能發(fā)費(fèi)還沒有收到的錢,也不能花費(fèi)已經(jīng)花出去的錢。區(qū)塊鏈交易(或者說包含交易的塊)必須有序,無歧義,同時(shí)無需可信的第三方。
即便區(qū)塊鏈不是一個(gè)賬本,而是就像日志一樣的數(shù)據(jù),對(duì)于所有節(jié)點(diǎn)來說,如果要想共同保有一份完全相同的區(qū)塊鏈副本,有序也是必不可少的。交易順序不同,就是不同的兩條鏈。
但是,如果交易是由全世界的匿名參與者生成,也沒有中心化機(jī)構(gòu)負(fù)責(zé)給交易排序,那又如何實(shí)現(xiàn)這一點(diǎn)呢?有人會(huì)說,交易(或者塊)可以包含時(shí)間戳,但是這些時(shí)間戳又如何可信呢?
時(shí)間是一個(gè)人類概念,時(shí)間的任何來源,比如一個(gè)原子時(shí)鐘,就是一個(gè)“可信第三方”,除此之外,由于網(wǎng)絡(luò)延遲和相對(duì)論效應(yīng),時(shí)鐘的大部分時(shí)間都有輕微誤差。很遺憾,在一個(gè)去中心化系統(tǒng)中,不可能通過時(shí)間戳來決定事件的先后順序。
我們所關(guān)心的“時(shí)間”并不是所熟悉的年,月,日這種概念。我們需要的是這樣一種機(jī)制,它可以用來確認(rèn)一個(gè)事件在另一個(gè)事件之前發(fā)生,或者可能并發(fā)發(fā)生。
首先,為了建立之前與之后的概念,首先必須要建立一個(gè)時(shí)間點(diǎn)的概念。理論上來說,建立一個(gè)點(diǎn)時(shí)間的概念似乎并不太可能,因?yàn)闆]有技術(shù)能夠足夠精確地測(cè)量 普朗克時(shí)間。但是你會(huì)看到,比特幣通過創(chuàng)建屬于自己的時(shí)間概念變相解決了這個(gè)問題,使得確立精確的時(shí)間點(diǎn)概念在事實(shí)上成為可能。
Leslie Lamport 1978 年的論文 “分布式系統(tǒng)中的時(shí)間,時(shí)鐘和事件順序” 中對(duì)這個(gè)問題有了詳細(xì)描述,但是除了“正確同步的物理時(shí)鐘”,實(shí)際上并沒有提供一個(gè)詳細(xì)的解決方案。1982 年 Lamport 同樣描述了 “拜占庭將軍問題”,中本聰在他早期的一封郵件中 解釋 了 PoW 如何解決了這個(gè)問題,比特幣白皮書 指出“為了在端到端的基礎(chǔ)上實(shí)現(xiàn)一個(gè)分布式的 時(shí)間戳服務(wù)器,我們將會(huì)使用一個(gè)工作量證明系統(tǒng)”,也表明了它主要解決了時(shí)間戳的問題。
時(shí)間是根本問題
必須要強(qiáng)調(diào)的是,在分布式系統(tǒng)中,不可能將事件與時(shí)間點(diǎn)關(guān)聯(lián)起來,這是一個(gè)尚不可解問題,直到中本聰找到了一個(gè)解決方案,才使得分布式賬本成為可能。在區(qū)塊鏈中還有很多其他的技術(shù)細(xì)節(jié),但是時(shí)間是最基礎(chǔ)也是最重要的。沒有時(shí)間,就沒有區(qū)塊鏈。
PoW 回顧
簡(jiǎn)而言之,比特幣的 PoW 就是 SHA-2 哈希滿足特定的條件的一個(gè)解,這個(gè)解很難找到。通過要求哈希滿足一個(gè)特定的數(shù)字,就確定了一個(gè)難度(difficulty),難度的值越小,滿足輸入的數(shù)字越少,找到解的難度就越大。
這就是所謂的“工作量證明”,因?yàn)闈M足哈希要求的解非常稀少,這意味著找到這樣一個(gè)解需要很多試錯(cuò),也就是,“工作(work)”。而工作也就是意味著時(shí)間。
塊間無變化
鏈的狀態(tài)由塊所反映,每個(gè)新的塊產(chǎn)生一個(gè)新的狀態(tài)。區(qū)塊鏈的狀態(tài)每次向前推動(dòng)一個(gè)塊,平均每個(gè)塊 10 分鐘,是區(qū)塊鏈里面最小的時(shí)間度量單位。
SHA 無記憶,無進(jìn)展
SHA(Secure Hash Algorithm) 在統(tǒng)計(jì)學(xué)和概率上以無記憶性(memoryless) 聞名。對(duì)于我們?nèi)祟惗?,無記憶性有點(diǎn)反直覺。所謂無記憶性,就是無論之前發(fā)生了什么,都不影響這一次事件發(fā)生的概率。
關(guān)于無記憶性,最好的例子就是拋硬幣。如果一個(gè)硬幣連續(xù) 10 次都是正面,那么下一次是反面的可能性會(huì)不會(huì)更大呢?我們的直覺是會(huì),但是實(shí)際上,無論上一次的結(jié)果是什么,每次拋硬幣正反面都是一半一半的概率。
而對(duì)于需要無進(jìn)展(progress-free)的問題,無記憶性又是必要條件。progress-free 意味著當(dāng)?shù)V工試圖通過對(duì) nonces 進(jìn)行迭代解決難題時(shí),每一次嘗試都是一個(gè)獨(dú)立事件,無論之前已經(jīng)算過了多少次,每次嘗試找到答案的概率是固定的。換句話來說,每次嘗試,參與者都不會(huì)離“答案”越近,或者說有任何進(jìn)展(progress)。就下一次嘗試而言,一個(gè)已經(jīng)算了一年的礦工,與上一秒剛開始算的礦工,算出來的概率是一樣的。
在指定時(shí)間內(nèi),給定一個(gè)難度,找到答案的概率唯一地由所有參與者能夠迭代哈希的速度決定。與之前的歷史無關(guān),與數(shù)據(jù)無關(guān),只跟算力有關(guān)。
因此,算力是一個(gè)與參與者數(shù)量,和那些用來計(jì)算哈希設(shè)備的速度相關(guān)的函數(shù)。
SHA 與輸入無關(guān)
在比特幣中,輸入的是區(qū)塊頭。但是如果給它隨機(jī)傳入一些值,找到一個(gè)合適哈希的概率仍然是一樣的。無論輸入是一個(gè)有效的塊頭,還是 /dev/random 中隨機(jī)的一些字節(jié),都要花費(fèi)平均 10 分鐘來找到一個(gè)解。
如果你找到了一個(gè)合適的哈希,但是輸入?yún)s不是一個(gè)有效的塊頭,雖然無法將塊上鏈,但是它仍然是一個(gè)工作量證明(即使沒啥用)。
難度屬于銀河系
令人驚奇的是,難度是universe(全宇宙,或者說通用的),也就是說它充滿了整個(gè)宇宙,無處不在?;鹦巧系牡V工也同樣能參與挖礦,但是他們不需要感知到地球礦工的存在,也不需要與地球上的礦工有交流,仍然是每 10 分鐘就會(huì)解決一個(gè)“難題”。(好吧,當(dāng)他們解出難題時(shí),需要告訴地球上的礦工,否則我們永遠(yuǎn)也不知道)。
了不起的是,遠(yuǎn)距離參與者不需要通過真正的相互交流進(jìn)行溝通,因?yàn)樗麄冊(cè)诠餐厍蠼馔粋€(gè)統(tǒng)計(jì)學(xué)問題,并且他們甚至互相感知不到對(duì)方的存在。
“通用屬性(universal property)”一開始看起來很神奇,實(shí)際上很容易解釋。我用了“通用”一詞,因?yàn)榫瓦@一個(gè)詞即可表達(dá)到位,但是它實(shí)際指的是“所有參與者都知道(這個(gè)難度)”。
SHA-256 的輸入可以是 0 到 2 的 256 方之間的任何一個(gè)整數(shù)(因?yàn)檩敵鍪?32 字節(jié),也就是在 0 到 2^256,任何超過該范圍的數(shù)將會(huì)導(dǎo)致沖突,也就是多余)。即使這個(gè)集合已經(jīng)非常大了(比已知宇宙里所有原子總數(shù)都大),不過每個(gè)參與者都知道這個(gè)集合,并且只能從這個(gè)集合里選取一個(gè)數(shù)。
如果輸入的集合全世界都知道,SHA-256 全世界都知道,難度要求也是全世界都知道了,那么找到一個(gè)解的概率自然也就是“全世界都知道(universe)”。
計(jì)算 SHA 即參與
如果所述問題是找到一個(gè)合適的哈希,那么要想解出這個(gè)問題,只需要去試一次,但是,哪怕就試一次,你就已經(jīng)影響了整個(gè)算力。就這次嘗試而言,你就已經(jīng)成為了一個(gè)幫助其他人解決問題的參與者。雖然你不需要告訴其他人你“做了”(除非你找到了答案),其他人也不需要知道,但是想要找到解的這次嘗試真真切切地影響到了結(jié)果。對(duì)于全宇宙而言,也是如此。
如果上面這段話看起來仍然不是那么令人信服,一個(gè)很好的類比就是尋找大素?cái)?shù)問題。找到最大的素?cái)?shù)很難,并且一旦找到,它就是“被發(fā)現(xiàn)”或者“已知的”。有無數(shù)的素?cái)?shù),但是在全宇宙中,每個(gè)數(shù)只有一個(gè)實(shí)例。因此無論是誰試圖找到最大素?cái)?shù),就是在解同一個(gè)問題,而不是這個(gè)問題另一個(gè)單獨(dú)的實(shí)例。你不需要告訴其他人你已經(jīng)打算尋找最大素?cái)?shù),你只需要在找到時(shí)通知其他人。如果從來沒有人尋找最大素?cái)?shù),那么它永遠(yuǎn)也不會(huì)被找到。因此,只要參與(也就是試圖找到素?cái)?shù)),即使它正在秘密進(jìn)行,仍會(huì)影響結(jié)果,只要公布最后的發(fā)現(xiàn)(如果找到)。
這就是中本聰設(shè)計(jì)的精妙之處,他利用了這個(gè)令人難以置信的統(tǒng)計(jì)學(xué)現(xiàn)象,即任何參與都會(huì)影響結(jié)果,即使秘密進(jìn)行,即使尚未成功。
值得注意的是,因?yàn)?SHA 是 progress-free,每一次嘗試都可以被認(rèn)為是一個(gè)參與者加入其中,然后立即退出。因此可以這么理解,礦工們來了又走,每秒無數(shù)次輪回。
參與度由統(tǒng)計(jì)學(xué)揭示
這個(gè)神奇的秘密參與(secret participation)屬性反過來也成立。很多網(wǎng)站上顯示的全球算力,并非是由每個(gè)礦工在某個(gè)“礦工注冊(cè)辦公室”注冊(cè),并定期匯報(bào)他們的算力而來。并不存在這種事情。
因?yàn)閷?duì)于在 10 分鐘找到一個(gè)指定難度的解,所需算力是已知的,一個(gè)人平均必須嘗試這么多次(截止成文之時(shí)大概 10^21)才能找到答案,無論這個(gè)人是誰,他在哪兒。
我們不知道這些參與者是誰,他們也從來都不會(huì)說我正在參與其中,沒有找到解的人(實(shí)際上他們都是)從來不會(huì)告訴其他人他們正在進(jìn)行計(jì)算,他們可能在世界上任何一個(gè)地方,但是我們肯定他們必然存在。因?yàn)樯钸€要繼續(xù),問題(找到滿足條件的哈希)始終還是要被解決。
工作(work)是一個(gè)時(shí)鐘(clock)
關(guān)鍵之處在于:找到滿足條件的哈希的難度,就類似于一個(gè)時(shí)鐘的角色。一個(gè)宇宙(universe)時(shí)鐘,因?yàn)槿钪嬷挥幸粋€(gè)這樣的時(shí)鐘,不需要同步,任何人都能“看”到這個(gè)時(shí)鐘。
即使這個(gè)時(shí)鐘不精確也沒關(guān)系。重要的是,對(duì)所有人來說,它都是同一個(gè)時(shí)鐘,鏈的狀態(tài)與這個(gè)時(shí)鐘的滴答(tick)無歧義地綁定到一起。
這個(gè)時(shí)鐘由遍布地球上的未知數(shù)量的參與者共同操作,參與者相互之間完全獨(dú)立。
謎題的最后一部分
解決方案必須是塊哈希(準(zhǔn)確來說,是塊頭)。上面已經(jīng)提到,對(duì)于 SHA 來說,輸入的內(nèi)容并不重要,但是如果它是真實(shí)的塊,那么無論何時(shí)找到一個(gè)解,它都發(fā)生在 PoW 這個(gè)時(shí)鐘的滴答處。沒有早一點(diǎn),沒有晚一點(diǎn),而是恰好在這個(gè)點(diǎn)。我們知道這是毫無歧義的,因?yàn)閴K是整個(gè)機(jī)制的一部分。
換句話來說,如果塊不是 SHA256 函數(shù)的輸入,我們?nèi)匀挥幸粋€(gè)分布式時(shí)鐘,但是我們無法將塊綁定到這個(gè)時(shí)鐘的滴答上。將塊作為輸入就解決了這個(gè)問題。
值得注意的是,我們的 PoW 時(shí)鐘只提供了滴答。但是我們沒辦法從滴答中分出順序,于是就引入了哈希鏈(hash chain)。
分布式共識(shí)
共識(shí)(consensus)意味著意見一致(agreement)。所有參與者別無選擇,只能同意“時(shí)鐘已然滴答”。并且每個(gè)人都知道滴答和附加的數(shù)據(jù)。正如中本聰在郵件里面所解釋的,這確實(shí)解決了拜占庭將軍問題,。
在一個(gè)罕見卻又常見的情況下,會(huì)出現(xiàn)共識(shí)分離,有兩個(gè)連續(xù)的滴答與一個(gè)塊有關(guān)聯(lián),這就發(fā)生了沖突。通過哪個(gè)塊與下一個(gè)滴答相關(guān)聯(lián)解決了這個(gè)沖突,同時(shí)將有爭(zhēng)議的塊變?yōu)椤肮聝簤K(orphan)”。鏈如何繼續(xù)是個(gè)概率問題(a matter of chance),這也可能間接地歸因于 PoW 的時(shí)鐘。
就這樣
這就是區(qū)塊鏈的 PoW(工作量證明)。它并不是一個(gè)為了讓礦工贏得出塊權(quán)的“樂透”,也不是為了將實(shí)際能源轉(zhuǎn)換成一個(gè)有價(jià)值的概念,這些都偏離了本質(zhì)。
比如礦工獎(jiǎng)勵(lì)的角度來看,雖然這些獎(jiǎng)勵(lì)激勵(lì)了礦工參與,但是這并不是區(qū)塊鏈誕生的必要因素。塊哈希形成一條鏈,但是這與工作量并沒什么關(guān)系,它是從密碼學(xué)上強(qiáng)制保證了塊的順序。哈希鏈?zhǔn)沟们耙粋€(gè)滴答“更確定”,“更加不可抵賴”,或者簡(jiǎn)單來說,更安全。
PoW 也能使塊不可更改,這是一種好的副作用,也使得隔離見證(Segregated Witness)成為可能,但是隔離見證也能通過保留簽名(見證,witness)實(shí)現(xiàn),所以這也是次要的。
結(jié)論
比特被的 PoW 只是一個(gè)分布式,去中心化的時(shí)鐘。
如果你理解了這個(gè)解釋,那么你應(yīng)該能夠更好地理解 PoW 與 PoS 的異同。顯然,兩者不具有可比性:PoS 是有關(guān)于(隨機(jī)分布的)權(quán)力(authority),而 PoW 是一個(gè)時(shí)鐘。
在區(qū)塊鏈的背景下,PoW 這個(gè)名字可能是個(gè)誤用,起的并不太好。這個(gè)詞來源于 Hashcash 項(xiàng)目,它確實(shí)用于證實(shí)工作(work)。在區(qū)塊鏈中,它主要關(guān)于可驗(yàn)證的花費(fèi)時(shí)間。當(dāng)一個(gè)人發(fā)現(xiàn)滿足難度的哈希時(shí),我們知道它必然會(huì)花費(fèi)一些時(shí)間。實(shí)現(xiàn)時(shí)間延遲的方法就是“工作”,而哈希就是這段時(shí)間的證明。
PoW 是關(guān)于 time 而非 work 的事實(shí)也表明,可能存在一些其他的統(tǒng)計(jì)學(xué)問題,這些問題同樣消耗時(shí)間,但卻需要更少的能源。這也可能意味著比特幣算力有些“過分”,因?yàn)槲覀冊(cè)谏厦嫠枋龅谋忍貛艜r(shí)鐘,在只有部分算力的情況下,也是可信的,這是這種激勵(lì)結(jié)構(gòu)推動(dòng)了能源消耗。
如果你找到了一個(gè)方法能夠同步滴答,并且需要更少的工作,這是一個(gè)價(jià)值萬億美元的問題,請(qǐng)一定要告訴我!
P.S. 特別感謝 UChicago Statistics 的 Sasha Trubetskoy 對(duì)上述文字的 review 和建議。