比特幣只是一個更廣泛的生態系統的一個組成部分(雖然是重要的一個),通常與之非常相似的貨幣稱為代幣。在本章中,我們將介紹altcoins(代幣、山寨幣)和加密貨幣的生態系統。
10.1 Altcoins:歷史與動機
比特幣于2009年1月推出。又過了兩年,直到2011年年中才推出第一個比特幣衍生系統Namecoin。2013年altcoin的發行比率開始爆發,數百個緊隨其后。總共有多少altcoin?不可能提供一個確切的數字,因為不清楚哪些altcoin是值得統計的。例如,如果有人宣布推出一個altcoin,并且可能會發布一些源代碼,但是沒有人開始挖掘或使用它,這是否算在內?一些其他altcoins已經啟動,被看到一些初步的使用,但后來發布后非常快地死亡了。
圖10.1:每月推出的Altcoins(通過創世區塊的創建來衡量的)。
還不太清楚一個altcoin相對于另一個簡單的加密貨幣意味著什么。畢竟,比特幣之前的各種各樣的加密安全提議和系統,通常不稱為altcoin。許多altcoin借用比特幣的概念,通常直接分配其代碼庫或以其他方式采用比特幣的一些代碼。有些只對比特幣進行非常小的修改,例如更改系統某些參數的值,并繼續整合Bitcoin開發人員所做的更改。到目前為止,我們所知道的所有altcoins開始于一個新的創世區塊和他們自己交易歷史的替代觀點,而不是在歷史上某一點之后分叉比特幣的區塊鏈。對于我們而言,我們不需要一個精確定義的altcoin。相反,我們將松散地參考自Bitcoin作為一個altcoin啟動后的任何加密機制。
我們將簡要介紹如Ripple和Stellar這樣的非altcoin系統:這些是我們在第2章中討論的傳統中的分布式共識協議。這些系統在一個節點具有標識且需要相互了解的模型中達成了共識。比特幣當然是從這個模式中脫穎而出的。在Ripple和Stellar中,共識協議支持支付/結算網絡,每個系統都有本地貨幣。盡管與altcoins有這些相似之處,但我們并不認為它們屬于這本書的范圍。
啟動altcoins的原因。每個altcoin需要一些故事來講述。如果一個altcoin不能聲稱一些與其他有所區別的特征,它就沒有理由存在。在最簡單的情況下,一個altcoin簡單的變化只會將一些內置參數更改為Bitcoin的。這包括區塊之間的平均時間,區塊的大小限制,創建區塊的獎勵計劃或者altcoin的通貨膨脹率。
也可能有更復雜的技術差異,這是一個更有趣的情況。例如,可以添加腳本語言來表達不同類型的交易或安全屬性。采礦可能會有所不同,共識算法也可能與比特幣有顯著差異。
有時候,altcoins還將發起一個主題或一種社區意識,即altcoin意圖支持或與之相關聯,通常會使這個社區的成員在altcoin中有特殊的角色或能力。我們將在本節后面的例子中看一下所有這些。
如何啟動altcoin。讓我們考慮一下推出altcoin的過程,以及altcoin發布之后會發生什么。正如我們所提到的,創建一個altcoin涉及創建一個新的參考客戶端,通常是通過分派一些現有代碼庫,更加完善的altcoin或比特幣本身。簡單的部分是添加一些你認為會很好的技術功能或修改的參數。事實上,曾經有一個名為Coingen的網站以少量費用將這個過程自動化。它允許你指定各種參數,如平均區塊創建時間和你想要的工作證明算法,以及altcoin的名稱,3個字母的貨幣代碼和徽標。然后點擊一個按鈕,你可以使用你選擇的參數下載比特幣分叉,而你(和其他人)可以立即開始運行它。
困難的部分是引導你采用你的altcoin。你可以分叉源代碼,你可以公開發布,但在這一點上,沒有人使用你的altcoin,所以它沒有市場價值(因為沒有人想要硬幣),沒有安全(因為還沒有礦工)。在第七章中,我們看到比特幣有一些利益相關者:開發商,礦工,投資者,商家,客戶和支付服務。最終,你必須吸引所有這些類型的參與者到你的altcoin經濟中才能起飛。
所有這些都是重要的和相關聯的,類似于直面挑戰啟動任何其他平臺并使之得到采納。如果你想啟動一個新的智能手機操作系統,那么你需要吸引用戶,設備制造商,應用程序開發人員和其他利益相關者,而這些組織中的每一個都需要其他人。
吸引礦工對于加密貨幣特別重要,因為一個altcoin背后沒有足夠的哈希能力,如果雙重支付和分叉可能導致安全性嚴重失敗。事實上,你的altcoin可能會完全超越;我們將在本章后面看看“altcoin殺嬰”。沒有一個簡單的配方來引導采用,但一般來說,礦工們會相信他們收到的硬幣獎勵值得付出努力。為了鼓勵這一點,許多altcoins給早期的礦工更大的回報。比特幣當然是開創了這種先例,但是一些altcoin已經采取了更積極的方法來回報早期的礦工。
讓社區的人們相信的altcoin是有價值的是最困難的技巧。正如我們在第7章中討論的那樣,即使是比特幣也不清楚這個過程是如何引導的,因為它依賴于叮叮當效應。這又回到了為什么altcoins需要一個很好的敘事:社區中脫離地面的人們需要相信新的altcoin在未來真正會有價值(并相信別人會相信它是有價值的,等等)。
給定一個人們有興趣獲得altcoin的社區,礦工通常會來(雖然如果價值上漲速度比礦工開始開采貨幣的速度更快,這可能是有風險的)。一旦有價值被感知,其他重要因素通常會反過來,就像在交易所上市,開發各種類型的配套基礎設施是有用的,從基礎鼓吹到探索區塊鏈的工具。
泵和傾銷的騙局。當一個代幣的創始人成功地引導社區和真正的交易市場時,他們經常發現自己很富有。這是因為他們幾乎肯定擁有大量的硬幣——例如在哈希率增加之前作為早期的礦工,甚至是我們在下面討論的“預采礦”。一旦代幣的匯率上升,如果他們選擇,創始人將能夠賣掉他們的硬幣。
富有的可能性吸引了創業人士和風險資本投資山寨幣,勿庸置疑,它也吸引了騙子。事實上,兩者之間的界線有時是模糊的。一個騙子可能會使用各種方法來夸大代幣的潛力,鼓起大家的興趣。他們可能會夸大其所謂的技術優勢,假冒基層支持的外表,以高價購買市場上的代幣等等。
事實上,這個騙局可以被一個不是代幣的創始人拉下來。他們首先需要購買一些晦澀的代幣的股票,然后說服公眾這個硬幣未被發現的潛力(即“泵”代幣)。如果他們以這種方式成功地提高了價格,他們可以卸下他們的股票并獲得利潤(即“傾倒”他們的硬幣)。在這一點上,投資者可能會對欺詐變得明智,價格會下降,許多人拿著無價值的硬幣。長期以來,在主流金融領域,這種使用晦澀低價的股票的泵和傾銷欺詐行為一直存在,而在早期的熱情高漲的代幣時代,這種情況特別普遍,投資者也在努力地將真正創新的代幣與沒有真正創新滑稽的市場系統“我也是”區別開來。結果,用戶和投資者今天對代幣有些厭倦。
初始配置。在比特幣中,貨幣僅通過采礦分配給用戶。但是由于種種原因,除了采礦之外,代幣開發商還尋求其他初始貨幣分配方式。
開發商可以“預先挖掘”貨幣,即為自己或其他指定實體(如具有特許權的非營利基金組織開發貨幣)預留一部分貨幣供應。這個想法是,意外之財的可能性使開發人員更有動力花時間創建和引導新的加密機制。有時候他們會進一步做一個“預售”,他們把這些預先挖掘的單元賣給比特幣或法定貨幣的其他投機者。這有點類似于投資一家創業公司:如果代幣規模變大,投機者就可以變得富有。
尋求額外的初始分配方法的另一個動機是確保早期貨幣擁有者擁有一個多元化的社區,并對其成功有利害關系,因為今天的采礦是相當集中的,可能會導致資產的集中所有權。實現多樣化所有權的一個聰明的方法是將代幣單員分配給現有的Bitcoin所有者。
我們如何在技術上設計系統,以便擁有比特幣的任何人都可以申請自己的份額,使得這種要求被自動執行。一個選項是燒傷證明,我們在第3章中討論過:用戶可以按照與他們可以銷毀的比特幣的數量成比例的方式來索賠新的代幣單元。所有者將承諾燃燒證明中的一些數據,例如識別特定代幣的特殊字符串,以表明他們正在燃燒比特幣,以獲得該特定代幣的新單元。
通過燃燒證明分配代幣也被稱為“單向栓”或“價格上限”。將一個代幣單元(比如說)關聯一個比特幣實際上并不值得一個比特幣。它確保代幣最多值得一個比特幣,因為一個比特幣總是可以兌換為一個代幣,但反之不亦然。
圖10.2:通過燃燒證明分配代幣。代幣支持GenCoin交易,將Bitcoin交易作為輸入。GenCoin由簽署燃燒證明(并使用相同簽名方案)的相同私鑰簽署。這樣可以確保同一位燒過比特幣的用戶也創建了GenCoin。如果栓比為1:1,則v'必須不大于v。
有一個不那么笨重的替代方案:要求證明比特幣的所有權,但不會燒掉它們,要求代幣。具體來說,代幣將指定比特幣區塊的高度(可能與代幣的發布日期一致),在此期間,任何人誰擁有一個未使用的比特幣交易量作為這一區塊能夠申請一定比例數量的代幣。在這個系統中,比特幣的價格和代幣的價格之間并不一定有固定的關系,因為比特幣不是通過燃燒證明“轉換”為代幣。
圖10.3:通過證明比特幣的所有權分配代幣。GenCoin的輸入是指定區塊高度處的一個或多個未使用的比特幣交易輸出。它是通過私鑰進行簽名的,這些私鑰控制著這些未使用的輸出,就像任何普通的比特幣交易一樣。這里所顯示的比特幣交易在指定的塊高度處具有兩個未使用的交易輸出到地址B和C。地址B的所有者聲稱他們的代幣,但地址C的所有者尚未這樣做。如果栓比為1:1,則v'必須不大于。
當然,為了使所有這一切都發生,代幣礦工也需要保持在比特幣區塊鏈上。代幣也必須指定什么數量作為一個確信的比特幣交易。一個選擇是要求一些固定數量的確認,比如說6。另一種選擇是指定每個代幣區塊中最新的比特幣區塊。這樣,比特幣交易立即可以在代幣中使用。這類似于在比特幣本身中的交易輸出可以在下一個區塊或甚至在相同的區塊中花費的事實。合并采礦,我們將在下一節討論,這是將代幣區塊與比特幣區塊結合在一起的一種方式。
最后,捐贈已經分配的硬幣是增加貨幣所有者多樣性的另一種方式。一種方法是小費:各種服務允許向電子郵件地址或社交媒體帳戶發送小費,這部分是激勵接受者了解和擁有貨幣利益的一種方式。小費服務將硬幣保留在托管中,收件人收到一條消息,告訴他們,他們有可以收集的硬幣。收件人可以通過他們的電子郵件地址或社交媒體帳戶向服務器進行認證來索取硬幣。他們還需要安裝錢包軟件或啟用其他方式來接收硬幣。另一種捐贈方式是一個水龍頭:這些服務可以向訪問某個網站或可能輸入電子郵件地址的任何人發送少量硬幣。
10.2幾個Altcoins的細節
現在我們將專注于一些最古老的代幣,并更詳細地研究其功能。
Namecoin。我們已經看到比特幣的區塊鏈是一個安全的全球數據庫。一旦數據被寫入它,它是防篡改的,其包含的可以被永遠證明。我們是否可以修改Bitcoin的設計,以支持其他安全的全局數據庫應用程序,如命名系統?
我們需要一些基本規則,使此數據庫對非貨幣應用程序更有用。首先,我們同意將數據條目視為名稱/值對,其名稱全局唯一。這允許每個人查找映射到名稱的值,就像哈希表或具有主鍵字段的數據庫。為了強制名稱的全局唯一性,如果一個名稱/值對與以前的數據庫條目具有相同的名稱,那么我們將其視為對該值而不是一個新條目的更新。
其次,我們同意只有最初創建特定名稱的條目的用戶才能更新該名稱。我們可以通過將每個名稱與比特幣地址相關聯并且要求更新事務由該地址的私鑰進行簽名來輕松實現。
我們可以在Bitcoin之上做到這一點,正如我們在第9章中所說的那樣,我們可以使用Bitcoin作為僅追加日志來構建任何重疊式貨幣。但是在一個代幣中做的更簡單,因為我們可以把這個紳士的協議寫成代幣的規則。這些規則之后將是不可侵犯的并且由礦工執行,而不是要求每個用戶(即,完整的節點)自己檢查規則,并獨立地決定如果違反了該做什么。完全正確,甚至可以允許SPV風格的證明:輕量級客戶端能夠向運行完整節點的服務器提交查詢(即名稱),并且服務器將返回該名稱的值,以及證明返回值實際上是數據庫中該名稱的最新更新。
這就是Namecoin。 它是一個全球名稱/價值商店,每個用戶可以注冊一個或多個名稱(以一定的費用),然后發布其名稱的值的更新。用戶還可以將他們名字的控制權轉讓給他人。事實上,你可以進行將你的域名轉讓給某人的交易,同時將Namecoin貨幣的單元從他們轉移給你。由于這是一個單一的原子交易,所以將你的域名銷售給你從未遇到并不信任的人是一種安全的方式。截至2015年,Namecoin不支持安全輕量級客戶端,但已經提出了支持這一點的擴展。
Namecoin的目標是提供分散版本的域名系統(DNS),數據庫中的名稱是域名,值是IP地址。默認情況下,你不能使用未經修改的瀏覽器,但你可以下載Firefox或Chrome瀏覽器外掛程式,以便允許你輸入地址,例如example.bit——以.bit結尾的任意域名——并且它將查找Namecoin注冊表中的位置,而不是傳統的DNS。
Namecoin在技術上是有趣的,也是歷史上有趣的——它實際上是第一個推出的代幣,在2011年4月,比比特幣推出晚兩年多。它具有“合并挖掘”,我們將在本章后面討論。
Namecoin從2015年開始就沒有太多使用。絕大多數注冊域名都是由“擅自占地者”采取的,希望(但是到目前為止還沒有)出售他們的名字以獲利。Namecoin的支持者傾向于認為,現有的DNS對互聯網關鍵組件的控制權過多地掌握在單個實體的手中。這個觀點在Bitcoin社區是受歡迎的,你可以想像,但是看起來主流用戶并不喜歡DNS的替代品,搶劫殺手級應用程序的Namecoin需要看到明顯的應用。
萊特幣。Litecoin也在2011年推出,在Namecoin之后的一段時間。在過去幾年中,Litecoin在整體人氣和用戶群方面一直是首屈一指的altcoin。它也是最廣泛的代碼庫。事實上,它比比特幣分叉的次數多得多。
Litecoin和Bitcoin的主要技術區別是,Litecoin具有第8章中討論的記憶硬挖掘難題(基于scrypt)。當Litecoin推出時,Bitcoin采礦是在GPU時代,所以Litecoin使用記憶硬挖掘難題的目標是GPU阻力。當它啟動時,你仍然可以用一個CPU挖掘Litecoin,很久以后,這變得對Bitcoin無用了。但從那時起,Litecoin并沒有成功地抵制GPU挖掘過渡到ASICs。相比比特幣,這些采礦轉型在Litecoin上花了更長一點的時間,但不清楚這是因為Litecoin的謎題在硬件上更難實現,或者因為Litecoin的較低匯率提供了較少的激勵。
無論如何,對于Litecoin,ASIC的性能改進相比CPU挖掘大致相似,一如他們對于比特幣一樣。在這個意義上,Litecoin的原始目標是通過維護一個CPU礦工社區來創建一個更加分散的系統。但是,重要的是,這個敘述仍然適用于引導Litecoin——它吸引了許多采用者停留,甚至在原來的前提失敗之后。Litecoin已經明確地改變了敘述,指出它的初始配置比Bitcoin更公平,因為它比ASIC更耐久。
Litecoin也進行了一些次要的參數更改:例如Litecoin的區塊誕生速度比比特幣快4倍,每2.5分鐘一個。否則,Litecoin盡可能地從比特幣中借用。事實上,它的發展緊隨比特幣,所以隨著比特幣的補丁和改進,Litecoin也采用了這些。
Peercoin。Peercoin有時被稱為PPCoin,于2012年底推出,是第一個采用礦產證據開采的代幣。我們在第8章中討論了權益證明采礦(Peercoin實施的),但是Peercoin有趣的是討論另外一個完全不同的原因:它的管理員有一個值得信賴的公鑰,經常用于分配“祝福”區塊的檢查點。這樣做的目的是為了防止分叉攻擊,但這是有爭議的,因為管理員控制系統的能力意味著Peercoin并不是真正的分散的系統。檢查點系統不是Peercoin固有的,可以在將來被刪除;但它的存在意味著我們不能推斷,權益證明已經導致了實際的安全系統。我們不知道如果這個保護措施被刪除會發生什么。
圖10.4:幾個Dogecoin標志之一。賣點比技術創新更幽默。
多吉幣。Dogecoin也許是迄今為止所有代幣中最豐富多彩的。它于2013年底發布,其區別不在于技術性(它是Litecoin的近叉),而是一組社區價值觀:傾訴,慷慨,而不是如此認真地對待密碼。事實上,它是以Doge命名的,一個有趣的互聯網模式,以語法挑戰的柴犬狗為特色。社區已經進行了一些有趣和成功的營銷活動,例如贊助NASCAR司機,并將Dogecoin標志全部放在車上。 他們還籌集了超過三萬美元,以支持牙買加國家山貓隊,以便他們可以在2014年冬季奧運中旅行和參加比賽。很明顯,這與1990年代的“酷奔跑”電影密切相關。
社區的慷慨,公關活動和Doge固有的價值結合意味著Dogecoin在2014年變得非常受歡迎。在Dogecoin之前,似乎很多早期采用者不熟悉加密貨幣,這提供了一個新的社區來引導貨幣的價值,而不必在其他貨幣方面提供令人信服的故事。Dogecoin表明,引導可以成功地與非技術一起敘述。不幸的是,像許多互聯網現象一樣,受歡迎程度并沒有持續下去,Dogecoin的匯率已經下滑了。
10.3比特幣與altcoins之間的關系
要了解不同代幣的相對大小或影響,我們可以使用各種指標。
代幣比較:市值。市值是通過將股票價格乘以已發行股份總數的方式來估算公司的價值的簡單方法。在代幣的背景下,這個市值經常被類似地用于估計代幣的所有價值,通過將一個單元代幣的價格(可能是最受歡迎的第三方交易所測量)乘以被認為流通中所有代幣的總數。按照這一指標,Bitcoin是迄今為止最大的——截至2015年,它占所有加密貨幣總體市值的90%以上。其他代幣的相對排名往往有很大差異,但重要的是大多數代幣在貨幣價值方面相對較小。
重要的是不要對市值進行太多解讀。首先,人們不一定要花費多少錢來購買流通中的所有硬幣。這個數字可能會更高或更低,因為大量訂單會影響貨幣的價格。第二,即使計算只考慮當前流通的硬幣,我們也應該期望市場參與者將匯率計算在一個新的硬幣將來會流通的事實,這進一步使數字的解釋復雜化。最后,我們甚至不能準確地估計當前正在流通的硬幣的真實數量,因為,我們無從知道一些硬幣的所有者可能已經丟失了他們的私鑰。
代幣比較:采礦權。如果兩個代幣使用相同的挖掘難題,我們可以直接比較他們所有代幣的礦工有多少采礦權。由于基于哈希謎題的顯著性,這通常被稱為哈希率。例如,Zetacoin是一個使用SHA-256挖掘謎題的代幣,就像Bitcoin一樣,截至2015年12月,網絡哈希率約為5 Terahash /秒(5 *哈希/秒)。這個數字是比特幣礦業的十分之一。比較使用不同采礦謎題的硬幣之間的采礦能力比較棘手,因為謎題可能需要不同的時間來計算。此外,專門用于其中一個硬幣的礦業硬件不一定可用于采礦(包括攻擊)另一枚硬幣。
即使對于使用完全獨特的挖掘謎題的代幣,我們仍然可以從隨著時間推移的采礦權相對變化中學到一些東西。采礦能力的增長表明,更多的參與者已經加入,或者已經升級到更強大的采礦設備。礦權的喪失通常意味著一些礦工拋棄了代幣,這通常是一個不祥的跡象。
代幣比較:其他指標。這里有幾個我們可以看的其他指標。隨著時間的推移,代幣的匯率變化給了我們關于其健康狀況的線索,并且往往與長時間的哈希率變化相關。各種第三方交易所的交易量是衡量交易所活動和興趣的量度。 另一方面,在代幣的區塊鏈上進行的交易量并沒有告訴我們,因為它可能只是用戶在自己的錢包里擺放自己的硬幣,甚至是自動的。最后,我們還可以看看有多少商家和支付處理商支持代幣——只有最突出的代幣往往被支付處理商支持。
Bitcoin-altcoin相互作用的經濟觀點。比特幣與代幣之間的關系很復雜。 在某種意義上,加密貨幣相互競爭,因為它們都提供了一種在線支付方式。如果有兩個標準,協議或者競爭格局,在他們所提供的方面大致相當,那么其中一個通常會被統治起來,因為經濟學家稱之為“網絡效應”。
例如,藍光和HD-DVD在2000年代中后期的激烈競爭中成為DVD格式的繼承者。漸漸地,藍光開始變得越來越受歡迎,很大程度上是因為流行的PlayStation
3控制臺用作藍光播放器。這使得藍光成為電影制片廠的更有吸引力的格式,并且這種受歡迎程度也在增加:隨著更多的電影被藍光發布,更多的消費者購買了獨立的藍光播放器,導致更多的電影發行等等。同樣的,如果你的朋友都有藍光播放器,你可以自己購買一臺,而不是一臺HD DVD播放器,因為你可以輕松地與他們交換電影。 大約兩年后,HD DVD變成了一個歷史腳注。
邊欄:誰贏得比賽?早在HD DVD之前,已經有無數的技術標準的例子,這些技術標準迅速地從競爭對手名單中失敗了,并且黯然失色,從Betamax模擬錄像到俄羅斯標準軌道履帶。如果你從未聽說過這些,網絡效應就是原因。有時,就像托馬斯·愛迪生的直流電網與尼古拉·特斯拉的交流電網一樣,贏家(AC)是由壓倒性的技術優勢決定的。然而,在許多其他情況下,如Betamax磁帶丟失到VHS磁帶,失敗者實際上在技術上是優越的,網絡效應足夠強大以克服輕微的技術缺點。
這一推理方式表明,一個加密的貨幣將占主導地位——可能是比特幣(Bitcoin),這是目前最流行的一個——即使一些后繼系統可以被認為在技術上是優越的。但這是一個過渡簡化。至少有兩點原因,加密貨幣之間的競爭并不如光盤格式之間的競爭。
首先,用戶將一個加密貨幣轉換為另一個是相對容易的,供應商可以接受一個以上的加密貨幣,這意味著多個加密貨幣可以更容易地共存和繁榮。在經濟學方面,加密貨幣顯示相對較低的交換成本。與DVD播放器相比,大多數人真的不希望在家中使用兩個龐大的機器,如果他們改變為播放另一個的機器,則不能轉換他們現有的光盤庫格式。加密貨幣的轉換成本當然不為零。例如,用戶可能會購買無法升級的硬件錢包。 但總的來說,可以輕松地切換加密幣或同時使用多個。
第二,正如我們前面所說,許多代幣具有獨特的特征,這為現有提供了明顯存在的理由。這些代幣不應該被視為比特幣的替代品;它們可能是正交的,或者甚至是互補的。以這種方式,互補的代幣實際上增加了比特幣的有用性,而不是與它競爭。如果Namecoin成功,比如比特幣用戶可以使用他們的比特幣來做一些更有用的事情。
但這張快樂合作的畫面也是過于簡單。一些代幣,如Litecoin,只是試圖實現與Bitcoin相同的功能,但是以不同的,也許更有效的方式。即使提供了新的功能,通常這些用例實際上可以在比特幣本身中實現,盡管這種方式不太優雅(在第11章中我們將更多地談到這一點)。比特幣模式的支持者認為,有許多代幣可以劃分可用的哈希能力,并使每種貨幣的安全性降低。
代幣的支持者認為,代幣允許市場力量確定哪些特征值得擁有,哪些系統在技術上是優越的,等等。他們進一步認為,有許多代幣限制任何一個系統潛在的災難性故障的損害。他們還指出,Bitcoin開發人員風險很大,通過軟硬盤向Bitcoin添加新功能是一件很慢而且困難的事情。另一方面,很容易通過代幣嘗試一個新的想法;代幣可以被看作是潛在的Bitcoin功能的研發測試平臺。
實際的結果是,Bitcoin的支持者和代幣的支持者之間有一些緊張關系,也是一種合作感。
10.4合并采礦
在這一節和下一節中,我們將放下文化,政治和經濟學的問題。相反,我們將專注于比特幣與代幣之間的技術交互。
代幣殺嬰。從2015年起,比特幣的哈希能力與其他任何代幣相比都有所差異。事實上,有強大的礦工和采礦池控制比整個代幣更多的采礦能力。這樣一個礦工或實體可能很容易地對一個小型的代幣進行攻擊(如果它使用與Bitcoin相同的SHA-256挖掘難題),造成分叉和一般破壞,這往往足以殺死代幣。我們稱這種現象是殺死嬰兒。
為什么有人會這樣做,他們必須用寶貴的礦業來這樣做,且不會獲得大量的金錢獎勵?以2012年的攻擊為例,CoiledCoin是一個小型代幣:Bitcoin采礦池運營商Eligius決定,CoiledCoin是一個騙局,是對隱私安全生態系統的侮辱。因此,Eligius將其礦業資源指向了CoiledCoin,采礦區塊,扭轉了日益增長的CoiledCoin交易歷史,并以空區塊開采長鏈,有效地導致拒絕服務攻擊,從而阻止了CoiledCoin用戶進行任何交易。經過相當短的圍攻,用戶放棄了CoiledCoin,它不再存在。在這個例子和其他的殺傷性殺戮恐怖襲擊中,攻擊者是由直接利潤以外的東西所激發的。
合并采礦。默認情況下——如果說一個代幣分叉比特幣源代碼,但沒有其他變化——代幣上的挖掘就是排他的。也就是說,你可以嘗試解決挖掘謎題解決方案,為代幣或Bitcoin找到一個有效的區塊,但是你不能嘗試一次解決兩個謎題。當然,你可以劃分你的礦業資源,把一些礦業用于代幣礦山,另一些則是在比特幣上采礦。你甚至可以在多個不同的代幣之間劃分,你可以隨著時間的推移調整你的分配,但沒有辦法讓你的礦業權力做雙重責任。
采用獨家開采技術,網絡效應可能使得代幣產品難以引導。如果你想推出一個代幣,并說服今天的比特幣礦工參與你的網絡,他們將不得不停止采礦比特幣(至少有一部分資源),這意味著立即損失比特幣礦業獎勵。這意味著你的代幣在哈希能力上可能保持較小,并且易受Bitcoin礦工的殺嬰型攻擊。
我們能否設計一個代幣,同時在代幣和比特幣上挖礦區塊成為可能?為了做到這一點,我們需要創建包含比特幣和代幣交易的區塊,使它們在兩個區塊鏈中都有效。很容易去設計這樣的代幣,以便它允許比特幣交易在其區塊上發生,因為我們可以寫我們想要的任何代幣規則。相反就比較困難。我們能把代幣交易放在比特幣區塊中的哪里?在第3章和第9章的后面我們已經看到了如何將任意數據放入比特幣區塊,但這些方法的帶寬是非常有限的。
有一個訣竅,雖然:即使我們不能把代幣交易的內容放在比特幣區塊中,我們可以把代幣交易的一個摘要放在比特幣區塊中,形式是哈希指向代幣區塊。找到一種將單個哈希指針放入每個比特幣區塊的方法很容易。具體來說,回想一下,每個比特幣區塊都有一個特殊的交易,稱為“coinbase交易”,這是礦工創建新硬幣作為區塊獎勵的地方。該交易的scriptSig字段沒有任何意義,因此可用于存儲任意數據(由于沒有花費任何先前的交易輸出,因此無需簽署Coinbase交易)。所以在合并開采的代幣中,挖掘任務是計算Bitcoin區塊,其Coinbase scriptsig包含一個哈希指針到一個代幣區塊。
這個區塊現在可以做雙重任務:對于Bitcoin客戶端,它看起來像任何其他Bitcoin區塊,在coinbase交易中的哈希可以被忽略。代幣客戶端知道如何通過忽略Bitcoin交易來解讀該區塊,看看在coinbase交易中由哈希所承諾的代幣交易。請注意,雖然這不需要對Bitcoin進行任何更改,但它確實要求代幣專門了解Bitcoin并接受合并開采的區塊。
如果我們的代幣合并開采,我們希望許多比特幣礦工能夠在其上挖礦,因為這樣做不需要額外的哈希力。它需要一些額外的計算資源來處理區塊和交易,礦工們需要知道和足夠關心我們的代幣,甚至打擾開采它。讓我們說25%的比特幣礦工通過哈希力挖掘我們的代幣。這意味著平均25%的比特幣區塊包含指向代幣區塊的指針。那么,似乎在我們的代幣中,一個新區塊將平均每40分鐘開采一次。更糟糕的是,雖然代幣礦仍在被引導下,比特幣礦工采礦的比例非常小,區塊之間的時間將是數小時或數天,這是不可接受的。
我們是否可以確保合并開采的代幣的區塊是按照我們想要的高或低的速度創建的,而不管比特幣礦工挖掘的比例如何?答案是肯定的。訣竅在于,即使采礦任務與比特幣相同,采礦目標也不是。代幣網絡獨立于比特幣網絡計算其區塊的目標和難度。正如比特幣調整其采礦目標,以便平均每10分鐘發現一個區塊,這個代幣會調整自己的目標,以便每10分鐘發現一次代幣的區塊,或任何其他固定值。
圖10.5:合并挖掘。
這意味著代幣的目標通常會比Bitcoin的目標低得多,而有些(甚至大多數)代幣模塊不會被有效的比特幣區塊所指向。但是沒關系!你應該將比特幣區塊鏈和代幣區塊鏈視為兩條平行鏈,偶爾從比特幣區塊指向代幣區塊。如圖10.5所示。在這個例子中,百分之六十的比特幣礦工開采了代幣,而代幣的時間間隔是5分鐘。這意味著代幣的困難是比特幣的60%* 5/10 = 30%。請注意,40%的比特幣區塊不包含哈希指針到代幣區塊。
相反,每個有效的代幣區塊都是從采礦比特幣區塊的嘗試產生的,但只有30%的人實際上滿足比特幣的難度目標。對于其他70%的代幣區塊,代幣網絡需要能夠驗證挖掘難題解決方案。要做到這一點的簡單方式是廣播比特幣臨近區塊另外的代幣區塊。但一個更聰明的方式是只廣播比特幣臨近區塊的頭部,以及在比特幣區塊中包含Coinbase交易的Merkle證明。
這也是可能的(盡管很少見),因為這個代幣實際上比Bitcoin有一個更難的謎題。這是不尋常的,因為大多數代幣希望每10分鐘發現一個區塊或更經常,而且如果由于某種原因,你想要的速度更慢,這也很容易實現。在這種情況下,你會看到一些比特幣區塊,礦工希望也是一個代幣區塊,但將被代幣網絡拒絕,因為他們沒有達到更難的難度目標。
最后,請注意,任意數量的代幣都可以同時與Bitcoin進行合并,每個礦工都可以自由挑選一個代幣的任意子集來組合我的礦物。在這種情況下,Coinbase scriptSig本身就是一個指向各種代幣區塊的哈希指針的Merkle樹。請注意復雜程度:驗證包含代幣交易需要驗證,其中包括:(1)代幣區塊中包含代幣交易的Merkle證明(2)Coinbase scriptSig中包含代幣區塊哈希的Merkle證明和(3)比特幣區塊或接近區塊中包括Coinbase scriptSig的Merkle證明。
合并采礦和安全。合并采礦是一種混合的祝福。正如我們所討論的那樣,它使引導更容易,并且由此導致你的代幣的總哈希力增加了其抵御攻擊的彈性。想要購買計算能力以摧毀你代幣的對手將需要做出巨大的前期投資。
另一方面,人們可以認為這是一種虛假的安全感,因為這樣的對手可能會通過采礦比特幣來補償他投資的成本,攻擊你的代幣的邊際成本就是微不足道的了。如果我們考慮的對手已經是大比特幣礦工,這就更容易理解了。事實上,前面描述的CoiledCoin是遭受殺害進行合并開采的代幣。Eligius采礦池及其參與者不需要停止Bitcoin采礦來攻擊它。事實上,池參與者甚至不知道他們的計算資源被用于攻擊!
邊欄:代幣采礦謎題的趨勢。截止2015年,幾乎不存在與比特幣相同的SHA-256采礦謎題,有或沒有合并采礦,這表明它可能被認為是一種安全風險。Scrypt是一個更受歡迎的選擇,這使得比特幣ASICs對于采礦或攻擊這種代幣無用。當然,為Litecoin采礦制造的scrypt ASICs可以用來攻擊他們。
當我們考慮一個合理的礦工決定是否合并采礦時,我們發現合并采礦安全性的更多問題。回想一下,大致來說,如果預期報酬等于或超過預期成本,采礦是有意義的。對于比特幣采礦,成本主要是哈希計算的成本。但是對于已經是Bitcoin礦工的人來說,決定是否合并采礦一個代幣,沒有額外的哈希成本。相反,額外的成本來自以下兩個因素:驗證代幣交易所需的計算,帶寬和存儲,并且需要使軟件保持最新,并且如果代幣正在進行硬叉或軟叉,則可能做出明智的決定。
這個推理產生了兩個見解。首先,合并采礦具有較強的規模經濟性,因為所有的礦工無論其哈希能力如何,都會產生大致相同的成本。這與比特幣形成鮮明對比,其中成本與哈希功率成比例,到第一個近似值。所以對于一個低價值的代幣來說,一個小型的獨立礦工會發現它并不利于合并采礦,因為它的成本超過了由于它們的低哈希能力所造成的微薄回報。請記住,截至2015年,采礦代幣的潛在收入仍然是比特幣礦業收入的一小部分。據預測,與比特幣相比,合并開采的代幣將更集中或集中采礦能力。
一個相關的預測是大多數礦工都會選擇外包他們的交易驗證。代幣越小,外包的激勵就越大。這樣做的自然方式加入比特幣礦池。這是因為池通常將這些計算從礦工手中拿走。池操作員在驗證比特幣區塊中的交易以及所有這些代幣區塊之后,組裝了一個比特幣區塊,其中合并來自(零個或多個)代幣的塊。礦工只是試圖解決這個問題。這些預測在實踐中得到證實。例如,GHash.IO,同一時間最大的比特幣礦區,允許合并挖掘Namecoin,IXCoin和DevCoin。所以這些成為最受歡迎的合并開采的代幣。
經濟推論的第二個見解可能比集中采礦權更加令人擔憂其安全性。當礦工的主要成本是工作證明時,通過設計,礦工無法“欺騙”。鑒于哈希函數的安全性,挖礦沒有捷徑,另外,其他礦工很容易就可以驗證工作證明。當成本是交易驗證成本時,這兩個假設都會失敗。礦工可以假設他們聽到的交易是有效的,并希望擺脫它。此外,對于其他礦工來驗證一個區塊,其交易與發現它的礦工的工作一樣多。由于這些原因,我們應該期望,至少對于小型礦業公司來說,有一種激勵來甄別驗證。存在不正確驗證的礦工使得攻擊更容易,因為一個惡意的礦工可以創建一個將導致其他礦工不同意最長有效分支的區塊。
總而言之,合并采礦解決了一個安全問題,但創造了許多其他問題,部分原因是合并采礦的經濟性與獨家采礦的經濟學有重要的不同。總的來說,并不清楚,合并采礦是一個關于新的代幣關心采礦攻擊的好主意。
10.5原子交鏈交換
在比特幣中,創建一個由不同的人或實體控制的能交換貨幣或資產的單個交易是直截了當的。這是Coinjoin背后的直覺,我們在第6章中研究過。它也有助于交易智能財產,我們在第9章中簡要介紹并將在第11章中回顧。同樣的想法可以在Namecoin中銷售域名,如本章前面所述。
但是在所有這些情況下,即使交易涉及到該區塊鏈中的不同類型的資產,互換交易也只限于一個單一的區塊鏈。一般來說,一個代幣上的交易完全是獨立的,也沒有辦法提及在某些其他代幣交易歷史上發生的交易。但這是一個根本的限制?還是有一些方式來交換一種類型的貨幣為其他的?也就是說,如果愛麗絲想要向鮑勃出售數量a的代幣,以換取他數量為b的比特幣,他們能否以原子的方式這樣做,而不必相互信任或依賴中介,例如交換服務?首先看來這似乎是不可能的,因為沒有辦法強制兩個不同的區塊鏈交易同時發生。如果其中一個人,比如愛麗絲,在其他的之前執行轉移,是什么阻止他背棄自己當初的合同?
解決方案是聰明的,涉及加密承諾和時間鎖定存款,這兩個都是我們以前看過的技術。協議如圖10.6所示。此時,假設兩個區塊鏈中的區塊在鎖步驟中生成:每個單元生成一個區塊。T表示協議開始時的時間。
1.Alice生成一個可退款的押金代幣a,如下所示:
1.1 Alice生成一個隨機字符串x,并計算哈希h=H(x)
1.2 Alice生成存款A,如下所示,但尚未發布
1.3 Alice生成退款A,并獲得Bob的簽名
1.4一旦Bob簽名退款A后,她發行存款A(但不發行退款A)
2.Bob生成一個可退款的押金比特幣b,如下所示:
2.1 Bob生成存款B,如下所示,但尚未發布
2.2 Bob生成退款A,并獲得Alice的簽名
2.3一旦Alice簽署退款B后,他發行存款B(但不發行退款B)
3.案例1:Alice通過互換
3.1 Alice以時間T1聲稱比特幣,在此過程中向Bob(和所有人)透露x
3.2 Bob以時間T2聲稱代幣
案例2:Alice改變主意,不聲稱代幣,不向Bob透露x
3.1 Bob在時間T1上聲稱他的代幣退款
3.2 Alice在時間T2上聲稱她的比特幣退款
圖10.6:原子交鏈交換協議
在第1步中,愛麗絲存放價值為a的代幣,以便可以用兩種方式之一兌換(“存款”就是將這些硬幣發送到指定兩種可能的條件來支付的ScriptPubkey)。首先,如果愛麗絲和鮑勃相互同意,他們可以兌換它。事實上,只有在確保獲得Bob簽署的退款交易之后,Alice才會出具這筆存款————這允許她贖回她的存款,如果2個單位時間過后尚未被要求。
在任何時候要求愛麗絲存款的另一種方法是提供Bob的簽名以及打開哈希承諾h的價值x。請注意,我們在存款A中寫入以指示Alice將值h寫入ScriptPubkey。 由于x只有愛麗絲才知道,所以在第一階段結束時,雙方都不能以這種方式要求存款。這個想法是,鮑勃會學習值x,使他能夠聲稱自己的代幣,當且僅當愛麗絲聲稱他的比特幣,正如我們將看到的。
步驟2大致與步驟1相反:鮑勃存放值b的比特幣,以便可以以兩種方式之一兌換。主要區別在于他不選新秘密;相反,他使用相同的哈希值h(他只是將存款A交易中的值復制到存款B交易)。這是將兩個區塊鏈上的交易結合在一起的關鍵。
在這一點上,球在愛麗絲的法庭上。她可以改變交換的主意——如果在時間T1,愛麗絲還沒有做任何事情來向Bob透露x,他只會要求他的存款并退出協議。愛麗絲的另一個選擇是在時間T1之前要求鮑勃的比特幣。但她只能通過創建和廣播包含值x的ScriptSig來做到這一點;
Bob可以聽到這個廣播,并使用相同的值x來聲明愛麗絲的代幣,完成交換。
請注意,如果愛麗絲試圖聲稱鮑勃的比特幣太遲(在時間T1之后,但在時間T2之前),鮑勃可能會聲稱兩個存款。同樣,如果愛麗絲及時聲稱鮑勃的比特幣,但鮑勃等待的時間太長,愛麗絲也許可以回到這兩個存款。但這不是一個問題:只要沒有玩家偏離協議來欺騙另一個玩家,我們就很高興。
最后,Bitcoin或任何代幣中的區塊不以固定的時間腳步到達,這會引起一些混亂,特別是因為兩條鏈可能不同步。假設兩個區塊鏈的區塊之間的平均時間為10分鐘。那么我們想選一個說1小時的“時間單位”。換句話說,我們希望T1至少為current_altcoin_block + 12,而T2至少為current_bitcoin_block + 6,可能有更大的安全余量。
不幸的是,有一個小但非零的機會,接下來的12個代幣區塊將在接下來的6個比特幣區塊的前面被發現。在這種情況下,愛麗絲可能會聲稱兩個存款。這個概率可以通過增加時間單位而任意小,但是以犧牲速度為代價。
這是一個整齊的協議,但從2015年開始,沒有人會使用它。相反,加密貨幣在傳統的集中式交易所上交易。這件事情是由很多原因導致的。第一個是協議的復雜性、不便和緩慢。第二,雖然該協議防止盜用,但它不能防止拒絕服務。有人可能以驚人的匯率廣告議案,只有在第1步或第2步之后退出,浪費其他人的時間。為了減輕這種情況,并且合計和匹配人們的報價,無論如何,你可能需要集中交換——雖然你不需要相信不竊取你的硬幣——進一步降低了協議的有用性。
10.6比特幣背景的代幣,“側鏈”
在本章的前面,我們談到了兩種方式,我們可以為現有的比特幣所有者分配新的代幣單元:要么可靠地燃燒比特幣來獲得代幣,要么簡單地將代幣分配給基于未使用交易輸出的比特幣地址的比特幣擁有者。正如我們所看到的,這兩個都不允許將比特幣的價格與代幣的價格雙邊掛鉤。沒有這樣的掛鉤,在自舉階段期間,代幣的價格可能會波動。側鏈的動機是認為這種價格波動是有問題的:這是一種分心,使得代幣難以在技術優勢上進行競爭。
這就是我們所需要的技術特性,以便能夠實際上將代幣的價格以固定匯率真正釘在比特幣上。首先,你應該可以把你所擁有的比特幣放在某種托管和挖掘一個代幣(或一個固定數量的代幣)。你應該能夠把這個代幣合規地在代幣區塊鏈上使用。最后,你應該可以燒一個你擁有的代幣并兌換以前被托管的比特幣。這與Zerocoin類似,在那里我們代管basecoins來創建zerocoins,但不同之處在于,我們需要在兩個不同的區塊鏈中進行。
壞消息是,據我們所知,不修改比特幣是沒有辦法實現這些的,因為比特幣交易不能依賴于另一個區塊鏈中發生的事件。比特幣腳本根本不夠強大,無法驗證整個單獨的區塊鏈。好消息是,它可以通過比特幣進行相對實用的軟叉修改來實現,這就是側鏈背后的想法。側鏈的愿景是許多蓬勃發展的代幣,快速創新和實驗,使用比特幣作為一種儲備貨幣。到2015年,這只是一個提案,但正在積極努力種,并在比特幣社區有嚴重的牽引力。該提案仍然存在,我們將自由地為教學目的簡化一些細節。
擴展比特幣允許將硬幣從側鏈轉換為比特幣的明顯但不切實際的方法是:將所有側鏈的規則編碼為比特幣,包括驗證所有的側鏈交易和檢查側鏈的工作證明。這個原因是不切實際的,因為比特幣的腳本擴展將變得太復雜,而Bitcoin節點所需的驗證工作將會令人望而卻步。此外,復雜性和努力將隨著固定邊緣的數量而增加。
SPV技巧。避免這種復雜性的訣竅是使用“SPV證明”。回顧第3章,簡化付款驗證由輕量級客戶端使用,如比特幣的移動應用程序。SPV節點不驗證他們不感興趣的交易;他們只是驗證區塊頭。SPV客戶不擔心最長的有效分支機構,而只是尋找證據證明他們關心的交易在最長的分支中是否有效,并且已經收到了一些確認。他們認為,創建這些區塊的礦工不會在沒有驗證這些區塊內的交易的情況下投入挖掘。
也許,我們可以通過一個指令來擴展比特幣的腳本,以驗證一個特定的交易(比如一個銷毀硬幣的事情)發生在側鏈上的證據。在比特幣的區塊鏈方面,執行此驗證的比特幣節點仍將完全驗證,但是它們將對側鏈中的事件進行相對輕量級的SPV驗證。
競賽轉會。這是更好的,但仍然不理想。為了進行簡化驗證,比特幣節點仍然必須連接到側鏈的對等網絡(對于每個固定的側鏈!),并跟蹤所有的側鏈區塊頭,以便它們可以確定最長的側鏈分支。我們想要的是這樣的:當交易嘗試將側鏈中的硬幣轉換為比特幣時,它包含Bitcoin節點為驗證其合法性所需的所有信息,即驗證特定的側鏈交易是否發生。 這是“SPV證明”的概念。
在這里,我們提出了一種可以工作的方法,同時請注意,Sidechains的這一組成部分仍然是一個研究領域。為了參考比特幣的側鏈交易,用戶必須提供證明(1)將側鏈交易包含在側鏈區塊中,以及(2)側鏈區塊頭,表示該塊已經接收到一定數量的確認,累計代表一定數量的工作證明。比特幣節點將驗證這些聲明,但不會嘗試驗證所呈現的區塊標題鏈是最長的。相反,他們會等待一段確定的時間,例如一兩天,以允許其他用戶提供證據表明上面步驟2中顯示的區塊頭不在最長的分支上。如果在規定期限內提供此類證據,則比特幣的側鏈交易的接受將被無效。
理由是,如果呈現的SPV證明不被接受,因為交易不在最長的分支上,必須有一些側鏈用戶被接受這個證明傷害。該用戶將有動機提供證據使證明無效。如果沒有用戶會受到傷害(可能是叉子或側鏈的重組,但有問題的交易也存在于另一分支),那么接受證據就沒有任何損害。
更一般來說,系統不會試圖防止側鏈中的問題,并且不會阻止你搬起石頭砸自己的腳。如果你將比特幣轉移到已經加密破解的側鏈,例如,其他人可能可以在側鏈上竊取你的硬幣并將其轉換為比特幣。或者側鏈上的所有采礦都可能由于錯誤而崩潰,鎖定的比特幣永遠丟失。但是提議需要確保側鏈上的問題不能破壞比特幣。特別是沒有辦法從側鏈贖回相同的硬幣兩次,無論它可能是多么麻煩——也就是說,側鏈不會讓你打鑄造比特幣。
通過工作證明樣本的緊湊SPV證明。最后還有一個困難。一些側鏈可能具有較高的阻塞率,也許每隔幾秒就有一個區塊。在這種情況下,甚至驗證SPV證明對于比特幣節點來說可能都太繁重了。事實證明,我們可以使用一個聰明的統計技術來減少驗證N區塊確認從O(N)到一個比線性增長慢得多的數字所需的計算量。
直覺是這樣的:當我們驗證一塊深埋在區塊鏈的區塊,我們正在驗證其上構建的每個區塊是否滿足目標難度,即滿足哈希<目標。現在,這些區塊的哈希值將均勻分布在間隔(0,target)中,這意味著統計學上約25%的區塊實際上將滿足哈希
圖10.7:工作證明跳過列表。區塊包含指向前一個區塊的指針和滿足哈希
我們可以推多遠?我們可以選擇任意大的倍數嗎?不是真的。這里的邏輯類似于集合挖礦,但相反。在集體采礦中,池運營商對股票進行驗證,這是一個難度降低(即目標值較高)的區塊。礦工找到比區塊更多的份額,所以操作人員必須做額外的工作來驗證它們。這樣做的好處是能夠更精確地估計礦工的哈希能力——估計的方差較低。
在這里我們看到相反的權衡。隨著我們越來越少的工作來估計已經建立鏈條的總體工作量,我們的估計將會有更大更大的差異。這有一個例子。假設N = 4,所以沒有skiplist解決方案,我們會檢查是否有4個區塊滿足哈希
假設對手只做了一半的工作量。如果我們做數學,結果是這個對手有14%的幾率找到滿足哈希
10.7以太坊和智能合約
我們已經看到幾種方法來使用比特幣的腳本語言來支持有趣的應用程序,例如托管支付交易。我們還看到了比特幣腳本有限,使用了一個不是圖靈完備的小指令集。因此,一些新的代幣建議添加應用程序的特定功能。Namecoin是第一個例子,但許多其他人提出了非常像比特幣的加密貨幣,但支持賭博,股票發行,預測市場等。
要是不需要啟動一個新系統來支持每個應用程序,我們是否可構建了一個支持我們未來可能夢想的任何應用程序的加密機制?這就是圖靈完備性的全部內容:據我們所知,圖靈完備編程語言允許你指定任何其他計算機可能指定的任何功能。在某種程度上,今天的情況回到了二十世紀四十年代電腦本身的早期階段:第二次世界大戰期間為各種具體應用而建造越來越復雜的機器(例如機械密碼機使用的強制鍵或確定海軍炮兵的射擊軌跡),激勵研究人員構建可以用于任何可想到的應用的第一個可重新編程的通用計算機。
圖10.8:重建的Bombe機器位于Bletchley
Park博物館。Bombe是由Alan Turing設計的專門用于打破德國謎密碼的計算機。Ethereum對于特定應用程序的代幣,會做通用計算機對于類似Bombe做的什么事?
Ethereum是一個雄心勃勃的代幣,旨在提供一個圖靈完備的編程語言來編寫腳本或“合同”。雖然還有其他建議要做,但是最有意思的是:它引入了幾個新穎的技術思想,舉辦了成功的群眾籌資活動,幾個月來籌集了2000萬美元,并對阻止時間等參數采取積極的選擇。在本節中,我們將簡要介紹一下Ethereum——盡管系統非常復雜,我們可以輕松地用第二本教科書來描述全部的它!
智能合約編程模型。智能合約一詞首先用于描述使用計算機系統(或其他自動化手段)來執行合同。例如,你可以將自動售貨機視為機械智能合同,強制你和機器所有者之間達成協議,涉及購買糖果棒等。
在Ethereum,一個合同是一個生活在區塊鏈上的程序。任何人都可以通過在特殊交易中上傳其程序代碼來創建一個費用低的Ethereum合同。該合同是用字節碼編寫的,并由一個專門的特殊虛擬機(通常稱為EVM)執行。一旦上傳,合同將生活在區塊鏈上。它有自己的資金余額,其他用戶可以通過程序公開的任何API進行程序調用,合同可以發送和接收資金。
一個簡單的例子:在Ethereum中的Namecoin。我們聲稱可以使用Ethereum來實現特定應用的代幣功能。作為一個簡單的例子,我們可以在非常簡單的Ethereum合同中展示如何實現Namecoin風格的功能。
一個實現示例如圖10.8所示。它以Solidity,Ethereum的高級編程語言編碼,用于定義合同。此合同實施了一個粗略的名稱/存儲值或注冊表名稱,其中名稱一次和全部分配給值。合同定義了一個數據變量registryTable,它是從32字節字符串到公鑰的映射。 最初,它將每個字符串映射到空地址0x0000000000
... 000。該合同還定義了一個名為“claimName”的單個入口點。 此入口點接受單個參數,名稱。首先,合同確保來電者發送的值至少為10 wei,wei是Ethereum中最小的貨幣單位。如果資金不足,合同終止并出現錯誤(“拋出”聲明),不采取任何行動。如果發送了足夠的資金,并且該名稱尚未被采用,則它永久分配調用此函數的任何地址的值。
圖10.8:實現注冊表名稱的簡單的Ethereum智能合同。
這就是這個合同可以在8行代碼中做的。但是我們可以添加一些Namecoin的所有其他功能,和再多一點工作。例如,我們可以存儲每個映射的更多數據,而不僅僅是聲明它的實體的地址。我們可以要求姓名所有者通過存儲“最后更新”時間來定期重新注冊,并允許其他用戶聲明長時間未更新的名稱。
我們可能還需要添加第二個功能來允許這些錢被撤銷。按照目前的方案,這筆錢將永遠在合同中累積,基本上遠離流通。當然,在允許金錢撤回的功能中,我們最好確保檢查主叫方是合約的所有者。任何人都可以通過Ethereum合約來調用任何功能,但是這些電話是簽名的,所以我們可以安全地識別呼叫者是誰。
天然氣(Gas),激勵和安全。與比特幣不同,Ethereum支持循環,盡管我們在第一個例子中不需要它們。這應該立即引起警鐘。如果有循環,可以有無限循環。 總的來說,由于各種原因,Ethereum合約可能永遠運行。計算機科學的著名成果(Halting Problem的不可判定性)指出,沒有一種算法可以查看程序的源代碼,并且始終正確地確定它是否會永久運行。 那么我們該如何才能防止合同永遠運行?
更一般來說,我們需要一些方法來限制需要很長時間才能運行的合同,即使它是有限的。Ethereum采用一種稱為氣體的機制來實現。實質上,執行每個虛擬機指令需要的少量的錢,稱為天然氣(gas)。不同的操作,費用不同。基本操作如加法或比較費用1瓦斯,而計算SHA-3哈希(可作為內置指令)費用為20瓦斯,寫入256位字且持續存儲成本為100瓦斯。每一筆交易的費用也21000氣吧。你可以想像Ethereum喜歡在超級優惠的航空公司上飛行:你付錢去上班,你從那里支付的一切都是額外的。以太網中可用的完整指令列表及其各自的天然氣(gas)成本是固定的;改變這些將需要一個硬叉,就像改變比特幣腳本語言的語義一樣。
天然氣是使用Ethereum的內置貨幣支付的,稱為乙醚。 當用于支付合同執行時,這稱為gas。每筆交易都可以指定“天然氣價格”,即每單位消耗的天然氣將支付多少乙醚。提供的天然氣價格就像比特幣的交易費用:礦工可以隨意發布任何天然氣價格的交易,每個礦工都可以獨立決定其費用結構。這將導致反映供需氣體的市場價格。 然而,截至2016年初,該網絡仍然是實驗性的,并且已經合并了每-8 -10單位氣體的默認50吉加瓦。其中50吉加瓦是5?10以太網,或者約為3?10BTC,給予2016年1月的以太BTC匯率。
每次通話都必須說明自己愿意花多少天然氣(“天然氣限值”)。如果這個值被擊中(耗盡氣體),執行停止,對程序狀態的所有更改都將被撤銷,而礦工也會打包氣體。所以非常重要的是不要用盡天然氣。
天然氣需求意味著非常昂貴的計算不適用于Ethereum。這個系統并不是設計成一個云計算服務,你可以付錢給其他人去做一個你無法自己做的困難的計算。像亞馬遜的彈性計算云或微軟的Azure這樣的服務為你提供了數百萬倍的回報。另一方面,Ethereum適用于實現安全協議邏輯。本質上,它提供了兩個(或多個)匿名方可以依照指定行為行事的服務。
Ethereum的區塊鏈的安全性并不像比特幣那樣完善。理論上講,這個系統要復雜得多,因此在數學上更難理解。實際上,Ethereum并沒有持續很長時間,并沒有像比特幣那樣受到同樣的審查。特別是,有人擔心交易處理的成本會引起比特幣風格的激勵論點,與我們關于合并開采的討論類似。當交易處理是礦工總成本的重要部分時,系統有利于較大的礦工,因為該成本與哈希功率無關。更重要的是,天然氣支付僅限于區塊中最初包含交易的礦工。但是,所有建在該區塊上的礦工也必須驗證交易,并且沒有得到報酬。這意味著他們有動機去跳過驗證。如前所述,這對于區塊鏈的健康來說可能是危險的。
第二個例子:象棋在Ethereum。我仍然沒有說太多關于什么你可以做的事情,這是新的,所以讓我們看看第二個例子。假設愛麗絲想挑戰鮑勃,一場線上的錢的棋局對抗。唯一的問題是,愛麗絲和鮑勃生活在不同的國家,如果他們輸了,他們也不會互相信任。這是一個問題,Ethereum可以解決!
愛麗絲將寫一個實施國際象棋規則的Ethereum程序,并將其上傳到Ethereum。她將向合同發送一定數量的乙醚等于其要賭注金額的以太網。鮑勃可以看到這個合同,如果他決定接受這個挑戰,他可以通過向合同發送自己的博彩權益來開始比賽。在這樣做之前,鮑勃應該確保合同是正確的,它實現了象棋,并最終將所有的價值發送給獲勝者。
一旦兩名玩家都派出了他們的股份,合同應該檢查股權是否相等,假設他們是平均下注。在這一點上,游戲正在進行,沒有實際贏得比賽任何一個玩家都無法從合同中提取資金,或者任何人在任何情況下都可以提取資金。
愛麗絲和鮑勃將輪流發送交易到合同,表明他們愿意下一步行動。當然,合同必須確保每一舉動都只能由轉向玩家發送,而不是由其他玩家或完全由其他所有玩家發送。記住,每個交易(導致合同執行一個功能)都由調用者簽名,所以合同可以確保這一點。合同還必須核對國際象棋的所有規則。如果玩家試圖移動一個棋子三個空格,那就必須被拒絕。
最終,游戲將結束。每次移動后,合同必須檢查雙方是否配對,或者游戲是一場僵持的畫面或國際象棋其他繪畫條件之一。玩家也應該能夠發出一個表示他們辭職的舉動。當游戲結束時,合同可以自行終止,并將所有的錢發送給獲勝玩家。或者在抽簽的情況下分錢。
從概念上講,這是一個簡單的應用程序,但有一些微妙之處。如果失敗的球員離開,怎么辦? 如果玩家在指定的時間內沒有提交有效的移動,那么合同將需要一種向對手獎勵金錢的機制。
哪位玩家先移動?“白子”在國際象棋上有輕微的優勢,所以兩個球員都希望這個優勢。這表明了許多Ethereum合同面臨的困難:沒有內在的隨機來源。這是一個困難的問題,因為隨機數發生器需要所有礦工驗證(所以他們可以檢查合同是否正確執行),但是不應該對任何一個玩家都是可以預測的(否則,如果他們知道他們將不得不進行第二次,他們可能會拒絕加入)。
這是隨機信標的問題。 正如我們在第9.4節中討論的那樣,兩個玩家加入之后,合約可能會在區塊鏈中哈希下一個塊的值。對于我們的具體應用,問題有點簡單,因為只有愛麗絲和鮑勃才需要確信硬幣翻轉是隨機的,而不是整個世界。所以他們可能會使用9.3節的方法:他們都提交一個隨機值的哈希,然后都顯示輸入,并從輸入中導出隨機位。實踐中已經看到了這兩種方法。
其他應用。下棋可能很有趣,但是Ethereum的真正興奮點是關于金融應用。迄今為止,我們在文中討論的許多應用程序,包括預測市場,智能財產,托管支付,微支付渠道和混合服務,都可以在Ethereum實施。所有這些應用程序都有細微之處,但它們都是可能的,在大多數情況下,實現起來比使用Bitcoin看到的螺栓協議類型要簡單得多。還有許多其他應用程序,如拍賣和訂單,我們沒有談論過,但那些人熱衷于使用Ethereum來實施它們。
狀況和帳戶余額在Ethereum。在第3章中,我們討論了兩種設計分類帳的方法:基于帳戶和基于交易的分類帳。在像比特幣這樣的基于交易的分類帳中,區塊鏈只存儲交易(在區塊頭中加上少量的元數據)。為了更容易地驗證交易,Bitcoin將硬幣視為不可變的,并且交易輸出必須全部使用,如果需要,要使用更改地址。實際上,交易是在一個UTXO列表的全球狀態下進行的,但是Bitcoin協議中這個狀態從來就不是明確的,只是礦工自己創造出來加快驗證的。
另一方面,Ethereum采用基于帳戶的模式。由于Ethereum已經存儲了將合同地址映射到狀態的數據結構,因此也可以在系統中存儲每個常規地址(也稱為擁有地址)的帳戶余額。這意味著,除了使用非循環交易圖表示付款,每個交易都花費一些投入并創建一些輸出,Ethereum只是存儲每個地址的余額,如傳統銀行可能存儲每個帳號的余額一樣。
數據結構在Ethereum。在第3章中,我們說基于帳戶的分類帳需要花費數據結構進行記錄保存。Ethereum只有這樣的數據結構。具體來說,每個區塊包含每個地址的當前狀態(余額和交易次數)以及每個合同的狀態(余額和存儲)的摘要。每個合同的存儲樹將任意的256位地址映射到256位字,使高達字節的存儲空間!當然,你永遠不會填補所有這些存儲空間,但這是理論空間。摘要可以很容易地證明給定的地址具有給定的平衡或存儲狀態。例如,愛麗絲可以向鮑伯證明她的平衡是沒有的,鮑伯必須掃描整個區塊鏈來驗證證據。
Bitcoin中使用的簡單二進制Merkle樹將為此目的工作,因為它允許有效的包含證明(提供礦工確保沒有樹將包含相同地址的兩個不同狀態)。但是我們也希望快速查找和有效地更新地址值的能力。為了做到這一點,Ethereum使用一種稍微更復雜的樹結構,稱為Patricia樹,也稱為前綴樹,特里或基數樹。每個Ethereum塊包括Merkle Patricia樹的根,承諾到每個地址的狀態,包括合同地址。反過來,每個合同的狀態都包括一棵承諾整個儲存狀態的樹。
基于帳戶的分類帳的另一個棘手問題是防止重放攻擊。在比特幣中,由于每個交易都消耗其輸入的UTXO,因此相同的簽名交易永遠不會有效兩次。有了Ethereum的設計,我們需要確保,如果愛麗絲簽署了一筆交易,稱“向鮑勃付款1”,鮑勃不能一遍又一遍地廣播該交易,直到愛麗絲的帳戶枯竭。為了避免這種情況,Ethereum中的每個帳戶都有一個交易計數器跟蹤它發送了多少個交易。Alice真正簽署的聲明是“我授權我的第n個交易是向Bob付款1”。這個交易無法被重放,因為處理完成后,Alice的交易計數器將會增加并且是全局狀態的一部分。
總而言之,Ethereum使用比Bitcoin更強大的數據結構作為其分類帳的一部分。雖然我們沒有看到細節,但它可以有效地證明各種類型的關于賬戶,合同和交易的陳述。
Ethereme項目。Ethereum最初于2013年底被描述,并于2015年推出首個版本,被稱為Frontier。Ethereum利用預售,在Bitcoin公司以固定價格公開了以太貨幣單位,其中所有收益都歸于Ethereum基金會。
與許多altcoins相比,這是一個較慢的發展速度,但它反映出這樣的事實,即Ethereum更加復雜。除了EVM、新的編程模型和新的數據結構之外,Ethereum還對Bitcoin的共識協議進行了重大改變。區塊時間的目標是12秒而不是10分鐘。為了減輕在Ethereum中比比特幣更大部分區塊的過時區塊的影響,Ethereum使用稱為GHOST的替代協議來計算共識分支。它還使用不同的工作證明。目前,它利用混合的哈希函數設計為內存難度,盡管未來,Ethereum計劃將其轉換為權益證明系統。
這是比特幣在哲學上的另一個重大偏離。Ethereme項目由非營利性基金會管理,在規劃和決策中相對集中。有一個宣布的協議的未來版本的日程安排,將根據早期的Ethereum經驗介紹更改。這些將設計硬分叉,此外,每個Etherey合同將在兩個版本之間銷毀。所以,Ethereum依然是一個很大的實驗系統,其中規劃了重大的變化。 到2015年為止,投入太多以在Ethereum之上建立真正的應用程序為時尚早。但這是一個非常有前途的系統。 也許這本教科書的未來版本甚至可能被稱為“Ethereum和Cryptocurrency技術”。
為了整理這一章,我們討論了比特幣是一個更大規模的加密貨幣和代幣產品生態系統的重要組成部分。
他們以各種方式進行競爭,合作,相互影響,有一些合作的,有一些有害的。還有可能在將來會有一種技術方法來使一個區塊鏈中的交易(事務)明確地引用另一個區塊鏈中的交易(事務)。
還有幾個公開的問題,代幣生態系統是否會整合,使少數人占主導地位,還是保持多元化?特定應用程序的代幣(altcoins)是否會增長,或者是通用平臺的Etherey模型是否會主宰?比特幣本身最終會被其他一些代幣超越嗎?鼓勵比特幣和代幣相互作用是個好主意?還是應該將每個密碼體制作為一個單獨的系統,例如通過使用不兼容的采礦謎題而不是合并挖掘?我們現在無法回答這些問題,但是我們已經討論了你需要了解并理解其重要性的所有概念。