- 區塊鏈實戰:從技術創新到商業模式
- 冒志鴻 陳俊
- 10619字
- 2020-07-02 17:52:46
“盲人摸象”地解構區塊鏈
曾經有人批評很多有關區塊鏈技術的講解如同“盲人摸象”,然而我們認為,要理解新技術必須有一種“盲人摸象”的勇氣——先去解構性地理解局部,對局部了解得越來越清晰之后,再破除、糾正一些錯誤的認知,就能形成完整的認知拼圖。
從不同角度對區塊鏈進行介紹時,我們的確像“盲人摸象”一樣——先從單一角度來看區塊鏈是什么,然后逐漸來看各個角度之間有什么聯系,相信聰明的你一定能夠由此對區塊鏈有一個更全面的認知(見圖1–2)。正如我們前面說的,你不需要具備計算機基礎知識就能大體上看懂這部分內容。如果你已具備計算機知識,甚至對區塊鏈有所了解,希望我們這種解構能讓你對區塊鏈的認知更進一步。

圖1–2 區塊鏈技術的8種特性
分布式數據庫
區塊鏈是一種數據庫,而且是一種分布式數據庫。
提到數據庫時,人們常常會立刻想到最流行的數據庫,如PostgreSQL、MySQL等。但在此我們需要提醒你,“數據庫”其實是一個非常廣義的概念,前述舉例的關系型數據庫只是其中一種特例。比如,我們日常使用的計算機文件系統,也可以被認為是一種類型的數據庫。因此,在理解區塊鏈是一種數據庫時,要明白它很可能并不是你所認為的“數據庫”的樣子。
區塊鏈的核心就是數據庫,而且大部分區塊鏈技術在底層實現上采用了傳統的數據庫引擎來保存數據。例如,維護比特幣代碼的Bitcoin Core團隊實現的比特幣就采用了LevelDB(最早由谷歌公司貢獻的一種開源數據庫引擎)來索引和保存區塊鏈的鏈狀態信息(包括UTXO集、當前最佳塊等),而在比特幣的錢包里則采用了Bekerly DB(另一種開源的非關系型數據庫引擎)。不同的區塊鏈可能會采用不同的數據庫系統來實現,同一種區塊鏈的不同的節點實現版本也可能采用不同的數據庫。
數據庫及其分類
簡而言之,數據庫可被視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據運行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能予多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。
數據庫分為關系型數據庫和非關系型數據庫。
關系型數據庫是存儲在計算機上的、可共享的、有組織的關系型數據的集合,存儲的格式可以直觀地反映實體間的關系。關系型數據庫和常見的表格比較相似,關系型數據庫中表與表之間有很多復雜的關聯關系。常見的關系型數據庫有MySQL、SQL Server等。
非關系型數據庫指非關系型的、分布式的且一般不保證遵循ACID(4個字母分別代表原子性、一致性、隔離性、持久性)原則的數據存儲系統。非關系型數據庫結構相對簡單,在大數據量下的讀寫性能好;能滿足隨時存儲自定義數據格式需求,非常適用于大數據處理工作,適合追求速度和可擴展性、業務多變的應用場最。
分布式數據庫
分布式數據庫是用計算機網絡將物理上分散的多個數據庫單元連接起來組成的一個邏輯上統一的數據庫。每個被連接起來的數據庫單元被稱為站點或節點。分布式數據庫有一個統一的數據庫管理系統來進行管理,被稱為分布式數據庫管理系統。
40年前,數據庫的關系模型的提出,開創了數據庫關系方法和關系數據庫理論的研究,為關系型數據庫技術奠定了理論基礎。目前,關系型數據庫系統仍然是數據庫系統的主流,市場上涌現出了很多關系型數據庫產品,如小型關系型數據庫管理系統dBase/Foxbase/Visual FoxPro、Access.MySQL,大型關系型數據庫管理系統DB2、Ingres、Oracle、Informix.Sybase和SQL Server等。這些數據庫產品從最初各自為政的編程接口起步,到逐漸支持結構化查詢語言SQL,并使SQL的影響甚至已經超出數據庫領域,得到如人工智能、大數據等其他領城的數據檢索的重視和采用。
區塊鏈網絡各個節點是復制同步的分布式數據庫(見圖1-3)。每個“健康”節點上的數據庫里都有著完整的區塊鏈上的所有數據和歷史信息。由于每個節點上都有完整的檢索數據,因此在每一個節點就能直接查詢到區塊鏈上的任何記錄,不需要依賴任何第三方。

