如果Alice錢包裡面有10美元,她可以去購買等值的物品。如果Alice去商店後,發現檯燈和桌子都是10美元,那麼她只能買其中一樣東西。
而我們所說的重複支付問題,正好與之相反,同樣的10美元,你可以購買兩樣東西。
不過,重複支付問題在我們生活中其實不會發生,因為你在購買東西的同時,也同時進行了支付(也就是說,這是個中心化系統)。換句話說,如果Alice花費10美元購買檯燈,那麼這10美元就不屬於她了。
但是在分佈式系統中,問題會有些不同。
對於分佈式系統來說,交易記錄會廣播給網絡中所有節點(也就是說,Alice會在網絡廣播交易信息,從而網絡中的每個節點都會知道“Alice已經花費10美元來購買檯燈”)。
每個節點都會記錄這個交易信息,然後將信息傳輸給網絡中的下個節點,並且這個過程會持續直到網絡中的所有節點已經記錄了這條信息“Alice已經使用了10美元來購買檯燈”。
但是,在信息通過龐大網絡進行傳輸的時候,以下問題也會出現:
• 當信息在網絡中傳播的時候,路徑不同,並且在不同時間到達不同節點。
• 由於節點會失效,有些節點也許不能將信息傳遞給下個節點,然後這個消息就會丟失。
因此,在某個時間會發生這種情況,某些節點知道Alice已經花費了10美元購買檯燈,但是某些節點卻不知道這一消息。
對於那些不知道Alice花費10美元購買檯燈的節點來說,這條信息還沒有傳達給他們;他們仍然會認為,Alice還有閒置的10美元可以購買任何其他東西。
因此,對於Alice來說,很可能她會向網絡中傳播另一個消息“Alice已經花費了10美元來購買桌子”,並且如果這個信息在“Alice花費了10美元來購買檯燈”這個消息之前達到節點,那麼這個節點就會認為Alice已經花了10美元來買桌子。
這就有可能造成這種情況,Alice能夠花費10美元買桌子,並且花費同樣的10美元來買檯燈;這是違背常理的,因為Alice只有10美元,並不是20美元。
這就是雙花問題。
雙花問題會在分佈式系統中出現,是因為交易信息在龐大的網絡中傳輸需要花費時間。
由於網絡中信息傳輸的時間差,無法保證信息達到節點的順序和信息創建的順序是相同的。
注意:有人會說,轉賬信息中會包含通用的時間戳,同時還有哈希值來保證數據的完整性,這就很容易解決轉賬信息會按照不同時間達到某個節點。
但是,Alice可以在簽署信息之前造假時間戳,同時把第二條信息放入更早的時間戳,給網絡造成疑惑。
從更深層次來看,現在網絡處於不一致的狀態,其中有些節點已經驗證“Alice花了10美元買燈”,其他節點驗證了“Alice花了10美元買桌子”。
為了解決網絡中狀態的不統一性(很少節點會驗證某個交易,並且其他節點已經驗證一個相反的交易),我們需要某個共識機制,確保交易的順序,從而將網絡帶回統一的狀態。
分佈式賬本技術和區塊鏈技術的共識機制
“真理不是事情的真相或者原因。簡單來說,就是每個人都同意這個事情。”
― Gregory Maguire, 壞女巫:新綠野仙踪
這種共識的形成有兩種方法。
基於投票的共識(需要信任的聯盟節點或者私有分佈式網絡,例如,超級賬本):網絡中的每個節點都是互相認識的,而且每個節點會進行投票,從而對交易進行驗證。最後,通過多數人投票選舉和擔保政策(例如,實用性拜占庭容錯算法)來實現交易,而且擔保政策可以使得只要全網2/3節點通過的前提下,就可以讓交易有效。
基於抽獎或者競爭的共識(公鍊或者無需信任節點網絡,比如以太坊):網絡中基於工作量證明或者權益證明選出的成員,可以決定交易是否有效,並且這個決定需要被全網都認可。無論誰贏得了這個獎勵,全網都會同意由獲勝節點驗證的轉賬是有效的。
這種通過競爭選出的下個節點的方式,通常是通過解決加密數學難題來實現,例如工作量證明,或者是根據對網絡投資的貢獻,來得到更高的獲勝概率,例如權益證明。
共識機制(不論是投票還是抽獎),都是讓網絡決定哪個交易是有效的。網絡中所有的節點然後再去驗證這個交易,這些只會通過有效交易的共識來進行處理。
有意思地是,有效交易可能並不是正確的交易。在我們的例子中,如果群體共識投票“Alice花費10美元買了桌子”作為有效交易,那麼正確的交易“Alice花費10美元買燈”就會被網絡所有節點認為無效。
其實,共識算法的目標並不是確定兩個交易之間,哪個是正確的。共識算法是為了防止分佈式網絡中的雙花問題(也就是說,在我們的例子中,通過共識機制,我們可以確保Alice可以消費10美元,並且只消費了一次);而且保證全網只會同意某個交易信息,並且任何不同的交易信息都會被網絡認為是無效的。
在“無需信任的網絡”構建“信任”
Bodhi:“你不信任我嗎?”
Johnny Utah:“你需要去獲得信任。”
— 驚爆點(1991)
通過工作量證明算法,獲勝者可以通過解決數學難題,從整個網絡脫穎而出,而且獲勝者可以去決定網絡中哪些交易是有效的,並成為區塊鏈中下個區塊的一部分。
但是問題來了,為什麼我們需要節點互相競爭來解決複雜的加密數學難題,再選出獲勝者? 也就是說,為什麼我們需要復雜的工作量證明?任何節點可以被隨機選擇並稱為下個獲勝者嗎(隨機選擇)?同時,這個節點還要被選舉出來,並對有效的交易做出決定。
答案如下。
如果彩票獲獎者並不是通過計算量選拔出來並且添加區塊(或者有些代幣是需要算力,例如權益證明),那麼對於任何節點來說就會很容易將下個區塊添加到區塊鏈上。
這意味著很多人都可以添加他們認為的區塊到區塊鏈上,並且擁有最強算力的人能夠擴大區塊鏈,並且獲得最長的鏈。
中本聰對這個問題的解決方案“在無需信任的網絡中構建信任”,也是為了確保對於任何人或者團體(只要團體算力小於50%)都無法通過算力來控制整個網絡,也就是控制區塊鏈上區塊的創建,同時維持區塊鏈上最長的鏈。
因此,基本原理是,如果想在區塊鏈中添加區塊,需要通過難度很高的計算,並且引進某種機制來完成。這些機制中,最常見的,就是工作量證明算法。
但是,其實也有消逝時間證明(PoET)機制,這種算法需要在區塊鏈上加入下個區塊之前,“等待”一段時間,從而再次人為地將添加區塊的計算難度變得很困難。
對於權益證明算法,代幣的抵押機制可以選出創建區塊的下個人,這也讓任何個人都很難去持有足夠的代幣,來控制整體網絡。