- 區塊鏈解密:構建基于信用的下一代互聯網
- 黃步添 蔡亮
- 11字
- 2019-10-31 17:52:50
第1章 區塊鏈之前世今生
1.1 比特幣
1.1.1 產生背景
比特幣(Bit Coin)的概念最初是由中本聰在2008年發表的論文《比特幣:一種點對點的電子現金系統》[1]中提出的。這種電子現金系統起始于按中本聰的思路設計、發布的開源軟件及建構于其上的P2P(Peer to Peer)網絡。比特幣是一種P2P形式下的數字貨幣。點對點的傳輸意味著一個去中心化的支付系統。
與大多數貨幣不同,比特幣不依靠特定的貨幣機構發行,它依據特定算法,通過大量的計算產生。比特幣經濟是指通過使用整個P2P網絡中眾多節點構成的分布式數據庫來確認并記錄所有的交易行為,并使用密碼學的設計來確保貨幣流通中各個環節的安全性。P2P的去中心化特性與算法本身可以確保任何人都無法通過大量制造比特幣來人為操控幣值。基于密碼學的設計可以使比特幣只能被真實的擁有者轉移或支付,同時確保了貨幣的所有權與流通交易的匿名性。比特幣與其他虛擬貨幣最大的不同是其總數量非常有限,具有極強的稀缺性。該貨幣系統曾在4年內只有不超過1050萬個,之后的總數量將被永久地限制在2100萬個。比特幣的特性如圖1-1所示。

圖1-1 比特幣的特性
1.1.2 技術原理
比特幣網絡通過隨機哈希值為全部交易加上時間戳,將它們合并入一個不斷延伸的、基于隨機哈希值的工作量證明(Proof of Work)鏈條作為交易記錄,除非重新完成全部的工作量證明,否則形成的交易記錄將不可更改。最長的鏈條不僅將被作為觀察到的事件序列(Sequence)的證明,而且被看做是來自CPU計算能力最大的池(Pool)。只要大多數的CPU計算能力都沒有打算聯合起來對全網進行攻擊,那么誠實的節點將會生成最長的、超過攻擊者的鏈條。
1 交易
交易是比特幣系統中最重要的部分。系統中任何其他部分都是為確保比特幣交易可以被生成,能在比特幣網絡中得以傳播和通過驗證,并最終被添加至全球比特幣交易總賬本(比特幣區塊鏈)。比特幣交易的本質是數據結構,這些數據結構中存放的是貨幣所有權的流轉信息,所有權登記在比特幣地址上。表1-1給出了比特幣交易記錄的詳細結構。這些信息是全網公開的,以明文形式存儲(比特幣系統里的所有數據都是明文),只有當需要轉移貨幣所有權時,才需要用私鑰簽名來驗證。
表1-1 比特幣交易記錄的結構

一枚電子貨幣是這樣的一串數字簽名:每一位所有者通過對前一次交易和下一位擁有者的公鑰(Public Key)簽署一個隨機哈希的數字簽名,并將這個簽名附加在這枚電子貨幣的末尾,電子貨幣就發送給了下一位所有者,而收款人通過對簽名進行檢驗,就能夠驗證該鏈條的所有者,具體交易模式如圖1-2所示。

圖1-2 交易模式
該過程的問題在于,收款人將難以檢驗之前的某位所有者是否對這枚電子貨幣進行了雙重支付。通常的解決方案是引入可信的第三方權威,或者類似于造幣廠的機構,來對每一筆交易進行檢驗,以防止雙重支付。在每一筆交易結束后,這枚電子貨幣就要被造幣廠回收,同時造幣廠將發行一枚新的電子貨幣;而只有造幣廠直接發行的電子貨幣才算作有效,這樣就能夠防止雙重支付。該解決方案的問題在于,整個貨幣系統的命運完全依賴于運作造幣廠的公司,因為每一筆交易都要經過該造幣廠的確認,它就像是一家銀行。
我們需要收款人能夠采取某種方法,來確保之前的所有者沒有對更早發生的交易實施簽名。從邏輯上看,為了達到目的,實際上需要關注的只是本次交易之前發生的交易,而不需要關注這筆交易發生之后是否會有雙重支付的嘗試。為了證明某一次交易是不存在的,唯一的方法就是獲悉之前發生過的所有交易信息。在造幣廠模型里,造幣廠獲悉所有的交易,并且決定交易完成的先后順序。如果想要在電子系統中排除第三方中介機構,那么交易信息就應當公開宣布[2]。這就需要整個系統內的所有參與者,都有唯一公認的歷史交易序列。收款人需要確保在交易期間絕大多數的節點都認同該交易是首次出現。
2 區塊
在比特幣網絡中,數據以文件的形式被永久記錄,這些記錄稱之為區塊。一個區塊是一些或所有最新比特幣交易的記錄集,且未被其他先前的區塊記錄。可以把區塊想象為一個股票交易賬本。在絕大多數情況下,新區塊一旦被加入到記錄的最后(在比特幣中的名稱為塊鏈),就再也不能改變或刪除。每個區塊記錄了它被創建之前發生的所有事件。
區塊主要由兩部分構成,即塊頭和塊體。塊頭用于鏈接到前面的塊并且為區塊鏈數據庫提供完整性的保證,塊體包含了經過驗證的、塊創建過程中發生的價值交換的所有記錄。具體地講,每個數據區塊包括神奇數、區塊大小、區塊頭部信息、交易計數、交易詳情6部分。表1-2描述了數據區塊的具體結構[3]。其中,最后一項“交易詳情”記錄了該區塊中的所有交易信息。
表1-2 數據區塊的結構

區塊頭中記錄了版本號、父區塊哈希值、Merkle根哈希、時間戳、難度目標、隨機數(Nonce)等信息,具體的結構如表1-3所示[4]。隨機數(Nonce)是一個挖礦難度的答案,該答案對于每個區塊都是唯一的。新區塊如果沒有正確的答案,是不能被發送到網絡中的。“挖礦”過程的本質是在競爭中“解決”當前區塊,即確認該區塊的記賬權。每個區塊中的數學問題難以解決,但是一旦發現了一個有效解,其他網絡節點很容易驗證這個解的正確性。對于給定的區塊可能有多個有效解,但對于要解決的區塊來說只需要一個解。每解決一個區塊,都會得到新產生的比特幣獎勵,因此每個區塊包含一個記錄,記錄中的比特幣地址是有權獲得比特幣獎勵的地址。這個記錄被稱為生產交易或者Coinbase交易,它經常是每個區塊的第一筆交易。
表1-3 區塊頭部的結構