圖1–3 中心化賬本和分布式賬本的比較示意
我們有時候說區塊鏈是分布式賬本技術,尤其當人們談及聯盟鏈(Consortium Blockchain)技術的時候。賬本其實只是數據庫的一種相對簡化的特例,早期的區塊鏈都和數字貨幣相關,主要的數據就是交易,而這些交易的數據集合就是賬本。隨著區塊鏈技術的不斷發展,越來越豐富的數據甚至代碼邏輯也出現在區塊鏈上,但作為習慣的延續,人們還常常稱區塊鏈數據庫為“賬本”,稱每條記錄為“交易”。
由于區塊鏈是一種分布復制的數據庫,將數據保存在這樣的數據庫里的開銷和成本是比較大的,因此區塊鏈這種數據庫不適合用來保存海量數據,通常只用來保存關鍵信息,或者作為其他存儲方式的數據的驗證信息。有種常見用法是試圖把所有數據都一股腦兒“上鏈”,在區塊鏈里保存,這是對區塊鏈的一種誤解、誤用。本書第四部分將闡述典型的數據上鏈應用設計模式。簡而言之,數據上鏈并不是把數據全部放在區塊鏈上,而是把數據仍然保存在原有的地方,只是把數據的校驗信息放在鏈上。
共識機制:讓各個節點的數據庫保持一致的方法
談到區塊鏈時,我們經常會聽到“共識”(Consensus)這個概念,各種共識算法的名稱,例如工作量證明(Proof of Work,縮寫為PoW)、權益證明(Proof of Stake,縮寫為PoS)等,常常讓人望而生畏。
工作量證明、權益證明
工作量證明是一種應對服務與資源濫用,或是拒絕服務攻擊的經濟對策。一般要求用戶進行一些耗時適當的復雜運算,并且答案能被服務方快速驗算,以耗用的時間、設備與能源作為擔保成本,來確保服務與資源是被真正的需求使用。這一概念最早由辛西婭·德沃克和莫尼·瑙爾于1993年發表的學術論文中提出,被用于經濟領域統計。“工作量證明”一詞由馬庫斯·雅各布森與阿里·尤爾斯在1999年計算機反垃圾郵件系統實現中提出。現在,工作量證明成為以比特幣為代表的加密貨幣或區塊鏈的主流共識機制。
權益證明(又稱持有量證明)是2012年出現的共識機制。與要求驗證者執行一定量的計算工作的工作量證明不同,權益證明要求一組驗證者輪流對下一個區塊進行提議和投票,每個驗證者的投票權重取決于其持有權益證明的多少。權益證明的顯著優勢在于具備安全性,降低集中化的風險以及提升能效。
之前我們提到,區塊鏈就是一種分布式數據庫,是有很多個節點的復制的數據庫,而且每個節點都可以獨立驗證數據,不需要依賴第三方。那么,一個很自然的問題就是:如何能讓這些節點的數據庫保持一致?傳統的分布式數據庫設計有一個重要的假設,即分布式數據庫的每個節點都是“友好”的。因此,要保持數據一致,主要需要克服的是一些技術問題,比如網絡延遲怎么辦?網絡臨時中斷怎么辦?不同節點上的用戶對相同的數據都想進行修改怎么辦?……所有這些問題在區塊鏈這種分布式數據庫上全部存在。除此之外,區塊鏈的一個重要想法是,不能默認各個節點都是“友好”的,有可能有些節點就是有意要“制造麻煩”,這就使得區塊鏈要解決這個問題更為困難。
實際上,“共識”的概念很容易理解。所謂共識的本質,就是一種讓區塊鏈各個節點上的數據保持一致的方法。而各種不同的共識算法,就是為了達到此目的而采用的不同技術方法。我們要理解一個重要概念:“共識機制”的根本目的在于確保區塊鏈各節點上的數據是一致的。
因此,達成共識注定是一個“慢”且“費勁”的過程,但這就是代價——為了實現區塊鏈系統的分布式、去中心化、獨立驗證、數據難被篡改等特性所必須付出的代價。無論未來人類發明出多么高性能的共識算法,網絡和計算性能有多大程度的提高,可以肯定的是,區塊鏈系統的性能必然會始終低于集中式系統。對這一事實的理解和把握,是我們決定一個應用是否應該采用區塊鏈技術,或者決定一個應用的哪些部分應該采用區塊鏈技術的重要原則,即高性能永遠不是采用區塊鏈技術的首要目標。
共識算法對公鏈(公共區塊鏈,或無須許可的區塊鏈)至關重要,因為任何人不需要任何許可就能加入這類區塊鏈網絡,因此無法確認節點的意圖,即便發現其可能有惡意也難以杜絕,這就導致共識算法幾乎是保證這類區塊鏈系統可靠的唯一途徑。而需要許可的區塊鏈,例如聯盟鏈,其成員往往被一定規則約束,從身份識別驗證、加入網絡、訪問權限到參與活動都是受控制的。在這類區塊鏈架構中,除共識算法之外還有很多方法可以保證系統安全和數據一致性,因此可以選擇更輕量的共識機制,例如實用拜占庭容錯算法(Practical Byzantine Fault Tolerance,縮寫為PBFT),而在聯盟鏈環境下選擇工作量證明機制往往是不必要的。
拜占庭容錯及實用拜占庭容錯算法
拜占庭容錯是由萊斯利·蘭波特于1982年在其同名論文中提出的分布式點對點網絡通信容錯問題。其含義是,在存在消息丟失的不可靠信道上試圖通過消息傳遞的方式達到一致性是不可能的。因此,對一致性的研究一般假設信道是可靠的,或不存在本問題。這個難題也被稱為“拜占庭將軍問題”或者“兩軍問題”。
實用拜占庭容錯算法是由米格爾·卡斯特羅和芭芭拉·利斯科夫在1999年發表的論文中提出的,該算法解決了原始拜占庭容錯算法效率不高的問題,將算法復雜度由指數級降低到多項式級,使得拜占庭容錯算法在實際系統應用中變得可行。
直到2020年年初,在公鏈類型的區塊鏈上,工作量證明仍然是唯一真正經受住了時間考驗和證明的共識機制。由于工作量證明共識機制通常會導致巨大的計算資源消耗,進而導致無謂的能耗競爭,業內一直在嘗試尋找更經濟實用、性能更好的方法。已經有為數眾多的區塊鏈項目嘗試采用權益證明機制或在其基礎上演變的改進版本算法,但其可靠性還需要時間來證明。近兩年,公鏈項目層出不窮,市場上出現了各種各樣的共識算法,好多都采用“Po?”(Proof of ?)來命名,有人開玩笑說,26個英文字母都不夠用了。這些算法中有一些作為學術討論和論文研究被學界接受,也有一些純屬無稽之談或炒作,但無一例外都尚未在實際應用中得到足夠的驗證。
P2P通信
為了成為一個有“共識”的、可靠的分布式數據庫,而且能夠不依賴任何中間人,區塊鏈必須在網絡傳輸上有所突破,解決這個問題的方法就是P2P(點對點)通信。所謂P2P通信,就是節點之間直接通信而不需要經由第三方。我們不要被P2P這樣的字眼迷惑,其實這是最簡單、直接、“原始”的通信方式,是任何網絡通信的基礎。
區塊鏈出現之前,P2P技術已經取得了飛速發展,其最成熟的應用是文件的共享服務,這證明P2P技術可以實現高可靠性、高性能的數據同步,并且具備抗封鎖能力。
區塊鏈是由很多臺運行區塊鏈軟件的計算機組成的網絡系統,每臺這樣的計算機被稱為節點。很多情況下,一個節點對應著一臺真正的計算機,但也有可能多臺計算機一起工作才構成一個節點——通常是為了讓這個節點的計算能力更強。
區塊鏈每個節點都獨立地和其他節點進行通信,每個節點都會采用“存儲—轉發”策略來“收聽”其他節點發送的內容,并且廣播自己產生的信息或者轉發收到的信息(見圖1–4)。這種通信方式可以避免區塊鏈網絡依賴一些關鍵的中間節點,也可以防止少數節點被惡意操縱后對整個區塊鏈網絡產生影響。由于采用了P2P通信方式,區塊鏈的“去中心化”特性比常見的互聯網應用(如萬維網服務)更強。

