# 定義與原理

## 定義

區塊鏈技術自身仍然在飛速發展中，相關規範和標準還待進一步成熟。

公認的最早關於區塊鏈的描述性文獻是中本聰所撰寫的 [《比特幣：一種點對點的電子現金系統》](https://bitcoin.org/bitcoin.pdf)，但該文獻重點在於討論比特幣系統，並沒有明確提出區塊鏈的術語。在其中，區塊和鏈被描述為用於記錄比特幣交易賬目歷史的數據結構。

另外，[Wikipedia](https://en.wikipedia.org/wiki/Blockchain) 上給出的定義中，將區塊鏈類比為一種分佈式數據庫技術，通過維護數據塊的鏈式結構，可以維持持續增長的、不可篡改的數據記錄。

筆者認為，討論區塊鏈可以從狹義和廣義兩個層面來看待。

狹義上，區塊鏈是一種以區塊為基本單位的鏈式數據結構，區塊中利用數字摘要對之前的交易歷史進行校驗，適合分佈式記賬場景下防篡改和可擴展性的需求。

廣義上，區塊鏈還指代基於區塊鏈結構實現的分佈式記賬技術，包括分佈式共識、隱私與安全保護、點對點通信技術、網絡協議、智能合約等。

## 早期應用

1990 年 8 月，Bellcore（1984 年由 AT\&T 拆分而來的研究機構）的 Stuart Haber 和 W. Scott Stornetta 在論文《How to Time-Stamp a Digital Document》中就提出利用鏈式結構來解決防篡改問題，其中新生成的時間證明需要包括之前證明的 Hash 值。這可以被認為是區塊鏈結構的最早雛形。

後來，2005 年 7 月，在 Git 等開源軟件中，也使用了類似區塊鏈結構的機制來記錄提交歷史。

區塊鏈結構最早的大規模應用出現在 2009 年初上線的比特幣項目中。在無集中式管理的情況下，比特幣網絡持續穩定，支持了海量的交易記錄，並且從未出現嚴重的漏洞，引發了廣泛關注。這些都與區塊鏈結構自身強校驗的特性密切相關。

## 基本原理

區塊鏈的基本原理理解起來並不複雜。首先來看三個基本概念：

* 交易（Transaction）：一次對賬本的操作，導致賬本狀態的一次改變，如添加一條轉賬記錄；
* 區塊（Block）：記錄一段時間內發生的所有交易和狀態結果等，是對當前賬本狀態的一次共識；
* 鏈（Chain）：由區塊按照發生順序串聯而成，是整個賬本狀態變化的日誌記錄。

如果把區塊鏈系統作為一個狀態機，則每次交易意味著一次狀態改變；生成的區塊，就是參與者對其中交易導致狀態改變結果的共識。

區塊鏈的目標是實現一個分佈的數據記錄賬本，這個賬本只允許添加、不允許刪除。賬本底層的基本結構是一個線性的鏈表。鏈表由一個個“區塊”串聯組成（如下圖所示），後繼區塊中記錄前導區塊的哈希（Hash）值。某個區塊（以及塊裡的交易）是否合法，可通過計算哈希值的方式進行快速檢驗。網絡中節點可以提議添加一個新的區塊，但必須經過共識機制來對區塊達成確認。

![區塊鏈結構示例](https://2764190444-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LTVpKVB_-0AGEl1PbRN%2F-LTVq2pGzV7aRkCYNbvV%2F-LTVq5QYTBB5rRSCx4I9%2Fblockchain_example.png?generation=1544591809536251\&alt=media)

## 以比特幣為例理解區塊鏈工作過程

具體以比特幣網絡為例，來看其中如何使用了區塊鏈技術。

首先，用戶通過比特幣客戶端發起一項交易，消息廣播到比特幣網絡中等待確認。網絡中的節點會將收到的等待確認的交易請求打包在一起，添加上前一個區塊頭部的哈希值等信息，組成一個區塊結構。然後，試圖找到一個 nonce 串（隨機串）放到區塊裡，使得其哈希結果滿足一定條件（比如小於某個值）。這個計算 nonce 串的過程，即俗稱的“挖礦”。nonce 串的查找需要花費一定的計算力。

一旦節點找到了滿足條件的 nonce 串，這個區塊在格式上就“合法”了，成為候選區塊。節點將其在網絡中廣播出去。其它節點收到候選區塊後進行驗證，發現確實合法，就承認這個區塊是一個新的合法區塊，並添加到自己維護的本地區塊鏈結構上。當大部分節點都接受了該區塊後，意味著區塊被網絡接受，區塊中所包括的交易也就得到確認。

這裡比較關鍵的步驟有兩個，一個是完成對一批交易的共識（創建合法區塊結構）；一個是新的區塊添加到鏈結構上，被網絡認可，確保未來無法被篡改。當然，在實現上還會有很多額外的細節。

比特幣的這種基於算力（尋找 nonce 串）的共識機制被稱為工作量證明（Proof of Work，PoW）。這是因為要讓哈希結果滿足一定條件，並無已知的快速啟發式算法，只能對 nonce 值進行逐個嘗試的蠻力計算。嘗試的次數越多（工作量越大），算出來的概率越大。

通過調節對哈希結果的限制條件，比特幣網絡控制平均約 10 分鐘產生一個合法區塊。算出區塊的節點將得到區塊中所有交易的管理費和協議固定發放的獎勵費（目前是 12.5 比特幣，每四年減半）。

讀者可能會關心，比特幣網絡是任何人都可以加入的，如果網絡中存在惡意節點，能否進行惡意操作來對區塊鏈中記錄進行篡改，從而破壞整個比特幣網絡系統。比如最簡單的，故意不承認別人產生的合法候選區塊，或者乾脆拒絕來自其它節點的交易請求等。

實際上，因為比特幣網絡中存在大量（據估計數千個）的維護節點，而且大部分節點都是正常工作的，默認都只承認所看到的最長的鏈結構。只要網絡中不存在超過一半的節點提前勾結一起採取惡意行動，則最長的鏈將很大概率上成為最終合法的鏈。而且隨著時間增加，這個概率會越來越大。例如，經過 6 個區塊生成後，即便有一半的節點聯合起來想顛覆被確認的結果，其概率也僅為 (1/2)^6 ≈ 1.6%，即低於 1/60 的可能性。10 個區塊後概率將降到千分之一以下。

當然，如果整個網絡中大多數的節點都聯合起來作惡，可以導致整個系統無法正常工作。要做到這一點，往往意味著付出很大的代價，跟通過作惡得到的收益相比，往往得不償失。