區塊哈希值更準確的名稱應該是區塊頭哈希值,通過SHA-256算法對區塊頭進行二次哈希運算得到。區塊哈希值可以唯一、明確地標識一個區塊,并且任何節點通過簡單地對區塊頭進行哈希運算都可以獨立地獲取該區塊的哈希值。但是,區塊哈希值實際上并不包含在區塊的數據結構里,不管該區塊是在網絡上傳輸,還是它作為區塊鏈的一部分被存儲在某節點的永久性存儲設備上時。實際上區塊哈希值是當該區塊從網絡中被接收時,由每個節點計算出來的。區塊的哈希值可能會作為區塊元數據的一部分被存儲在一個獨立的數據庫表中,以便于索引和更快地從磁盤中檢索區塊。
由于每一個區塊的塊頭都包含了前一區塊的哈希值,這就使得從第一個區塊至當前區塊連接在一起后形成一條長鏈,即比特幣區塊鏈。第一個區塊由中本聰在北京時間2009年1月4日02:15:05創建,該區塊也被稱為“創世區塊”(Genesis Block)[5]。新版本的比特幣系統將它設定為0號區塊,而舊版本的比特幣系統設定它的序號為1。它是比特幣區塊鏈里所有區塊的共同祖先,這意味著從任一區塊循鏈向前回溯,最終都將到達創世區塊。每一個節點都“知道”創世區塊的哈希值、結構、被創建的時間和里面的一個交易。因此,每個節點都把該區塊作為區塊鏈的首區塊,從而構建成了一個安全的、可信的區塊鏈的根。
3 時間戳服務器
比特幣的本質是構造了一個永不停息、無堅不摧的時間戳系統。時間戳服務器通過對以區塊形式存在的一組數據實施隨機哈希運算,并加上時間戳,然后將該隨機哈希值進行廣播,就像在新聞或世界性新聞網絡組的發帖一樣[6],如圖1-3所示。顯然,該時間戳能夠證實特定數據必然于某特定時刻是的確存在的,因為只有在該時刻存在了,才能獲取相應的隨機哈希值。每個時間戳應當將前一個時間戳納入其隨機哈希值中,每一個隨后的時間戳都對之前的一個時間戳進行增強,這樣就形成了一個鏈條[7][8][9]。

圖1-3 時間戳服務器工作示意圖
4 雙花問題
加密數字貨幣和其他數字資產一樣,具有無限可復制性的缺陷,例如同一個文件可以通過附件的形式保存并發送任意多次。如果沒有一個中心化的機構,人們無法確認一筆數字現金或資產是否已經被花掉或提取。為了解決“雙花”問題,可以通過可信賴的第三方機構保留交易總賬,從而保證每筆現金或資產只被花費或提取過一次。在區塊鏈中,每一個區塊都包含了上一個區塊的哈希值,從創始區塊開始鏈接到當前區塊,從而形成塊鏈。每一個區塊都要確保按照時間順序在上個區塊之后產生,否則前一個區塊的哈希值是未知的。同時,由于區塊鏈中所有交易都要進行對外廣播,所以只有當包含在最新區塊中的所有交易都是獨一無二且之前從未發生過,其他節點才會認可該區塊。因此在區塊鏈中,要想“雙花”會非常困難。
5 拜占庭將軍問題
拜占庭將軍問題[10]是一個共識問題,其核心描述的是軍中可能有叛徒,卻要保證進攻的一致。由此引申到計算領域,發展成為一種容錯理論。隨著比特幣的出現和興起,這個著名的問題又重新進入大眾視野。
關于拜占庭將軍問題,一個簡易的非正式描述如下:拜占庭帝國想要進攻一個強大的敵人,為此派出了10支軍隊去包圍這個敵人。這個敵人雖不比拜占庭帝國強大,但也足以抵御5支常規拜占庭軍隊的同時襲擊。基于一些原因,這10支軍隊不能集合在一起單點突破,必須在分開的包圍狀態下同時攻擊。他們中的任意一支軍隊單獨進攻都毫無勝算,除非有至少6支軍隊同時襲擊才能攻下敵國。他們分散在敵國的四周,依靠通信兵相互通信來協商進攻意向及進攻時間。困擾拜占庭將軍們的問題是,他們不確定軍隊內部是否有叛徒,而叛徒可能擅自變更進攻意向或者進攻時間。在這種狀態下,拜占庭將軍們能否找到一種分布式的協議來讓他們能夠遠程協商,從而贏取戰斗?
如果每支軍隊向其他9支軍隊各派出一名信使,那么就是10支軍隊每支派出了9名信使,也就是在任何一個時間有總計90次的信息傳輸。每支軍隊將分別收到9封信,每一封信可能寫著不同的進攻時間。此外,部分軍隊會答應超過一個的攻擊時間,故意背叛發起人,因此他們將重新廣播超過一條的信息鏈。這使得整個系統迅速變質成不可信的信息和攻擊時間相互矛盾的糾結體。
比特幣通過對這個系統做一個簡單的修改并解決了這個問題,它為發送信息加入了成本,這降低了信息傳遞的速率,并加入了一個隨機元素以保證在同一個時間只有一支軍隊可以進行廣播。它加入的成本是“工作量證明”,這是基于計算一個隨機哈希的算法。
6 工作量證明
為了在點對點的基礎上構建一組分散化的時間戳服務器,僅僅像報紙或世界性新聞網絡組一樣工作是不夠的,我們還需要一個類似于亞當·柏克(Adam Back)提出的哈希現金機制[11]。在進行隨機哈希運算時,工作量證明機制引入了對某一個特定值的掃描工作,比如在SHA-256下,隨機哈希值以1個或多個0開始。隨著0的數目的增加,找到這個解所需要的工作量將呈指數增長,但是檢驗結果僅需要一次隨機哈希運算。
假設在區塊中補增一個隨機數,這個隨機數要能使該給定區塊的隨機哈希值出現所需的那么多個0。通過反復嘗試來找到這個隨機數,直到找到為止,這樣就構建了一個工作量證明機制。只要該CPU耗費的工作量能夠滿足該工作量證明機制,那么除非重新完成相當的工作量,否則該區塊的信息是不可更改的。由于之后的區塊是鏈接在該區塊上的(如圖1-4所示),所以想要更改該區塊中的信息,就需要重新完成之后所有區塊的全部工作量。

