1.5 兩種簡單的加密貨幣
區塊鏈:技術驅動金融 作者:阿爾文德·納拉亞南 / 約什·貝努 等 投票推薦 加入書簽 留言反饋
現在,讓我們從密碼術過渡到加密貨幣。我們之前的密碼術幹貨在這裏就要開始發揮作用了,今後我們會逐漸看到各部分之間如何相互聯係,也會發現哈希函數和數字簽名等密碼程序的意義。在本節,我們將討論兩種很簡單的加密貨幣。當然,我們也需要學習本書後麵大量的內容,才能深刻闡釋比特幣本身的運作機製。
高飛幣
第一個是高飛幣(goofycoin,此幣的創造者叫高飛),它應該是我們能想到的最簡單的加密貨幣。高飛幣隻有兩個規則,第一個規則是指定高飛可以隨時創建新幣,且這些新創建的幣都屬於他。
為創建新幣,高飛生成一個他之前從未生成的唯一的貨幣編號(uniquecoinid),並建立字符串“createcoin [uniquecoinid]”。然後,他使用秘密簽署密鑰計算這個字符串的數字簽名,該字符串與高飛的簽名就構成一單位幣。任何人都可以驗證該新幣包含高飛有效簽名,因此該新幣為有效幣。
高飛幣的第二個規則是,擁有此幣的人可以將其轉給其他人。轉移一隻幣不是簡單地將幣數據結構發送給接受者,而是必須通過密碼程序來完成。
假設高飛想把他創建的一隻幣轉給愛麗絲。未達成這個目的,他需要創建一個新的聲明表示“將此幣支付給愛麗絲”,在此聲明中“此幣”就是該幣的哈希指針。如上所述,身份其實就是公鑰,因此“愛麗絲”指的就是愛麗絲的公鑰。最後,高飛簽署代表該聲明的字符串。因為高飛是起初擁有該幣的人,他必須簽署花掉該幣的任何交易。一旦由高飛簽署的代表他的交易的這個數據結構存在,愛麗絲便擁有這個幣。她可以向任何人證明她擁有這個幣,因為她可以展示有高飛有效簽名的數據結構。此外,它也指向曾經為高飛所有的一個有效幣。因此,該幣的有效性及所有權在係統中就不言自明了。
一旦愛麗絲擁有了這個幣,她也可以花掉它。為達到這個目的,她創建了一個聲明表示“將這個幣付給鮑勃的公鑰”,此時“這個幣”就是她所有的那個幣的哈希指針。當然,愛麗絲要簽署該聲明。任何看到這個幣的人都可以驗證鮑勃是其所有人。他們可以根據哈希指針鏈追溯到該幣的創建及驗證每一個步驟,這就是其合法所有人簽署了一份聲明表示“將這個幣支付給[新的所有人]”,詳見圖1.10。
圖1.10 高飛幣交易
注:該圖示例了貨幣創造的過程和被花費過兩次的過程。
總結一下,高飛幣的規則是:
<blockquote>
● 高飛可以通過簽署聲明表示他使用唯一的貨幣編號來創建一個新幣。
● 幣的所有人可以通過簽署聲明表示“將這個幣轉給x”(其中x為公鑰),將其轉給另一個人。
● 任何人都可以驗證一隻幣的有效性,跟隨哈希指針追溯到它是由高飛創建,並驗證過程中所有簽名。
</blockquote>
當然,高飛幣有一個致命安全隱患。假設愛麗絲通過把她簽署的聲明發送給鮑勃,即將她的幣轉給鮑勃,但並沒有告訴其他人。她也可以創建另一個簽名,聲明將同樣一隻幣轉給了查克(chuck)。對於查克來說,這看起來是一個完全有效的交易,而他是該幣的所有人。鮑勃和查克似乎都可以有效表示自己是那個幣的所有人。這個就是所謂的雙重支付(double spending)——愛麗絲將同樣一隻幣花了兩次。我們一看就知道貨幣是不能這樣花的。
事實上,雙重支付是任何加密貨幣需要解決的主要問題之一,高飛幣沒有解決這一問題,因此不安全。
高飛幣很簡單,其貨幣轉移機製其實與比特幣非常相似,但是因為它並不安全,因此並不適合作為加密貨幣。
財奴幣
為解決雙重支付問題,我們會涉及另外一個加密貨幣,我們將其稱為財奴幣(scroogecoin)。財奴幣是以高飛幣為基礎創建的,但在數據結構方麵更複雜。
第一個主要概念如下:一個叫財奴的指定實體將負責公布包含所有發生過的交易曆史記錄的僅增賬目(append-only ledger),賬目的僅增特性保證了寫入這個賬目的任何數據都會永久保留下來。如果賬目真的為僅增,通過要求所有的交易在被接收前都寫入項目,我們可以用其防止雙重支付的發生。這樣,如果之前幣已經轉給了一個不同的所有者,大家都可以看到。
為執行這個僅增功能,財奴可以建立一個區塊鏈(我們之前已經討論過其數據結構),對於區塊鏈,財奴要進行數字簽名,因此,這從而就形成了一係列數據塊,每個數據塊都包含一次交易(在實踐中,一種優化的做法是將多次交易放入同一個區塊中,比特幣就是這樣做的),每個區塊包含交易的id、交易的內容,以及上一個區塊的哈希指針。財奴數字簽名是針對最後一個哈希指針(它約束整個結構中所有的數據),並將簽名與區塊鏈一起發布,見圖1.11。
圖1.11 財奴幣係統中的區塊鏈
在財奴幣中,隻有在由財奴簽名的區塊鏈的交易才算數。任何人都可以通過核查財奴在區塊中的簽名來驗證交易是否經過財奴的支持,財奴會確保不會支持企圖雙重支付,也就是不會支持已經支付過的幣的交易。
為什麽除了讓財奴簽署每個區塊,我們還需要一個帶哈希指針的區塊鏈?這樣做是保證僅增特性。因為財奴有可能試圖增加或移除交易記錄,或者改變已有交易,而一旦有了哈希指針,將會影響到後麵所有的區塊。隻要有人監督財奴發布的最新哈希指針,變化會很明顯,並可以被輕易發現。在一個財奴分別簽署不同區塊的係統中,你需要記錄他簽署的每一個簽名。采用區塊鏈,兩個不同的人可以輕易驗證他們確實觀察到了同樣的,由財奴簽署的交易記錄。
財奴幣中有兩種交易。第一種是造幣(createcoins),類似於在高飛幣中,高飛可以創建新幣的程序,而財奴將其進行了擴展,那就是可以在一次交易中創建多個幣量,見圖1.12。
圖1.12 造幣交易
注:造幣交易創造多個貨幣。每一個貨幣在交易中都有一個序號。其次,每一個貨幣也有一定的數量,來對應某個數目的財奴幣。最後,每一個貨幣還有一個造幣記錄,在貨幣被製造出來的時候對應的公鑰。因此,造幣交易創造了多個不同數量和歸屬於不同擁有者的新貨幣。我們將這些貨幣稱為虛擬貨幣id,指的是該次交易中交易id和貨幣序號的組合。
造幣交易如果是由財奴簽署,從定義上說它總是有效的。我們不會擔心財奴什麽時候有權創建新幣或者可以創建多少,正如我們不擔心在高飛幣中,高飛可以創建新幣那樣。
第二種交易是付幣(paycoins)。這一交易會消耗幣,就是說消除它們,並創建具有相同總值的新幣。新幣可能屬於不同的人(公鑰),這一交易必須由每一個支付該幣的人來進行簽署。因此,如果你是本次交易中將會消耗的某隻幣的所有人,那麽你就需要數字簽署該交易,表明你同意花掉這隻幣。
財奴幣的規則闡明,如果以下四個條件為真,付幣交易有效:
<blockquote>
● 被消耗的幣為有效貨幣,即它們是在之前的交易中創建的。
● 被消耗的幣沒有在之前的某交易中被消耗掉。就是說,本次交易不是雙重支出。
● 本次交易產生的幣值量等於消耗的幣值量,也就是說,隻有財奴才可以創建新幣。
● 本次交易被消耗的所有幣均有其所有者的有效簽署。
</blockquote>
圖1.13 付幣交易
如果所有條件都滿足,那麽付幣交易有效,並且財奴會接受交易(見圖1.13)。他會通過將其附加到區塊鏈上,將交易寫入曆史記錄。之後,每個人都可以看見交易發生了。隻有在這時,參與者才可以接受交易實際發生了。直至發布之前,它都可能是一個被雙重支付搶占的交易,即使前三個條件都被滿足。
這個係統中的貨幣是不可變的——它們不會被改變、細分或者聯合。每個幣都在一次交易中被創建一次,然後在之後的其他交易中被消耗。但是我們可以通過交易對貨幣進行細分或聯合,來實現相同的效果。例如,為了細分一隻幣,愛麗絲創建了消耗該幣的新交易,然後生成了兩個具有同樣總值的新幣,這兩個新幣可以再次分配給她。因此,雖然在本係統中幣是不可變的,但是它具有除了可變幣以外的係統的所有靈活性。
現在,我們來看一下財奴幣的核心問題,財奴幣的工作原理是人們可以看見哪些幣是有效的。它防止雙重支付,因為每個人都可以查看區塊鏈,看到所有交易都是有效的,每一隻幣確實都隻被消耗了一次,但其問題是,財奴的權利太大了。他雖然不能創建虛假交易,因為他無法偽造其他人的簽名,但是他可以停止支持其他用戶的交易,不為他們提供服務並讓他們的貨幣無處可花。如果財奴是貪婪的(正如與他同名的卡通形象一樣),他可以拒絕公開交易,除非其他人向他支付強製性交易費。當然了,財奴還可以想要多少幣,就給他自己創建多少。或者財奴也可能厭倦整個係統,因此完全停止更新區塊鏈。
這裏的問題就是中心化。雖然財奴本身滿意這個係統,我們用戶可能會不滿意。財奴幣雖然看似是一個不切實際的方案,但是在很多早期的密碼係統研究中,確實假設過一些中央可信機構,還特別被稱為銀行。畢竟,絕大多數現實世界貨幣的確有可信發行人(通常為政府造幣廠)負責創建貨幣,並決定哪些錢幣為有效貨幣。但是,具有中央機構的加密貨幣紛紛在實踐中失敗。原因有很多,回頭來看,我們似乎很難讓人們接受有中央機構的加密貨幣這個事物。
因此,為改善財奴幣,並建立一個可行係統,我們需要解決的主要技術問題是:我們是否能讓係統“去財奴化”?也就是說,我們是否能放棄中心化的財奴人物?我們能夠有一個在很多方麵像財奴幣一樣運作的加密貨幣,但沒有中央信任機構嗎?
為回答這些問題,我們需要解決所有用戶如何在交易曆史記錄發生後,一致同意采用一個公開區塊鏈,他們必須一致同意哪些交易有效、哪些交易是實際發生了。他們還需要能夠用一種去中心化的方式分配id。最後,新幣的鑄造也需要通過去中心化的方式進行掌控。如果我們可以解決所有這些問題,那麽我們可以創建一個如同財奴幣那樣的貨幣,但確實沒有中心化的機構。實際上,這樣的一個係統就與比特幣非常相像了。
<h4>延伸閱讀</h4>
史蒂芬·列維(steven levy)的《密碼術》,從一個令人愉悅的、非技術的角度看待現代密碼術的發展,及其背後的人和事:
levy, steven. crypto: how the code rebels beat the government—saving privacy in the digital age. london:penguin, 2001.
現在密碼術還是一個較為理論化的領域,密碼學者使用數學以一種較為正規的方式定義其基礎知識、協議以及其他被用戶期望的安全特性,並根據關於特定數學問題的計算複雜性中被廣泛接受的假設,來證明它們的安全性。本章我們使用到了直覺語言來討論哈希函數及數字簽名。對於有興趣用更為嚴格的數學的方式,以及想更深入探索這些概念及其他密碼學理論的讀者,我們推薦你閱讀:
katz, jonathan, and yehuda lindell. introduction to modern cryptography, second edition. boca raton,fl:crc press, 2014.
對於應用密碼學概述,參見:
ferguson, niels, bruce schneier, and tadayoshi kohno. cryptography engineering: design principles and practical applications. hoboken,nj:john wiley & sons, 2012.
精讀定義sha-256的nist標準是了解密碼學標準的有效方式:
nist.“secure hash standards, federal information processing standards publication.”fips pub 180-4. information technologyboratory, nist, gaithersburg, md, 2008.
最後,請參考討論ecdsa簽名算法標準化版本的論文:
johnson, don, alfred menezes, and scott vanstone. “the elliptic curve digital signature algorithm (ecdsa).” international journal of information security 1(1)2001:36-63.
高飛幣
第一個是高飛幣(goofycoin,此幣的創造者叫高飛),它應該是我們能想到的最簡單的加密貨幣。高飛幣隻有兩個規則,第一個規則是指定高飛可以隨時創建新幣,且這些新創建的幣都屬於他。
為創建新幣,高飛生成一個他之前從未生成的唯一的貨幣編號(uniquecoinid),並建立字符串“createcoin [uniquecoinid]”。然後,他使用秘密簽署密鑰計算這個字符串的數字簽名,該字符串與高飛的簽名就構成一單位幣。任何人都可以驗證該新幣包含高飛有效簽名,因此該新幣為有效幣。
高飛幣的第二個規則是,擁有此幣的人可以將其轉給其他人。轉移一隻幣不是簡單地將幣數據結構發送給接受者,而是必須通過密碼程序來完成。
假設高飛想把他創建的一隻幣轉給愛麗絲。未達成這個目的,他需要創建一個新的聲明表示“將此幣支付給愛麗絲”,在此聲明中“此幣”就是該幣的哈希指針。如上所述,身份其實就是公鑰,因此“愛麗絲”指的就是愛麗絲的公鑰。最後,高飛簽署代表該聲明的字符串。因為高飛是起初擁有該幣的人,他必須簽署花掉該幣的任何交易。一旦由高飛簽署的代表他的交易的這個數據結構存在,愛麗絲便擁有這個幣。她可以向任何人證明她擁有這個幣,因為她可以展示有高飛有效簽名的數據結構。此外,它也指向曾經為高飛所有的一個有效幣。因此,該幣的有效性及所有權在係統中就不言自明了。
一旦愛麗絲擁有了這個幣,她也可以花掉它。為達到這個目的,她創建了一個聲明表示“將這個幣付給鮑勃的公鑰”,此時“這個幣”就是她所有的那個幣的哈希指針。當然,愛麗絲要簽署該聲明。任何看到這個幣的人都可以驗證鮑勃是其所有人。他們可以根據哈希指針鏈追溯到該幣的創建及驗證每一個步驟,這就是其合法所有人簽署了一份聲明表示“將這個幣支付給[新的所有人]”,詳見圖1.10。
圖1.10 高飛幣交易
注:該圖示例了貨幣創造的過程和被花費過兩次的過程。
總結一下,高飛幣的規則是:
<blockquote>
● 高飛可以通過簽署聲明表示他使用唯一的貨幣編號來創建一個新幣。
● 幣的所有人可以通過簽署聲明表示“將這個幣轉給x”(其中x為公鑰),將其轉給另一個人。
● 任何人都可以驗證一隻幣的有效性,跟隨哈希指針追溯到它是由高飛創建,並驗證過程中所有簽名。
</blockquote>
當然,高飛幣有一個致命安全隱患。假設愛麗絲通過把她簽署的聲明發送給鮑勃,即將她的幣轉給鮑勃,但並沒有告訴其他人。她也可以創建另一個簽名,聲明將同樣一隻幣轉給了查克(chuck)。對於查克來說,這看起來是一個完全有效的交易,而他是該幣的所有人。鮑勃和查克似乎都可以有效表示自己是那個幣的所有人。這個就是所謂的雙重支付(double spending)——愛麗絲將同樣一隻幣花了兩次。我們一看就知道貨幣是不能這樣花的。
事實上,雙重支付是任何加密貨幣需要解決的主要問題之一,高飛幣沒有解決這一問題,因此不安全。
高飛幣很簡單,其貨幣轉移機製其實與比特幣非常相似,但是因為它並不安全,因此並不適合作為加密貨幣。
財奴幣
為解決雙重支付問題,我們會涉及另外一個加密貨幣,我們將其稱為財奴幣(scroogecoin)。財奴幣是以高飛幣為基礎創建的,但在數據結構方麵更複雜。
第一個主要概念如下:一個叫財奴的指定實體將負責公布包含所有發生過的交易曆史記錄的僅增賬目(append-only ledger),賬目的僅增特性保證了寫入這個賬目的任何數據都會永久保留下來。如果賬目真的為僅增,通過要求所有的交易在被接收前都寫入項目,我們可以用其防止雙重支付的發生。這樣,如果之前幣已經轉給了一個不同的所有者,大家都可以看到。
為執行這個僅增功能,財奴可以建立一個區塊鏈(我們之前已經討論過其數據結構),對於區塊鏈,財奴要進行數字簽名,因此,這從而就形成了一係列數據塊,每個數據塊都包含一次交易(在實踐中,一種優化的做法是將多次交易放入同一個區塊中,比特幣就是這樣做的),每個區塊包含交易的id、交易的內容,以及上一個區塊的哈希指針。財奴數字簽名是針對最後一個哈希指針(它約束整個結構中所有的數據),並將簽名與區塊鏈一起發布,見圖1.11。
圖1.11 財奴幣係統中的區塊鏈
在財奴幣中,隻有在由財奴簽名的區塊鏈的交易才算數。任何人都可以通過核查財奴在區塊中的簽名來驗證交易是否經過財奴的支持,財奴會確保不會支持企圖雙重支付,也就是不會支持已經支付過的幣的交易。
為什麽除了讓財奴簽署每個區塊,我們還需要一個帶哈希指針的區塊鏈?這樣做是保證僅增特性。因為財奴有可能試圖增加或移除交易記錄,或者改變已有交易,而一旦有了哈希指針,將會影響到後麵所有的區塊。隻要有人監督財奴發布的最新哈希指針,變化會很明顯,並可以被輕易發現。在一個財奴分別簽署不同區塊的係統中,你需要記錄他簽署的每一個簽名。采用區塊鏈,兩個不同的人可以輕易驗證他們確實觀察到了同樣的,由財奴簽署的交易記錄。
財奴幣中有兩種交易。第一種是造幣(createcoins),類似於在高飛幣中,高飛可以創建新幣的程序,而財奴將其進行了擴展,那就是可以在一次交易中創建多個幣量,見圖1.12。
圖1.12 造幣交易
注:造幣交易創造多個貨幣。每一個貨幣在交易中都有一個序號。其次,每一個貨幣也有一定的數量,來對應某個數目的財奴幣。最後,每一個貨幣還有一個造幣記錄,在貨幣被製造出來的時候對應的公鑰。因此,造幣交易創造了多個不同數量和歸屬於不同擁有者的新貨幣。我們將這些貨幣稱為虛擬貨幣id,指的是該次交易中交易id和貨幣序號的組合。
造幣交易如果是由財奴簽署,從定義上說它總是有效的。我們不會擔心財奴什麽時候有權創建新幣或者可以創建多少,正如我們不擔心在高飛幣中,高飛可以創建新幣那樣。
第二種交易是付幣(paycoins)。這一交易會消耗幣,就是說消除它們,並創建具有相同總值的新幣。新幣可能屬於不同的人(公鑰),這一交易必須由每一個支付該幣的人來進行簽署。因此,如果你是本次交易中將會消耗的某隻幣的所有人,那麽你就需要數字簽署該交易,表明你同意花掉這隻幣。
財奴幣的規則闡明,如果以下四個條件為真,付幣交易有效:
<blockquote>
● 被消耗的幣為有效貨幣,即它們是在之前的交易中創建的。
● 被消耗的幣沒有在之前的某交易中被消耗掉。就是說,本次交易不是雙重支出。
● 本次交易產生的幣值量等於消耗的幣值量,也就是說,隻有財奴才可以創建新幣。
● 本次交易被消耗的所有幣均有其所有者的有效簽署。
</blockquote>
圖1.13 付幣交易
如果所有條件都滿足,那麽付幣交易有效,並且財奴會接受交易(見圖1.13)。他會通過將其附加到區塊鏈上,將交易寫入曆史記錄。之後,每個人都可以看見交易發生了。隻有在這時,參與者才可以接受交易實際發生了。直至發布之前,它都可能是一個被雙重支付搶占的交易,即使前三個條件都被滿足。
這個係統中的貨幣是不可變的——它們不會被改變、細分或者聯合。每個幣都在一次交易中被創建一次,然後在之後的其他交易中被消耗。但是我們可以通過交易對貨幣進行細分或聯合,來實現相同的效果。例如,為了細分一隻幣,愛麗絲創建了消耗該幣的新交易,然後生成了兩個具有同樣總值的新幣,這兩個新幣可以再次分配給她。因此,雖然在本係統中幣是不可變的,但是它具有除了可變幣以外的係統的所有靈活性。
現在,我們來看一下財奴幣的核心問題,財奴幣的工作原理是人們可以看見哪些幣是有效的。它防止雙重支付,因為每個人都可以查看區塊鏈,看到所有交易都是有效的,每一隻幣確實都隻被消耗了一次,但其問題是,財奴的權利太大了。他雖然不能創建虛假交易,因為他無法偽造其他人的簽名,但是他可以停止支持其他用戶的交易,不為他們提供服務並讓他們的貨幣無處可花。如果財奴是貪婪的(正如與他同名的卡通形象一樣),他可以拒絕公開交易,除非其他人向他支付強製性交易費。當然了,財奴還可以想要多少幣,就給他自己創建多少。或者財奴也可能厭倦整個係統,因此完全停止更新區塊鏈。
這裏的問題就是中心化。雖然財奴本身滿意這個係統,我們用戶可能會不滿意。財奴幣雖然看似是一個不切實際的方案,但是在很多早期的密碼係統研究中,確實假設過一些中央可信機構,還特別被稱為銀行。畢竟,絕大多數現實世界貨幣的確有可信發行人(通常為政府造幣廠)負責創建貨幣,並決定哪些錢幣為有效貨幣。但是,具有中央機構的加密貨幣紛紛在實踐中失敗。原因有很多,回頭來看,我們似乎很難讓人們接受有中央機構的加密貨幣這個事物。
因此,為改善財奴幣,並建立一個可行係統,我們需要解決的主要技術問題是:我們是否能讓係統“去財奴化”?也就是說,我們是否能放棄中心化的財奴人物?我們能夠有一個在很多方麵像財奴幣一樣運作的加密貨幣,但沒有中央信任機構嗎?
為回答這些問題,我們需要解決所有用戶如何在交易曆史記錄發生後,一致同意采用一個公開區塊鏈,他們必須一致同意哪些交易有效、哪些交易是實際發生了。他們還需要能夠用一種去中心化的方式分配id。最後,新幣的鑄造也需要通過去中心化的方式進行掌控。如果我們可以解決所有這些問題,那麽我們可以創建一個如同財奴幣那樣的貨幣,但確實沒有中心化的機構。實際上,這樣的一個係統就與比特幣非常相像了。
<h4>延伸閱讀</h4>
史蒂芬·列維(steven levy)的《密碼術》,從一個令人愉悅的、非技術的角度看待現代密碼術的發展,及其背後的人和事:
levy, steven. crypto: how the code rebels beat the government—saving privacy in the digital age. london:penguin, 2001.
現在密碼術還是一個較為理論化的領域,密碼學者使用數學以一種較為正規的方式定義其基礎知識、協議以及其他被用戶期望的安全特性,並根據關於特定數學問題的計算複雜性中被廣泛接受的假設,來證明它們的安全性。本章我們使用到了直覺語言來討論哈希函數及數字簽名。對於有興趣用更為嚴格的數學的方式,以及想更深入探索這些概念及其他密碼學理論的讀者,我們推薦你閱讀:
katz, jonathan, and yehuda lindell. introduction to modern cryptography, second edition. boca raton,fl:crc press, 2014.
對於應用密碼學概述,參見:
ferguson, niels, bruce schneier, and tadayoshi kohno. cryptography engineering: design principles and practical applications. hoboken,nj:john wiley & sons, 2012.
精讀定義sha-256的nist標準是了解密碼學標準的有效方式:
nist.“secure hash standards, federal information processing standards publication.”fips pub 180-4. information technologyboratory, nist, gaithersburg, md, 2008.
最後,請參考討論ecdsa簽名算法標準化版本的論文:
johnson, don, alfred menezes, and scott vanstone. “the elliptic curve digital signature algorithm (ecdsa).” international journal of information security 1(1)2001:36-63.