今天是比特幣白皮書的最後一篇。

本系列歷史文章列表

從零開始區塊鏈:對等網路與電子現金是什麼?——比特幣經典論文研讀 (1)

從零開始區塊鏈:如何防止一筆錢花兩次?——比特幣經典論文研讀 (2)

從零開始區塊鏈:如何證明計算機的工作量?——比特幣經典論文研讀 (3)

從零開始區塊鏈:比特幣如何挖礦?——比特幣經典論文研讀 (4)

10.磁碟空間回收

如果區塊一直增長,會不會佔有太多的磁碟空間?比特幣設計了磁碟回收機制。具體原則如下:

(1) 如果最新交易已經在足夠多的塊裏,更早的交易數據可以丟棄以節省存儲空間,但是為了不影響哈希值的結果,交易以Merkle樹的方式存儲,在區塊中僅存儲了根哈希值。其下的子節點可以直接裁剪掉,不需要存儲。

(2) 一個不帶交易的塊頭數據約80位元組,如果每10分鐘生成一個區塊,一年生成4.2M的數據量,扔到內存裏沒有問題。

什麼是Merkle樹?這個也叫哈希數,是密碼學裡常用的數據結構。這種樹的每個葉子節點,都是某個數據塊的哈希值;每個非葉子節點,都是子節點的哈希值。所以這就是一個層層向上哈希歸併的數據結構,數據的完整性層層鎖定,修改任意一個地方都會引起後續連串的反應。於是從完整性和節約空間的考慮,可以先存一個根哈希節點即可。

圖8:Merkle樹示例,圖片來自Wikipedia

11.簡單支付驗證

比特幣的各個節點可以沒有全網節點的所有信息的情況下,驗證支付的有效性,這樣可以節省資源與空間。節點只需要存一份最長鏈的節點的塊頭數據即可。而如果想要獲得最長的頭節點,只需要向網路節點請求,直到得到最長的鏈即可。這樣一來,節點就獲得Merkle樹的結構,知道一個交易被時間戳打包到哪個塊中。節點自己無法驗證這筆交易,但是知道這筆交易在鏈上的具體位置,可以確認網路節點已經接受了這筆交易,而且後續的塊更是進一步確認了這筆交易。

如此一來,只要誠實節點控制了網路,驗證就是靠譜的。但是如果攻擊者擁有更多的算力,這種驗證就比較弱。如果攻擊者擁有更多的算力,那就可以偽造出交易記錄。應對這個風險的策略就是,如果節點發現無效區塊,就會發出警告,讓比特幣客戶端軟體下載所有的節點數據,對不一致的區塊進行驗證。對於頻繁交易的商業應用,通常會下載全部數據,這樣驗證更安全,也更快。

這一節可以理解為一種工程實用上的折衷優化。由於P2P的分散式屬性,理論上每個節點保存所有的網路信息是最好的。但是由於各種客觀條件與資源限制,無法支持理想的情況,於是這裡提出了一種簡單支付驗證的方式。因為比特幣區塊的設計屬性,正好也支持這種簡單驗證的方式,所以從流程上具備可行性。但是既然做了簡化,必然會有代價,這是工程上的權衡(trade-off)。所以驗證在安全性上會有一些折扣,但是遇到突發情況也有應對方案。

12.幣值分割與拼合

在第1篇文章中,我們談到了電子現金需要具備的幾個屬性,其中一個就是可拆分性:

(5) 現金可分割。價值為C元的現金,可以拆分為許多更小面值的現金,這些現金加起來,總額與C相等。」

這一節就是講比特幣如何支持把一筆錢拆開,或者把不同幣值的錢,組合起來。

(1) 儘管可以對每一個比特幣單獨處理,但是這樣做會顯得過於笨重。為了支持幣值的拆分與合併,一筆交易支付多個輸入與輸出。通常,輸入可以來自前一筆交易較大的額度,也可以是小額的多筆交易。但是輸出最多兩個,一個是用於支付,一個是歸還給付方的找零。

(2) 對於「扇出」的情況,作者認為沒有必要把交易的所有歷史記錄抽取出來。扇出就是指一筆交易依賴與多筆交易,然後這些交易又有更多的依賴關係,如此級聯。

在數字電路中,如果一個電路門,需要依靠其他門的輸出作為輸入,就會稱為「扇入(fan-in)」,如果一個電路門的信號,輸出到其他門作為輸入,就叫「扇出(fan-out)」。

圖9(a) 扇入為3的門 圖9(b) 扇出為N的門

另外,最近我帶著ScalersTalk成長會的小夥伴在讀《資本論[17]》,裡面提到「金與銀非天然為貨幣,但貨幣天然為金與銀。」這句話在討論比特幣價值的時候,經常會被圈內人士所引用。另外對應到本節的標題,也有一句話「貨幣商品也必須只有量的差別,必須可以隨意分割和拼合。金與銀就天然賦有這種性質的」。

圖10 《資本論》第1卷第43頁

13.隱私