圖1-4 區塊鏈接示意圖
同時,該工作量證明機制還解決了在集體投票表決時,誰是大多數的問題。如果決定大多數的方式是基于IP地址的,一個IP地址一票,那么如果有人擁有分配大量IP地址的權力,則該機制就被破壞了。而工作量證明機制的本質則是一個CPU只能投一票。“大多數”的決定表達為最長的鏈,因為最長的鏈包含了最大的工作量。如果大多數的CPU為誠實的節點控制,那么誠實的鏈條將以最快的速度延長,并超越其他的競爭鏈條。如果想要對已出現的區塊進行修改,攻擊者必須重新完成該區塊的工作量,外加該區塊之后所有區塊的工作量,并最終趕上和超越誠實節點的工作量。
另一個問題是,硬件的運算速度在高速增長,且節點參與網絡的程度會有所起伏。為了解決這個問題,工作量證明的難度將采用移動平均目標的方法來確定,即難度根據預設的每小時生成區塊的平均速度來調整。如果區塊生成的速度過快,那么難度就會提高。
7 網絡
運行比特幣網絡的步驟如下:
01新的交易向全網進行廣播;
02每一個節點都將收到的交易信息納入一個區塊中;
03每一個節點都嘗試在自己的區塊中找到一個具有足夠難度的工作量證明;
04當一個節點找到了一個工作量證明,它就向全網進行廣播;
05當且僅當包含在該區塊中的所有交易都有效,且是之前未存在過的,其他節點才認同該區塊的有效性;
06其他節點表示它們接受該區塊,而表示接受的方法,是在跟隨該區塊的末尾,制造新的區塊以延長該鏈條,被接受區塊的隨機哈希值將視為先于新區塊的隨機哈希值。
節點始終都將最長的鏈條視為正確的鏈條,并持續工作和延長它。如果有兩個節點同時廣播不同版本的新區塊,那么其他節點在接收到該區塊的時間上將存在先后差別。此時,它們將在率先收到的區塊基礎上進行工作,但也會保留另外一個鏈條,以防后者變成最長的鏈條。該僵局的打破要等到下一個工作量證明被發現,當其中的一條鏈條被證實為是較長的一條時,在另一條分支鏈條上工作的節點將轉換陣營,開始在較長的鏈條上工作。
所謂“新的交易要廣播”,實際上不需要抵達全部的節點。只要交易信息能夠抵達足夠多的節點,那么它們將很快被整合進一個區塊中。區塊的廣播對被丟棄的信息是具有容錯能力的。如果一個節點沒有收到某特定區塊,那么該節點將會發現自己缺失了某個區塊,也就可以提出下載該區塊的請求。
8 激勵
系統約定:每個區塊的第一筆交易進行特殊化處理,該交易產生一枚由該區塊創造者擁有的新的電子貨幣。這樣就增加了節點支持該網絡的激勵,并在沒有中央集權機構發行貨幣的情況下,提供了一種將電子貨幣分配到流通領域的方法。這種將一定數量新貨幣持續增添到貨幣系統中的方法,與耗費資源去挖掘金礦并將黃金注入到流通領域非常類似。此時,CPU的計算時間和電力消耗就是消費的資源。
另外一個激勵的來源則是交易費。如果某筆交易的輸出值小于輸入值,那么差額就是交易費,該交易費將被增加到該區塊的激勵中。只要既定數量的電子貨幣已經進入流通,那么激勵機制就可以逐漸轉換為完全依靠交易費,本貨幣系統也就能夠免于通貨膨脹。
激勵系統也有助于鼓勵節點保持誠實。如果有一個貪婪的攻擊者能夠調集比所有誠實節點加起來還要多的CPU計算力,那么他就面臨一個選擇:要么將其用于誠實工作產生新的電子貨幣,要么將其用于進行二次支付攻擊。這樣他就會發現,按照規則行事、誠實工作是更有利可圖的。因為該規則能夠使他擁有更多的電子貨幣,而不是破壞這個系統使得其自身財富的有效性受損。
9 回收硬盤空間
如果最近的交易已經被納入了足夠多的區塊之中,那么就可以丟棄該交易之前的數據,以回收硬盤空間。為了同時確保不損害區塊的隨機哈希值,交易信息被隨機哈希運算時,構建成一種梅克爾樹(Merkle Tree)的形態[12][13],使得只有樹根被納入區塊的隨機哈希值,如圖1-5所示。通過將該樹的分支拔除的方法,老區塊就能被壓縮,而該樹內部的隨機哈希值是不必保存的。

圖1-5 梅克爾樹
不含交易信息的區塊頭(Block Header)大小僅有80字節。如果設定區塊生成的速率為每10分鐘一個,那么每一年產生的數據為4.2MB(80bytes× 6×24×365=4.2MB)。2008年,PC系統通常的內存容量為2GB,按照摩爾定律的預言,即使將全部的區塊頭存儲于內存之中都不是問題。
10 簡化的支付確認
在不運行完整網絡節點的情況下,系統也能夠對支付進行檢驗。一個用戶需要保留最長工作量證明鏈條的區塊頭的副本,它可以不斷向網絡發起詢問,直到它確信自己擁有最長的鏈條,并能夠通過梅克爾樹的分支通向它被加上時間戳并納入區塊的那次交易。節點想要自行檢驗該交易的有效性原本是不可能的,但通過追溯到鏈條的某個位置,它就能看到某個節點曾經接受過它,并且于其后追加的區塊也可進一步證明全網曾經接受了它。圖1-6為最長工作量證明的示意圖。