圖1–4 客戶端服務器架構與點對點架構的比較示意
P2P技術及其發展歷程
P2P是一種分布式應用計算網絡架構,可在地位對等的參與者之間劃分任務或工作負載。參與節點在應用中享有同等的權利,平等參與,并形成點對點網絡。網絡節點將其部分資源(例如處理能力、磁盤存儲或網絡帶寬)直接提供給其他參與者,而無須服務器或穩定主機的集中協調。與傳統的客戶端服務器模型(其中資源消費和供給相分離)相反,這些節點既是網絡資源的供應者,又是消費者。
P2P在隱私性要求高的網絡中和文件共享領域得到了廣泛的應用。P2P這一概念最早出現在1969年4月7日的第一份RFC(Request For Comments,即征求意見)文檔中,RFC是互聯網工程任務組(Internet Engineering Task Force,縮寫為IETF)發布的一系列備忘錄,后來演變為用來記錄互聯網規范、協議、過程等的標準文件。
1999年:P2P音樂共享服務Napster上線
1999年,18歲的肖恩·范寧與19歲的肖恩·帕克上線發布P2P音樂共享服務Napster,首次把P2P技術變成為廣大消費者接受并喜歡的主流,是互聯網文件下載共享方式的一次變革。
2001年:BitTorrent(比特流)協議
2001年4月,布拉姆·科恩發布了BitTorrent協議,并在7月正式應用。BitTorrent協議是架構于TCP/IP協議(傳輸控制協議/網際協議)之上的一個P2P文件傳輸通信協議。它把文件虛擬分成大小相等的塊,并把每個塊的索引信息和哈希驗證碼寫入種子文件。下載者根據種子文件告知對方自己已有的塊,然后交換沒有的數據。使用BitTorrent協議,下載的人越多,提供的帶寬越多,下載速度也就越快;同時,擁有完整文件的用戶也會越來越多,文件的“壽命”會不斷延長。
2002年:Kademlia協議
2002年,彼塔·梅耶蒙科夫與戴維·馬茲埃瑞斯提出了第三代P2P網絡的節點動態管理和路由協議Kademlia,通過分布式哈希表實現信息的存儲和檢索。
相比之前的兩代協議,Kademlia以全局唯一ID(身份標識)標記P2P網絡節點,以節點ID異或(XOR)值度量節點之間距離,并通過距離分割子樹構建路由表,建立起一種全新的網絡拓撲結構,相比其他算法更加簡單和高效。
2005年,BitTtorrent實現基于Kademlia協議的分布式哈希表技術,eMule也實現了基于Kademlia的類似技術。以太坊使用Kademlia作為分布式網絡的底層算法。
2009年:比特幣協議
2009年1月,比特幣網絡上線,發布了第一個開源的比特幣客戶端軟件。這是P2P技術首次應用于加密數字貨幣,也成為區塊鏈最重要的基礎技術之一。
公開可驗證的數據
區塊鏈的節點都是可見的。對于比特幣、以太坊這種典型的公鏈而言,鏈上的任何數據都是完全公開的,也就是一旦數據上鏈,那么全世界任何人都可以看到,而且區塊鏈上的數據是難以刪除或修改的,因此一旦數據在區塊鏈之上發布就成為公開的信息。
區塊鏈上的數據普遍使用了一些常用的加密和簽名算法來保證數據的正確性和一致性,因此在每個區塊鏈節點上都可以立即驗證鏈上數據的正確性。事實上,這些節點在維護其數據時,總是通過這些算法隨時獨立地校驗數據,不會盲從任何第三方。
區塊鏈如何進行數據的驗證呢?這涉及兩個重要的計算機密碼學相關的技術:一是哈希算法,二是數字簽名
技術。
在區塊鏈里保存數據的時候,哈希算法被用在很多地方。例如,在每一“塊”數據里都保留有這一塊數據經過哈希計算的結果,因此只要把塊內的數據按照相同的哈希算法計算一遍,再比較一下結果是否一致,就能知道這塊數據是否正確。而區塊鏈里每一塊的數據還包含著前一塊的哈希計算結果,并且把前一塊的哈希計算結果用于自己這一塊來計算哈希結果。這樣一來,任何一點數據的變化都會牽一發而動全身。
區塊鏈上保存的來自用戶的數據都包含該用戶的數字簽名,數字簽名的特點是可以迅速驗證簽名的正確性,而且篡改數據、偽造簽名幾乎都是不可能的。每個區塊鏈的節點軟件都會獨立驗證每條數據的簽名是否吻合。
正因為區塊鏈具有這種數據公開可驗證的特點,把需要確保數據真實性、難以篡改、可以驗證的信息用區塊鏈實現是合乎情理的,這就是人們常說的“數據上鏈”。但數據上鏈通常并不是把數據本身放入區塊鏈,而是把數據真實性和一致性的證明信息(例如數據的哈希驗證碼)或加密后的數據放在區塊鏈上。
難以篡改的數據記錄
經常有人強調區塊鏈上的數據“不可篡改”。嚴格來講,這并不正確,區塊鏈上的記錄并非不可篡改,而只是“難以篡改”。通過前述的區塊鏈特點可見,區塊鏈是一種分布式數據庫,每個節點都有獨立驗證的能力,通過共識算法來保證各個節點數據一致。也就是說,要想“篡改”數據,首先得騙過每個節點的驗證算法,這已經非常困難了,其次還得騙過整個區塊鏈的共識機制,讓所有的節點都跟著改變,這更是難上加難。
區塊鏈之所以被稱為“區塊鏈”,就是因為其在組織數據記錄時采用“區塊”的方式來保持一大塊數據,并且把這些分成塊的數據用類似鏈表的方式按次序連接起來(見圖1–5)。這是在比特幣的實現之中最先出現的,并且一直為現在大部分區塊鏈設計所沿用。近年來也出現了少數不同方式的數據組織技術,如有向無環圖(見圖1–6),但絕大多數區塊鏈至今仍在采用“區塊”+“鏈”的方式組織數據。
在區塊鏈里,通常每條數據記錄被稱為“交易”(transaction)。這是沿襲比特幣的稱呼,比特幣上的數據基本就是和轉賬記錄類似的交易信息。直到現在,很多區塊鏈里的數據記錄仍然是這些交易信息,但也出現了一些其他的應用需求,使得這些數據記錄其實并不是“交易”(例如智能合約代碼)。關系型數據庫中也有transaction這一名詞,不過含義與上述完全不同,在中文翻譯里,與關系型數據庫相關的transaction多被翻譯為“事務”。讀者需要記住這兩個是完全不同的概念,千萬不要混淆。