傳統銀行模式下的隱私主要通過限制相關方對信息的訪問實現,即「不給你看」是保障隱私的主要方式。但是比特幣要把所有的交易信息公開到全網,這樣一來,「不給你看」的方式就失效了。但是仍然可以從信息流的其他環節下手:公鑰匿名。在公開的網路上,可以看到某個人給另外一個人轉賬,但是這筆交易信息,無法對應到具體是誰給誰在轉錢。這有點類似股票交易市場的信息披露情況,你能看到每一筆交易的時間與規模,這些記錄是公開的,但是卻不知道對應的交易者是誰。

作為額外的安全考慮,每一筆交易應該生成一對新的公私鑰對,這樣就不會在不同的交易中,定位到相同的身份。但是對於多筆輸入交易的情況,關聯到一個身份不可避免。這樣會帶來一個風險,如果一個公鑰被對應到某一身份,那該公鑰對應到的其他的交易,也能對應到同一個人。

這一節講的就是比特幣隱私方面的情況,而談論這個的前提是,比特幣的系統在前面各個章節已經搭建起來了。

14.計算

這一節對攻擊者的勝率進行了計算。如果攻擊者生成區塊鏈的速度大於誠實節點,系統也不是可以隨意更改的,例如憑空捏造一枚幣,或者侵佔他人錢幣,這些是做不到的。網路節點不會接受這樣的交易,誠實節點永遠不會接受包含這樣的交易的塊。攻擊者只能修改自己的交易,把花出去的錢,改回來。

攻擊者生成的攻擊鏈與誠實節點生成的誠實鏈的競賽可以用二項隨機過程來描述。成功事件就是誠實鏈增加一個塊,領先優勢+1,失敗事件就是攻擊鏈增加一個塊,差距-1。這個攻擊者追趕差距的問題類似「賭徒破產」問題。如果有一個無限的賭徒從虧錢開始賭,次數不限,最終要達到回本。可以計算賭徒回本的概率,這也是攻擊者追趕上誠實節點的概率。

作者引入了以下幾個變數:

p 代表誠實節點先找到下一塊

q 代表攻擊者先找到下一塊

q_z 代表攻擊者在z個塊後追上誠實節點

假設p>q,那麼隨著需要追趕的區塊數目增加,概率指數級下降。在這種逆境下,如果攻擊者沒有突然的爆發力,那落後的越多,越不可能追上。

這裡再討論一下交易的收方需要等待多長時間,才能足夠確信交易不可篡改。假設付方是攻擊者,在付錢的一段時間之後,把錢再重新支付給自己。收方最終會發現,但是付方希望時間較晚。

收方生成一對新的密鑰,公鑰發至付方,然後簽名。這樣可以防止付方提前算好區塊,直到運氣足夠好,跑到前面,然後再執行交易。意思就是,收方盡量壓縮付方提前準備的時間,不給攻擊者(付方)太多時間。一旦付方發送交易,攻擊者就開始計算包含此項交易的另外一條鏈。

收方等到交易加入區塊後,以及後續生成了z個塊才對交易進行確認。收方不知道付方到底進展到哪一步,但是假如誠實塊的計算時間與平均相當,攻擊者的進展情況服從期望為λ=zq/p的泊松分佈。之後,作者把泊松分佈的概率密度函數與在第k次趕上的概率,然後整理出概率公式,用C語言代碼實現,可以看出概率對z值呈現指數下降趨勢。

15.結論

這篇論文提出了一種無須信任的電子交易系統。文章首先討論了電子簽名的貨幣常用框架,這種框架可確保幣的所有權,但是在防止雙花方面,無法有效執行。於是作者提出了採用P2P網路,利用工作量證明,來記錄公共歷史交易。這樣一來,只要誠實節點佔有大部分算力,攻擊者便無法修改交易記錄。

P2P網路採用無結構化的形式,簡潔且健壯。節點共同工作,不需要過多協同。節點不需要明確身份,因為消息無須路由至特定對照,只需要最大全力交付。節點可以任意離開或者加入網路,接受工作量證明,作為離開網路期間生成的鏈。節點通過CPU算力投票,通過延長鏈的方式表達對有效塊的支持,通過不延長某個塊的方式表達拒絕。任意的規則與激勵可以在本共識機制下。

結語就是對這篇文章的一個小結,概括了比特幣設計的一些要點。這篇論文也被稱為比特幣的白皮書。至此我們已經完成了第一篇比特幣相關論文的研讀。

如果你看到這裡會發現,這些也是比較基礎的內容,因為涉及到具體的當前比特幣的許多細節,我們還是需要在後續有更多的學習。

總體而言,本篇論文通過共識機制、去中心化、工作量證明這三個關鍵要點,構造了比特幣的最基本原型。在當前比特幣價格不斷波動的情況下,關於比特幣未來會怎麼樣的討論塵囂甚上。我們每一個人為了不當韭菜,還是要多沉下心來,鑽研一些具體的技術細節,把握一些基本原則,這樣在面對波動的時候,內心會更沉穩一些。

參考文獻

[17] 卡爾·馬克思 德. 資本論(全三冊)[M]. 上海三聯書店, 2009.


推薦閱讀:
相關文章