圖1-6 最長工作量證明示意圖
最長的工作量證明鏈
此時,只要誠實的節點控制了網絡,檢驗機制就是可靠的。但是,當全網被一個計算力占優的攻擊者攻擊時,將變得較為脆弱,因為網絡節點能夠自行確認交易的有效性,只要攻擊者能夠持續地保持計算力優勢,簡化的機制會被攻擊者偽造的(Fabricated)交易欺騙。一個可行的策略是,只要發現了一個無效的區塊,就立刻發出警報,收到警報的用戶將立刻開始下載被警告有問題的區塊或交易的完整信息,以便對信息的不一致進行判定。對于日常會發生大量收付業務的商業機構,可能仍會希望運行他們自己的完整節點,以保持較大的獨立完全性和檢驗的快速性。
11 價值的組合與分割
雖然可以對單個電子貨幣進行處理,但是對于每一枚電子貨幣單獨發起一次交易是一種笨拙的辦法。為了使價值易于組合與分割,交易被設計為可以納入多個輸入和輸出,如圖1-7所示。一般而言是某次價值較大的前次交易構成的單一輸入,或者由某幾個價值較小的前次交易共同構成的并行輸入。但是輸出最多只有兩個:一個用于支付;另一個用于找零。

圖1-7交易信息
需要指出的是,雖然一筆交易依賴之前的多筆交易,這些交易又各自依賴于多筆交易,但是這并不存在任何問題。因為這種工作機制并不需要展開檢驗之前發生的所有交易歷史。
12 隱私
傳統的造幣廠模型為交易的參與者提供了一定程度的隱私保護,因為試圖向可信任的第三方索取交易信息是嚴格受限的,但是如果將交易信息向全網進行廣播,就意味著這樣的方法失效了。然而隱私依然可以得到保護:將公鑰保持為匿名。公眾得知的信息僅僅是有某個人將一定數量的貨幣發送給了另外一個人,但是難以將該交易同某個特定的人聯系在一起。也就是說,公眾難以確信,這些人究竟是誰。這同股票交易所發布的信息是類似的,每一手股票買賣發生的時間、交易量是記錄在案且可供查詢的,但是交易雙方的身份信息卻不予透露。傳統隱私模型與新隱私模型的對比如圖1-8所示。

圖1-8 隱私模型
作為額外的預防措施,使用者可以讓每次交易都生成一個新的地址,以確保這些交易不被追溯到一個共同的所有者。不過由于存在并行輸入,一定程度上的追溯還是不可避免的,因為并行輸入暗示這些貨幣都屬于同一個所有者。此時的風險在于,如果某個人的某一個公鑰被確認屬于他,那么就可以追溯出此人的其他很多交易。
1.1.3 比特幣的特點
比特幣作為一種電子貨幣,其特征如下:
● 去中心化。比特幣是第一種分布式的虛擬貨幣,整個網絡由用戶構成,沒有中央銀行。去中心化是比特幣安全與自由的保證。
● 全世界流通。比特幣可以在任意一臺接入互聯網的計算機上管理。無論身處何方,任何人都可以挖掘、購買、出售或收取比特幣。
● 專屬所有權。操控比特幣需要私鑰,它可以被隔離保存在任何存儲介質中,除了用戶自己之外,無人可以獲取。
● 低交易費用。可以免費匯出比特幣,但最終對每筆交易將收取約1比特分的交易費以確保交易能更快地被執行。
● 無隱藏成本。作為由A到B的支付手段,比特幣沒有繁瑣的額度與手續限制,知道對方比特幣地址就可以進行支付。
● 跨平臺挖掘。用戶可以在眾多平臺上發掘不同硬件的計算能力。
區別于傳統貨幣,比特幣具有以下明顯的優點:
● 完全去中心化。比特幣沒有發行機構,也不可能操縱發行數量,其發行與流通,是通過開源的P2P算法實現的。
● 匿名、免稅、免監管。
● 健壯性。比特幣完全依賴P2P網絡,無發行中心,所以外部無法關閉它。比特幣價格可能波動、崩盤,多國政府可能宣布它非法,但比特幣和比特幣龐大的P2P網絡不會消失。
● 無國界、跨境。跨國匯款需要經過層層外匯管制機構,而且交易記錄會被多方記錄在案。但如果使用比特幣交易,則直接輸入數字地址,按一下鼠標鍵,等待P2P網絡確認交易后,大量資金就轉過去了,它不需要經過任何管控機構,也不會留下任何跨境交易記錄。
● 山寨者難于生存。由于比特幣算法是完全開源的,誰都可以下載到源碼,修改些參數并重新編譯,就能創造出一種新的P2P貨幣。但這些山寨貨幣很脆弱,極易遭到51%攻擊。任何個人或組織,只要控制一種P2P貨幣網絡51%的運算能力,就可以隨意操縱交易及幣值,這會對P2P貨幣構成毀滅性打擊。很多山寨幣,就是死在了這一環節上。而比特幣網絡已經足夠健壯,想要控制比特幣網絡51%的運算力,所需要的CPU/GPU數量將是一個天文數字。
雖然比特幣有較多的優點,但其自身也存在一些缺陷:
● 交易平臺的脆弱性。比特幣網絡很健壯,但比特幣交易平臺很脆弱。交易平臺通常是一個網站,而網站會遭到黑客攻擊,或者遭到主管部門的關閉。
● 交易確認時間長。比特幣錢包初次安裝時,會消耗大量時間下載歷史交易數據塊。而比特幣交易時,為了確認數據的準確性,也會消耗一些時間與P2P網絡進行交互,得到全網確認后,交易才算完成。
● 價格波動極大。由于大量炒家介入,導致比特幣兌換現金的價格如過山車一般起伏,使得比特幣更適合投機,而不是匿名交易。
● 大眾對原理不理解以及傳統金融從業人員的抵制。活躍的網民了解P2P網絡的原理,知道比特幣無法人為操縱和控制,但普通大眾并不理解,很多人甚至無法分清比特幣和Q幣的區別。“沒有發行者”是比特幣的優點,但在傳統金融從業人員看來,“沒有發行者”的貨幣毫無價值。
1.1.4 重要概念
1 地址、私鑰、公鑰
地址是為了便于人們交換比特幣而設計出來的方案,因為公鑰太長了(130字符串或66字符串)。地址的長度為25字節,轉為Base58編碼后,為34或35個字符。Base58是類似Base64的編碼,但去掉了易引起視覺混淆的字符,又在地址末尾添加了4個字節的校驗位,以保障在人們用于交換的個別字符發生錯誤時,能夠因地址校驗失敗而制止誤操作。
私鑰是非公開的,擁有者需安全保管。私鑰通常是由隨機算法生成的,簡單地說,就是一個巨大的隨機整數,占32字節。大小介于1~0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD25E8C D0364141之間的數,都可以認為是一個合法的私鑰。于是,除了隨機生成方法之外,還可采用特定算法,由固定的輸入得到32字節輸出的算法,就可以成為得到私鑰的方法。
公鑰與私鑰是相對應的,一把私鑰通過推導可以推出唯一的公鑰,但使用公鑰卻無法推導出私鑰。公鑰有壓縮與非壓縮兩種形式。早期比特幣均使用非壓縮公鑰,現在大部分客戶端已默認使用壓縮公鑰。這個貌似是比特幣系統的一個近乎于特征的bug,早期編寫代碼時人少、活多,代碼寫得不夠精細,加上OpenSSL庫的文檔又不是足夠好,導致中本聰以為必須使用非壓縮的完整公鑰才可以。后來大家發現其實公鑰左右的兩個32字節是有關聯的,由左側(x)可以推出右側(y)的平方值,這樣有左側(x)就夠用了。因此,這兩種方式共存于現在系統里,并且應該會一直共存下去。兩種公鑰的首個字節為標識位,壓縮公鑰為33字節,非壓縮公鑰為65字節。以0X04開頭的為非壓縮公鑰,以0X02/0X03開頭的為壓縮公鑰,0X02/0X03的選取由右側(y)開方后的奇偶決定。壓縮形式可以減小Tx/Block的體積,每個Tx Input可減少32字節。圖1-9所示為公鑰、私鑰生成的示意圖。