注:這是一種最常見的計算機數據結構。它從一個節點內的指向信息,就可以知道下一個節點或者上一個節點在哪里。這樣一個節點連著一個節點,就像一根鏈條,所以被稱為鏈表。
圖1–5 鏈表

注:在圖論中,如果一個有向圖從任意頂點出發無法經過若干條邊回到該點,則為有向無環圖。
圖1–6 有向無環圖
區塊鏈是個“不支持刪除操作”的數據庫,區塊鏈的數據只會不斷增加,不會被刪除。由于這些特點,區塊鏈比較適用于非常重要、需要留下“審計記錄”的場合。例如,對關鍵敏感信息的訪問記錄或對保密資料的任何訪問意圖和使用記錄,如果采用區塊鏈技術來進行,就能有效對訪問行為進行審計分析(因為一旦這些記錄被記入區塊鏈就難以被修改或刪除)。
區塊鏈的數據雖然難以被篡改,但并不意味著“不可篡改”或“數據永不丟失”。一般而言,區塊鏈的節點越多、越分散,數據被篡改或完全被破壞的難度就越大,這是比較容易理解的。這也是大家提到區塊鏈就會想起“去中心化”的一個重要原因,在一個去中心化程度非常高的區塊鏈上,要篡改或破壞數據是極其困難的。但是,如果區塊鏈的網絡節點非常少(比如一個測試性的區塊鏈可能只在一個節點運行),或者如果全部或大部分節點控制在少數人手里,那么篡改或完全破壞數據是能夠做到的。
智能合約:鏈上的“代碼邏輯”
區塊鏈這個分布式數據庫里保存的是數據,而實際上從第一個區塊鏈比特幣開始,這些數據里就包含了“代碼邏輯”:比特幣腳本。由于比特幣腳本屬于一個功能特定的腳本語言,并且被設計成無狀態的特點,算不上是完整的“程序”,因此在比特幣出現后很長一段時間里沒人認為它是智能合約,但比特幣腳本實際上是一種區塊鏈智能合約的雛形。
以太坊是第一個引入更復雜的代碼邏輯的區塊鏈,并且沿用了尼克·紹博發明的詞匯“智能合約”,在極客社區廣受認可。但從實踐角度而言,它在相當程度上“誤導”了大眾——以太坊的智能合約既不具備我們常說的“智能”(人工智能、自動化邏輯等),也不太符合大眾理解的“合約”(合同、法律條款),而只是一種新的結合了區塊鏈的計算模型,配合了一個圖靈完備
的虛擬機和一種新的程序設計語言。我們會在后面的章節展開來講智能合約以及大家對它存在的常見認知誤區。
智能合約、圖靈機、虛擬機
1995年,計算機科學家、法學家及密碼學家尼克·紹博在其論文《智能合約:數字化市場的構建模塊》中提出了“智能合約”概念。智能合約是一套以數字形式定義的承諾,包括合約參與方可以在上面執行這些承諾的協議,其基本理念是把合約條款嵌入硬件和軟件中。以太坊實現了智能合約這一想法。
圖靈機是英國數學家阿蘭·圖靈在1936年提出的為了研究可計算問題而構思的抽象計算模型——將傳統的使用紙筆進行數學運算的過程進行抽象,由一個虛擬的機器替代人進行無數次的數學運算。這個虛擬的機器就是圖靈機,也就是現代計算機的雛形。
虛擬機是一種特殊的架構軟件,可以在計算機平臺和終端用戶之間創建一種環境,而終端用戶則是基于虛擬機這個軟件所創建的環境來操作其他軟件。虛擬機是計算機系統的仿真器,通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統,能提供物理計算機的功能。
把“程序邏輯”放在區塊鏈上,就使得這些代碼邏輯如同鏈上數據一般公開可驗證。也許有人問,如果代碼開源不是也可以做到公開嗎?是的,開源的代碼是公開的,但并不能做到可驗證。雖然你能看到項目的源代碼,但不能保證真正執行的就是源代碼對應的程序。以太坊的設計中實現了一個以太坊虛擬機(Ethereum Virtual Machine,縮寫為EVM),這些虛擬機包含在所有的以太坊節點軟件里作為其一部分。智能合約需要執行的時候,相當于每個以太坊的節點都獨立地執行這些代碼。
開源軟件
開源軟件又稱開放源代碼軟件,是一種源代碼可以被任意獲取的計算機軟件,這種軟件的著作權人在軟件協議的規定之下保留一部分權利并允許用戶學習、修改以及以任何目的向任何人分發該軟件。開源軟件同時也是一種軟件發行模式。一般的軟件僅可獲取已經過編譯的二進制可執行檔,通常只有軟件的作者或著作權人等擁有程序的源代碼。
以太坊智能合約的設計、實現和采用鏈節點內置專用虛擬機的執行模型只是代表智能合約的一種實現方法,并不是所有區塊鏈都應該采用相同的實現方法。以太坊成功后,大量追隨者都采用與以太坊完全一致的設計模式,此類設計在業內極為流行,但還是有不少知名區塊鏈技術采用不同的設計和實現:Hyperledger Fabric支持的鏈上代碼(Chaincode)可以被視為類似以太坊的智能合約,但其設計與實現跟以太坊的方式大相徑庭;ArcBlock的區塊鏈平臺選擇了采用鏈節點和智能合約運行環境統一在Erlang虛擬機BEAM上的策略;2019年6月,Libra一亮相旋即引起爭議,其智能合約設計雖與以太坊的設計有顯著不同,卻也有幾分類似。
智能合約可能是目前區塊鏈技術給人的遐想空間最大,卻也是人們存在誤解最多的概念。為此,我們在本書第二部分會專門針對智能合約和區塊鏈虛擬機介紹相關細節,并分析一些常見誤解。
自主賬戶體系
如果你使用過比特幣或以太坊這些區塊鏈,可能最容易產生的第一個疑惑就是:區塊鏈上的“賬戶”是沒有人給你“分配”的。這和過去大家熟悉的各種互聯網服務迥然不同——無論是傳統的互聯網服務,還是更傳統的銀行、證券公司等,用戶需要對方提供服務時,首先要做的就是在其平臺上申請和開通賬戶。為什么這些區塊鏈里面是有價值的數字貨幣,卻不需要事先開設賬戶?
我們回過頭考察一下,所謂傳統的賬戶,一般為某個機構在自己的記賬系統中給用戶分配一個標示屬于該用戶的且受機構規范的分賬記錄序列,也就是用戶的相關記錄首先得在這些機構的規范記賬系統下的子賬戶里。而自主賬戶體系的設計,相對于之前的互聯網賬戶是一個巨大的升級。
所謂自主賬戶,是指賬戶不是由其他人分配的,而是用戶自我產生、自我申明的。自主賬戶體系能夠實現,得益于現代計算機密碼學,用戶只需要按照一個算法執行一下,就可以獲得自己獨特的、安全的賬戶。自主賬戶體系的進一步發展和延伸,也許是區塊鏈應用除了數字貨幣以外的又一個重要領域——去中心化身份。去中心化身份將成為未來區塊鏈應用的一個重要基礎,甚至會成為下一個區塊鏈應用時代到來的標志,我們會在第4章專門介紹。
其實,自主賬戶體系更像是計算機系統產生之前的社會,我們每個人生而為人并不需要其他人和機構來證明。在現代文明社會,每個人的權利無須其他任何人賦予,因為人作為個體,其身份是自主的,也就是我們不需要任何其他人或者機構的“證明”、“認證”或“承認”,我們就是一個獨立的個體。想象一下在現實生活中,比如在商場使用現金購物時,我們不需要開戶,不需要給店家提供各種個人注冊信息,不需要認證身份,只需“一手交錢”,店家必然“一手交貨”。區塊鏈技術的自主賬戶讓個體和個體之間的數字資產交換轉移回歸到最初的階段。
值得一提的是,雖然采用自主賬戶體系是目前區塊鏈設計的主流,但也有少數區塊鏈項目并沒有采用這樣的體系(例如EOS及其各種分叉項目),而是采用類似互聯網那種需要申請賬戶的設計,這究竟是為照顧用戶習慣的折中主義還是一種退步,尚難有定論。
區塊鏈并不是真正匿名的
區塊鏈普遍采用的自主賬戶地址往往是一長串我們人類難以識別的字符或數字,因此不少人會誤認為區塊鏈是匿名的。但大部分區塊鏈并不實現真正的匿名,包括區塊鏈的鼻祖比特幣在內。除了少數專注于隱私需求的區塊鏈技術之外,大部分區塊鏈上的數據完全是公開的,也就是人們可以清晰地知道每筆交易的相關賬戶,如果是一筆轉賬,那么轉賬金額和交易賬戶都清清楚楚,雖然有可能不知道賬戶的戶主是誰,但這個賬戶在區塊鏈上的一舉一動完全大白于天下,而且一旦公開幾乎不可能被抹去(見圖1–7)。相比之下,互聯網業務數據往往不是完全公開的。雖然互聯網服務常常搜集各種用戶數據,但一般只有其內部才有訪問的能力和權限,出現隱私泄露問題通常是因為某些互聯網企業出售了含有用戶隱私的數據,或者出現了數據泄露(可能來自外部黑客攻擊,也可能來自其內部的數據濫用或盜用)。
區塊鏈之所以似乎能保護用戶隱私,原因在于區塊鏈的賬戶及其對應的真實用戶身份在區塊鏈上不存在對應關系。正如前文所述,自主賬戶不需要向任何人或機構申請,因此用戶在使用這些自主賬戶的時候,沒有任何信息能把這些賬戶和真實世界的個人信息關聯起來。另外,區塊鏈采用P2P通信方式,很難在鏈本身的記錄里發現使用者的網絡IP地址等傳統的互聯網用戶定位信息。從這個角度而言,區塊鏈的匿名性的確比互聯網應用要更好一些,因為區塊鏈上雖然交易信息全公開,但畢竟沒有任何敏感的個人信息,自然不存在隱私泄露的問題。因此,在比特幣及其分叉幣出現后的相當長時間里,數字貨幣的這種“匿名性”和“隱私性”一度成為地下交易、暗網、跨境洗錢的利器。