圖1-9 公鑰、私鑰生成示意圖
2 橢圓曲線數字簽名算法
橢圓曲線數字簽名算法(ECDSA)是使用橢圓曲線密碼(ECC)對數字簽名算法(DSA)的模擬。ECDSA首先由Scott和Vanstone在1992年為了響應NIST對數字簽名標準(DSS)的要求而提出。ECDSA于1999年成為ANSI標準,并于2000年成為IEEE和NIST標準。ECDSA在1998年已為ISO所接受,并且包含它的其他一些標準亦在ISO的考慮之中。與普通的離散對數問題(Discrete Logarithm Problem, DLP)和大數分解問題(Integer Factorization Problem, IFP)不同,橢圓曲線離散對數問題(Elliptic Curve Discrete Logarithm Problem, ECDLP)沒有亞指數時間的解決方法。因此,橢圓曲線密碼的單位比特強度要高于其他公鑰體制。
數字簽名算法(DSA)在聯邦信息處理標準FIPS中有詳細論述,稱為數字簽名標準。它的安全性基于素域上的離散對數問題。橢圓曲線密碼(ECC)由Neal Koblitz和Victor Miller于1985年發明。它可以看作是橢圓曲線對先前基于離散對數問題(DLP)的密碼系統的模擬,只是群元素由素域中的元素數換為有限域上的橢圓曲線上的點。橢圓曲線密碼體制的安全性基于橢圓曲線離散對數問題(ECDLP)的難解性。橢圓曲線離散對數問題遠難于離散對數問題,橢圓曲線密碼系統的單位比特強度要遠高于傳統的離散對數系統。因此,在使用較短的密鑰的情況下,ECC可以達到與DLP系統相同的安全級別。這帶來的好處就是計算參數更小,密鑰更短,運算速度更快,簽名也更加短小。橢圓曲線密碼尤其適用于處理能力、存儲空間、帶寬及功耗受限的場合。
3 梅克爾樹
梅克爾樹(Merkle Trees)是區塊鏈的基本組成部分[14]。雖然從理論上來講,沒有梅克爾樹的區塊鏈也是可行的,人們只需創建直接包含每一筆交易的巨大區塊頭(Block Header)就可以實現,但這樣做無疑會帶來可擴展性方面的挑戰。從長遠發展來看,這樣做的結果是,可能只有那些最強大的計算機,才可以運行這些無需受信的區塊鏈。
梅克爾樹是哈希大量聚集數據“塊”(Chunk)的一種方式,它依賴于將這些數據“塊”分裂成較小單位(Bucket)的數據塊,每一個Bucket塊僅包含幾個數據“塊”,然后取每個Bucket單位數據塊再次進行哈希運算,重復同樣的過程,直至剩余的哈希總數為1,即根哈希(Root Hash)。
梅克爾樹最為常見和最簡單的形式,是二叉梅克爾樹(Binary Merkle Tree),其中一個Bucket單位的數據塊總是包含了兩個相鄰的塊或哈希值,其描述如圖1-10所示。

圖1-10 二叉梅克爾樹示意圖
那么,采用這種奇怪的哈希算法有什么好處嗎?為什么不直接將這些數據塊串接成一個單獨的大塊,用常規的哈希算法進行運算呢?答案在于,它允許了一個整齊的機制,稱之為梅克爾證明(Merkle Proofs)。
一個梅克爾證明包含了一個數據塊,這棵梅克爾樹的根哈希,以及所有沿數據塊到根路徑哈希的“分支”。有人認為,這種證明可以驗證哈希的過程,至少是對分支而言。梅克爾證明的應用也很簡單:假設有一個大數據庫,而該數據庫的全部內容都存儲在梅克爾樹中,并且這棵梅克爾樹的根是公開并且可信的(例如,它是由足夠多個受信方進行過數字簽名的,或者它有很多的工作量證明);當一位用戶想在數據庫中進行一次鍵值查找(比如“請告訴我,位置在85273處的對象”),就可以詢問梅克爾證明,并接收到一個正確的驗證證明(收到的值,實際上是數據庫在85273位置上的特定根)。梅克爾證明允許了一種機制,這種機制既可以驗證少量的數據,例如一個哈希值,也可以驗證大型的數據庫(可能擴至無限)。
梅克爾證明的原始應用是比特幣系統。比特幣區塊鏈使用梅克爾證明,為的是將交易信息存儲在每一個區塊中。這樣做的好處就是中本聰所描述的“簡化支付驗證”(SPV),而不必下載每一筆交易以及每一個區塊。比如,一個“輕客戶端”(Light Client)可以僅下載鏈的區塊頭,數據塊大小為80字節,每個區塊頭中僅包含5項內容:上一區塊頭的哈希值、時間戳、挖礦難度值、工作量證明隨機數,以及包含該區塊交易的梅克爾樹的根哈希。圖1-11所示為Tx3的梅克爾樹分支。

圖1-11 Tx3的梅克爾樹分支
如果一個輕客戶端希望確定一筆交易的狀態,它可以簡單地要求一個梅克爾證明,顯示出一個梅克爾樹特定的交易,其根是在主鏈(Main Chain)非分叉鏈上的區塊頭。
這種機制會讓我們走得很遠,但比特幣的輕客戶端確實有其局限性。一個特別的限制是,梅克爾樹雖然可以證明包含的交易,但無法證明任何當前的狀態(如數字資產的持有、名稱的注冊、金融合約的狀態等)。舉例來說,你現在擁有多少個比特幣?一個比特幣輕客戶端,可以使用一種協議,它將涉及查詢多個節點,并相信其中至少有一個節點會通知你,關于你的地址中任何特定的交易支出,這可以讓你實現更多的應用。但對于其他更為復雜的應用而言,這些是遠遠不夠的。一筆交易影響的確切性質,取決于之前的幾筆交易,而這些交易本身則依賴于更早的交易,所以最終你可以驗證整個鏈上的每一筆交易。
4 哈希現金
比特幣使用一種名叫“哈希現金”[11](Hash Cash)的工作量證明算法,這種算法的出現早于比特幣。最初創造這種算法的目的,只是使之成為反DOS攻擊的工具。哈希現金的靈感來自于這樣一個想法,即采用一些數學算法的結果難于發現且易于校驗。一個眾所周知的例子是因數分解一個大的數字(尤其是因數較少的數字)。將數字相乘來獲得它們的乘積的代價是低廉的,但找到那些因數的代價卻要高得多。
對交互式協商來說,使用因數分解法就足以勝任。比如,希望客戶端能象征性地付出代價才能訪問在線資源。這個時候可以定義一個協議,首先服務器向客戶端發送一個消息,說“只要您能因數分解這個數,我將讓您得到這個資源”。這樣,沒有誠意的客戶端將無法得到服務器上的資源,只有那些能夠證明自己有足夠的興趣、肯付出一些CPU周期來回答這個協商的客戶端才能得到這個資源。
不過,有一些資源無法很方便地進行交互式協商,比如,反垃圾電子郵件或者支付交易。怎么才能避免郵箱不被垃圾郵件所占據?一些人會說“我并不介意陌生人給我寫信,但是,我希望他們能以稍微認真些的態度,通過對我有價值的郵件親自與我取得聯系。至少,我不希望他們是垃圾郵件制造者,那些人向我甚至上百萬人發送包含同樣消息的郵件,期望有人能購買某種產品或者落入一個騙局。”而對于電子貨幣,其內容的復制也幾乎是沒有代價的。如何保證電子貨幣(內容)沒有被交易(發送)多次?這和反垃圾郵件面臨的是同樣的問題。
哈希現金的解決方法是:在電子郵件的消息頭中,增加一個哈希現金戳記(Hash Cash Stamp)哈希值,該哈希值中包含收件人地址、發送時間、Salt值。該哈希值特別之處在于,它至少前20位必須是0才是一個合法的哈希現金戳記。為了得到合法的哈希值,發送者必須經過許多次嘗試(改變Salt值,即系統用來和用戶密碼進行組合而生成的隨機數值)才能獲得。一旦生成戳記,希望每一個給我發送郵件的垃圾郵件制造者都不能重復使用該戳記。所以,哈希現金戳記要帶一個日期,這樣可以判定比指定時間更早的戳記是非法的。另外,哈希現金的接收端要實現一個重復支付數據庫,用來記錄戳記的歷史信息。
5 51%攻擊
一提到對比特幣的攻擊,大部分人想到的就是51%攻擊[15]。51%攻擊是指某個客戶端或組織掌握了比特幣全網的51%的算力之后,用這些算力來重新計算已經確認過的區塊,使區塊鏈產生分叉并且獲得利益的行為。對于51%算力擁有者,他不僅能夠修改自己的交易記錄并進行雙重支付,還能阻止區塊確認部分或者全部交易,以及阻止部分或全部礦工開采到任何有效的區塊。但是,他并不能修改其他人的交易記錄,阻止交易被發送出去(交易會被發出,只是顯示0個確認而已),卻通過改變每個區塊產生的比特幣數量,憑空產生比特幣,以及把不屬于他的比特幣發送給自己或其他人。
假如A掌握了整個網絡51%的算力,則可以計算出這樣一個區塊鏈:其中包含A所有發送到A私人賬戶上的比特幣交易信息。此時該區塊鏈的長度為10,但是A不向網絡廣播并把所有的比特幣在交易市場換成美元并提取出來,而且這筆交易記錄在正常的那個區塊鏈中。當A的美元正在提取時,那個正常的區塊鏈的長度是9,而A的區塊鏈長度是10。現在A才向網絡廣播出去,然后觀察,發現網絡會確認A的區塊鏈是正確的,但是實際上美元已經被A提取了,損失的是交易市場。
發動51%攻擊必須具備兩個條件。第一,必須掌握足夠的算力。無論是控制礦池,還是利用其他計算資源,總之必須使攻擊者的算力領先于現在網絡的總算力。領先的幅度越大,成功的可能性越高。第二,拿到足夠的比特幣作為籌碼,無論是自己挖到的,還是從任何渠道買的,都可以。只有具備這兩個條件,才能發起51%攻擊。攻擊過程首先是將手中的比特幣充值到各大交易所,然后賣掉,提現,或者也可以直接賣給某人或某一群人;再運用手中的算力,從自己付款交易之前的區塊開始,忽略自己所有的付款交易,重新構造后面的區塊,利用算力優勢與全網賽跑;當最終創建的區塊長度超過原主分支區塊,成為新的主分支,便完成攻擊。一旦攻擊完成,自己所有的對外付款交易將被撤銷,等于收回所有已賣掉的比特幣。
過去幾年內,比特幣網絡的算力悄無聲息地增長到了無比之大,這大大增加了比特幣被51%攻擊成功的可能性。在依賴密碼學的數字貨幣領域,先發優勢是非常明顯的。51%攻擊對于比特幣來說并不是一個什么大問題(早在2013年7月,比特幣全網算力已經達到世界前500強超級計算機算力之和的20倍),所以即使有政府集全國之力秘密造出一臺超級計算機,用于擊潰比特幣來挽救自己的貨幣發行體系,但它會發現使用該能力進行挖礦便可壟斷比特幣的發行權,其收益會遠大于擊潰比特幣,因而動機也就不復存在了。
6 冷錢包
一直以來,比特幣行業的安全深受詬病,2014年3月曾是世界最大的比特幣交易平臺的Mt Gox總計遺失了85萬枚比特幣;2015年2月14日比特兒(BTER)存錢罐丟失總額為7170BTC。比特幣的理想是構建一種金融社交網絡,實現人類的金融民主。時至今日,比特幣的基礎技術架構仍有很大的提升空間。比特幣交易平臺、在線錢包等如何安全地保存大量比特幣是整個行業面臨的重要問題。比特幣的安全是基于比特幣的核心加密算法和私鑰的安全保存。密碼學界認為比特幣的密碼學基礎(SHA-256和EDSA)在目前的解密技術能力下,是絕對安全的。比特幣安全的主要問題就在于私鑰的保存,所以業界通常采用冷錢包的方式(絕對不接觸互聯網的錢包)來保存大量的比特幣。
比特幣錢包的冷儲存[16](Cold Storage)是一種將錢包離線保存的方法。具體來說,用戶在一臺離線的計算機上生成比特幣地址和私鑰,并將其妥善保存起來,以后由挖礦或者在交易平臺得到的比特幣都可以發送到這個離線生成的比特幣地址上面。由這臺離線計算機生成的私鑰永遠不會在其他在線終端或者網絡上出現。
使用比特幣錢包冷儲存技術主要是出于安全上的考慮,舉兩個例子:
例一,某比特幣超級大戶想保證他的比特幣錢包絕對安全,即使在計算機被黑客入侵的情況下,黑客依然得不到比特幣私鑰。為此,這位大戶必須使用冷儲存技術,離線生成幾對比特幣地址和私鑰,作為冷儲存錢包,以后所有需要儲存的比特幣都發送到這些地址上面,這就初步保證了比特幣的安全。
例二,某比特幣交易平臺每天都有龐大的比特幣用戶群活動,這些用戶在平臺上存有數以萬計的比特幣,為了保證這些比特幣的安全,交易平臺的管理人員便每天定時將主機服務器上所儲存的比特幣放入冷儲存錢包中,而只在服務器上保存少量的比特幣,來應付正常的提現請求。這樣,就算有黑客入侵了交易平臺主機,也無法得到用戶所儲存的比特幣。
那么如何進行冷存儲呢?首先是私鑰的產生和備份,步驟如下:
01在完全離線的計算機上生成10000個私鑰及對應的地址,并對私鑰進行AES加密,然后刪除原始私鑰;
02將AES密碼由兩個分屬異地的人掌握;
03將加密后的私鑰和明文地址生成二維碼加密文檔,通過掃描完全離線計算機生成地址文檔二維碼,用于日常使用。
熱錢包往冷錢包匯幣,每次必須是一個未使用過的地址,每個地址不可重復使用,然后從線上往冷錢包匯幣,步驟如下:
01從地址文檔中取出相應地址;
02根據安全級別,每個地址匯不超過1000枚比特幣,每個地址使用一次之后就不可再使用。
最后是從冷錢包取幣,取幣過程如下:
01把私鑰密文通過二維碼掃描放入完全離線計算機;
02掌握AES密碼的人在完全離線計算機上進行解密,獲得私鑰明文。通過二維碼掃描把私鑰明文導入到另一臺完全離線的計算機中,在另一臺完全離線計算機上進行簽名交易,并把簽名后的交易通過二維碼或U盤同步至有網絡的計算機中并廣播交易。
7 閃電網絡
比特幣閃電網絡[17](Bitcoin Lightning Network)是一項針對比特幣的設計改進,它可以讓用戶以去中心化的方式進行小額支付。該網絡通過在用戶間增補哈希化時間鎖合約(Hashed Time Lock Contracts)來解決比特幣規模問題和立即支付問題。目前,該項目面臨的首要問題是“軟分叉”,即修改比特幣協議,無效化之前的區塊和交易,同時舊節點依然可以識別新的有效區塊。
與當今的金融系統相比,Vi s a在標準的節假日每秒能處理4.5萬筆交易,通常的一個營業日則為數億次交易,然而比特幣現在每秒僅能支持約7筆交易,同時還會受到區塊鏈大小的限制。要想實現每秒4.5萬筆交易,比特幣必須進行離線處理。
閃電網絡的工作原理可能聽起來比較復雜,本質的工作原理非常類似于如下這個例子:假設所有的比特幣交易能夠在一個開放的論壇(比特幣公共賬戶)中探討,閃電網絡在特定的時間段內可以讓各方進入到一個密閉的房間(在此段時間內進行賒賬交易);在合約時間結束時,再將那些交易廣播到比特幣網絡上,這樣可以保證區塊鏈上保存最小化的信息。比特幣閃電網絡與現行的金融系統解決同類問題的方式極為相似。
8 多重簽名
一般來說,一個比特幣地址對應一個私鑰,動用這個地址中的資金需要私鑰的掌握者發起簽名才行。而多重簽名[18]地址,可以有3個相關聯的私鑰,用戶需要其中的2個才能完成一筆轉賬。實際上,用戶也可以設置成1/3、5/5、6/11的形式,但是最常見的是2/3的組合。
多重簽名托管的工作原理如下:當Alice想要發送20元錢給Bob購買一個產品時,Alice首先挑選一個相互信任的仲裁員,這里稱他為Martin;然后通過Alice, Bob, Martin三方多重簽名來發送20元錢;Bob看到付款后,確認訂單,郵寄商品;當Alice收到商品之后,她可以創建一個20元的多重簽名給Bob,來完成這筆轉賬;然后,Bob再對其進行簽名,這樣就完成了轉賬。另外,Bob也可能會選擇不發送產品,在這種情況下,他創建并簽署20元的退款交易發送給Alice,讓Alice可以簽名并發布。那么,如果Bob聲稱已經發貨,但是Alice拒絕付款呢?Alice和Bob就會聯系Martin,讓他來決定誰對誰錯。Martin贊成哪一方,他就創建一筆給自己1元和對方19元的交易,并由對方提供簽名,從而完成轉賬。
這種多重支付的方法需要為一個中介機構支付費用,那么它和Paypal相比好在哪里?首先,它是自愿的。在某些情況下,當用戶從一個有信譽的大公司購買東西或者匯款給一個受信任的賬戶時,是不需要中介機構的,只需A轉賬給B就好了。其次,該系統是可以調整的。有時候,某些轉賬的仲裁員需要非常專業的知識才能夠勝任。比如,用戶購買虛擬商品的時候,最好選擇虛擬商品平臺上的專業仲裁員,而在其他的時候,用戶可以選擇一個一般的仲裁員就夠了,因為專業仲裁員的收費比較高。市場上會產生一些專門的仲裁公司。通過多重簽名技術,用戶可以為每單交易輕松地選擇不同的仲裁員,也可以不需要仲裁員,這時就是0手續費了。
9 合并挖礦
比特幣工作量證明機制是指在礦工挖礦時,給區塊補增一個隨機數,并做隨機哈希運算,使得給定區塊的哈希值開頭含有一定數量的零。下面舉一個簡單的例子。
對短語“message”(不含引號)進行SHA-256哈希算法加密會得到:
ab530a13e45914982b79f9b7e3fba994cfd1f3fb22f71cea1afbf02b460c6d1d
現在開始加入數據,直到得到一個以0開頭的哈希值:
1message
daad0bc80059253928621a10365de153e335a18f03b9dc7e7e25897fb791f023
2message
6532f42bd1d6ccd00f47c133c3ca1a0fc852598e67c62eb31adab8ceb3a aa680
…
51message
0985e57510d017b177867168642543ab4f143333ad63782680e812251ab 3141e
經51次運算后得到第一個有效的哈希。只要“51message”一發送,接收器可以迅速通過哈希運算來驗證它是否符合要求。被添加的那部分數據(本例中的51)被稱作隨機數(Nonce),關鍵在于該隨機數可以是任何信息。
假設用戶在同時挖A幣與B幣,現在用戶有部分區塊數據來自A幣,部分區塊數據來自B幣,而且一個母隨機數不斷改變,直到用戶找到一個區塊。一旦用戶找到一個塊,它就是一個對A幣、B幣兩者同時有效的塊鏈(假設兩者的挖礦難度相等)。例如:
同時哈希以下數據:[A幣區塊數據|B幣區塊數據|公隨機數]
當一個塊被發現:
對A幣廣播區塊>> [A幣區塊數據]+隨機數=B幣區塊數據+[母隨機數]
對B幣廣播區塊>> [B幣區塊數據]+隨機數=A幣區塊數據+[母隨機數]
只要用戶愿意,就可以制造任意多的鏈。Slush礦池2011年就已經合并挖比特幣與域名幣(Name Coin)了。
合并挖礦的好處有:(1)同時為兩個區塊鏈貢獻哈希計算力,有助于提高兩個區塊鏈的安全性;(2)挖礦的回報更高,在消耗相同電力的情況下,同時獲得兩種貨幣。如果用戶不喜歡域名幣,可以把它賣掉或換成比特幣。
10 彩色幣
通過仔細跟蹤一些特定比特幣的來龍去脈,可以將它們與其他的比特幣區分開來,這些特定的比特幣就叫作彩色幣[19](Colored Bitcoins)。彩色幣具有一些特殊的屬性,比如支持代理或聚集點,從而具有與比特幣面值無關的價值。彩色幣可以用作替代貨幣、商品證書、智能財產以及其他金融工具,如股票和債券等。
比特幣的P2P支付結算系統已經安全建立,可以實現可靠的、近乎于免費的轉賬,比特幣網絡(協議)本身是安全、穩定的,但比特幣生態的服務提供商,比如匯率市場卻被黑客多次攻擊,這損害了比特幣的聲譽和交易價值。有沒有一種辦法可以利用比特幣安全可靠的自身協議,來創建分布式的匯兌交易呢?
BitcoinX就是這樣一個基于比特幣的開放的標準協議,就像HTTP和Bit Torrent協議一樣,該協議用來規范互聯網的價值交易。基于BitcoinX協議,用戶不但可以在分布式、安全的云平臺上持有比特幣,還可以持有黃金、歐元、美元或各種證券資產。這意味著人們可以使用金融工具進行自由交易,比如在某個節點G持有黃金,在另一個節點E持有歐元。用戶可以以一種安全、透明、直接的方式相互兌換,而不需要第三方的介入。
BitcoinX的設計思想是將比特幣網絡(技術)與貨幣價值分割開來,并使用比特幣網絡技術來明晰交易來路以避免重復消費。通過創世轉賬來建立一個新的貨幣(即彩色幣)。創世轉賬是一定量的比特幣轉賬,這些比特幣的金額將用來賦予所有這種新貨幣以價值。這一定數量的比特幣發送到的那個地址就是新貨幣的起源地址,它將控制新貨幣的初始分配。
彩色幣客戶端就是通過一種特殊的方法來計算資金平衡的輕量級客戶端。首先,所有轉賬的最后一個地址都是客戶端地址,通過抓取區塊鏈,可查看這些轉賬是否是來自創世轉賬。如果是,就將交易金額乘以初始分割率(假設0.00001BTC=1彩幣),得到用戶余額。彩色幣客戶端是分布式的,圍繞特定的創世轉賬創建一個社區,就創造了一個獨立的與比特幣網絡無關的“彩色幣”生態,這個小的經濟生態的波動建立在對比特幣基礎設施的利用上。
由于彩色幣也是普通比特幣,故它們也可以使用比特幣網絡,從一個地址傳送到另一個地址。因為有辦法識別出彩色幣,所以它們相當于稀有貨幣,因此它們的價值取決于用戶對這種稀有貨幣的需求,而與比特幣價值無關。
彩色幣怎樣進行初始分配呢?在貨幣創世時,彩色幣起源地址擁有該幣的總體價值。在分配結束時,所有的貨幣價值將從起源地址轉移到每個客戶端。
在實際應用中,彩色幣的擁有者不會知道貨幣總量有多少,此外,擁有者也不必知道想參與他的經濟的有哪些人。在這種情形下,彩色幣擁有者可以建立一個邀請系統,每一個新的客戶端都可以邀請其他客戶端加入。實現這種技術還有很長的路要走,比如社交網絡身份驗證、社交圖譜搜索、擔保系統、短信驗證、獨特的IP地址、物理識別等,這些方法可最大限度地減少在初次分配中的欺詐。