注:2010年5月22日,拉斯洛·豪涅茨用1萬枚比特幣購買了兩個比薩餅,圖中為通過他的地址向外展開4層看到的所有的關聯地址和交易。該圖使用谷歌提供的BigQuery生成。
圖1–7 用比特幣購買比薩的交易蹤跡
由于區塊鏈數據的公開性,采用大數據分析的方法可以很容易發現各個賬戶之間的關系,賬戶的一舉一動都完全暴露在各種分析決策工具之下,由于區塊鏈的歷史數據也是公開的,因此可以在新的行為發生后倒推歷史行為和關聯的操作,反之亦然。通過大數據分析技術,還可以發現各種交易的典型特征,包括一些企圖迷惑偵查的行為。由于現實中的大部分數字貨幣交易所現在都已經有“了解你的客戶”(Know Your Customer,縮寫為KYC)和“反洗錢”(Anti-Money Laundering,縮寫為AML)的要求,從交易所的用戶數據就可以定位到用戶,此外,執法機構的各種執法行動中也能鎖定一些賬戶的真實背景。通過這兩種方法的結合,往往可以對區塊鏈上的交易做出非常精準的定位。
目前有部分區塊鏈技術,例如Zcash、Mimblewimble等主打徹底的隱私匿名。盡管它們在技術上可以做到一定程度的匿名,但其存在和應用在法律和監管領域面臨嚴峻挑戰,其應用前景難以預料。
本書第四部分會介紹區塊鏈數據分析這種應用方式,可以看到如何在實際應用中有效地掌握區塊鏈上的一舉一動。因此,讀者需要知道區塊鏈并非真正匿名,相反是完全公開透明的。