近年來,關於區塊鏈的討論非常熱烈。許多人將此描述爲十年來最具破壞性的技術。特別是,金融市場可能是受影響最大的市場。
這項技術正被應用到許多垂直領域,如醫療、醫藥、保險、智能物業、汽車,甚至政府。
然而,到目前爲止,區塊鏈最成功的實現方式是比特幣——一種對等電子現金系統,順便說一下,比特幣也是區塊鏈技術的第一次實現。因此,要了解區塊鏈技術,最好了解比特幣系統是如何設計和實現的。
在本文中,您將了解什麼是區塊鏈、它的體系結構、它是如何實現的以及它的各種功能。我將在描述區塊鏈複雜性的同時,對比特幣的實現進行定位。
區塊鏈架構並不是那麼簡單,很多人都寫了很好的文章,包括一些視頻教程。這些受衆從新手到專業人士都有。在本教程中,我將著重於對區塊鏈架構的概念性理解,讓新手和專業人士都牢記在心。在深入研究區塊鏈之前,重要的是要知道爲什麼需要這種新技術?這個問題的答案在於所謂的「雙倍支出」。
Blockchain - Double Spending
考慮一個如圖所示的情況;
如圖所示,鮑勃正在向麗莎出價一張10美元的鈔票,以換取一本書。一旦Lisa收到這張面值10美元的鈔票,Bob就無法再將這筆錢用於其他交易,因爲現在Lisa擁有這種實物貨幣。
現在,考慮這樣一種情況:錢是以數字形式支付的。這在圖片中有說明;
由於貨幣兌換的格式是數字格式,它本質上是存儲在Bob設備某處的二進位物理文件。鮑勃把這個文件(數字貨幣)給麗莎後,他還可以把文件的副本給愛麗絲。兩人現在都認爲他們在沒有任何數字硬幣認證手段的情況下收到了這筆錢,因此會將各自的商品交給鮑勃。這稱爲「雙倍支出」,即發送者在多個地方花費相同的錢從多個供應商那裡獲得服務或商品。
爲了解決這一雙重支出的問題,我們將使用一個集中的機構來監控所有的交易。這在圖片中有說明;
一般來說,中央管理機構是您的銀行,它維護一個記錄所有交易的分類帳簿。現在,鮑勃必須把他的數字貨幣寄給銀行,銀行會在其分類帳中記入鮑勃的帳戶。在確保Bob有足夠的餘額來支付他想要發送的數字貨幣之後,他會將這些錢發送給Lisa,並將她的帳戶記入其分類帳。
現在,可以保證鮑勃不會把錢加倍花掉。如果每一個數字交易都通過這樣一個中央集權機構進行路由,那麼雙重支出的問題就會得到解決。這也爲驗證在交易中收到的每一枚硬幣(數字貨幣)的真實性提供了另一個好處。所以假幣(像鮑勃用複印件付給愛麗絲一樣,是重複的錢)很容易被發現,並防止流通。
中央集權的引入雖然解決了雙重支出問題,但也帶來了另一個重大問題——中央集權本身的創建和維護成本。
由於銀行業務需要資金,他們開始削減爲客戶進行的每筆貨幣交易的佣金。這有時會變得非常昂貴,特別是在海外匯款時,可能有多個代理(銀行)參與整個交易。
所有上述問題都是通過引入數字貨幣比特幣來解決的。在深入研究比特幣的設計和體系結構之前,我先簡單介紹一下比特幣的背景知識。
Bitcoin - Brief History
2008年,Satoshi Nakamoto通過一份名爲《比特幣:對等電子現金系統》的研究風格白皮書,將比特幣引入這個世界。
比特幣不僅解決了雙重消費問題,還提供了更多的優勢,其中一個值得一提的優勢是交易中的匿名性。Satoshi創造了這個系統,並在這個系統上交易了幾個硬幣,這對全世界來說都是匿名的。
試想一下,在這個社交媒體的世界裡,當每個人的隱私都岌岌可危的時候,這個世界至今還無法追查出誰是佐世?事實上,我們不知道佐藤是個人還是一羣人。通過谷歌搜索還發現,Satoshi Nakamoto持有的比特幣價值約爲194億美元,目前比特幣系統中仍無人認領。那麼什麼是比特幣-讓我們看看!
What is Bitcoin?
正如您前面看到的,銀行維護一個記錄每筆交易的分類帳。這本分類帳是銀行私人持有和保管的。Satoshi建議讓這本帳本公開並由社區維護。
當你公布這樣一個帳本的時候,你會想到幾個問題。這個分類帳必須是防篡改的,這樣就沒有人可以修改它的分錄。由於帳本上的每個條目都是公開的,我們必須弄清楚如何保持匿名性——顯然你不希望世界上的每個人都知道我付給你一百萬美元。
此外,由於世界上只有一個單一的分類帳來記錄每一筆交易,分類帳的規模將是另一個大問題。爲這些複雜問題提供一個解決方案並不是一件小事,這就是我在這裡試圖讓您用簡單的語言理解比特幣的底層架構。
這個底層架構是區塊鏈,這就是本教程的內容。要了解區塊鏈架構,您需要了解它所基於的幾個關鍵功能。所以,讓我們開始使用PKI-公鑰密碼。
Blockchain - Public Key Cryptography
公鑰密碼或簡稱PKI也被稱爲非對稱密碼。它使用兩對密鑰—公共密鑰和私有密鑰。密鑰是一個很長的二進位數。公鑰分布在世界各地,正如它的名字所暗示的那樣,它是真正公開的。私鑰必須嚴格保密,絕不能丟失。
在比特幣的情況下,如果你丟失了比特幣錢包的私鑰,你錢包里的所有東西都會很容易被盜,而且在你知道之前,你所有的錢(錢包里的東西)都不見了,系統里沒有任何機制可以查出是誰偷的——這就是我前面提到的系統中的匿名性。
PKI通過加解密機制實現認證和消息隱私兩大功能。現在我將解釋這兩個函數&負;
Authentication
當雙方交換消息時,在發送者和接收者之間建立信任是很重要的。特別是,接收者必須信任消息的來源。在我們前面的場景(如圖1所示)中,Bob向Lisa發送了一些錢,用於向她購買一些商品,讓我們看看PKI如何在Bob和Lisa之間建立這種信任。看看下面的圖片−
首先,如果Bob想給Lisa寄一些錢,他必須自己創建一個私鑰/公鑰。請注意,這兩個密鑰始終是成對的,並且不能混合不同個人或不同實例的私鑰和公鑰。
現在,鮑勃說他要給麗莎寄10美元。因此,他創建了一條消息(純文本消息),其中包含Bob(發送方)公鑰、Lisa(接收方)公鑰和金額($10)。
這封匯款的目的,如「我想從你這裡買南瓜」也加入了信息中。現在使用Bob的私鑰對整個消息進行簽名。當Lisa收到此消息時,她將使用PKI的簽名驗證算法和Bob的公鑰來確保消息確實來自Bob。PKI的工作方式超出了本教程的範圍。感興趣的讀者可參考本網站,了解有關PKI的詳細討論。這將確定消息發起者的真實性。現在,讓我們來看看信息隱私。
Message Privacy
現在,麗莎已經收到了她的付款,她想把連結發送到她的電子書,鮑勃想買。因此,Lisa會創建一條消息並將其發送給Bob,如圖所示;
Lisa創建了一條消息,例如「這裡是指向我的電子書的連結,你已經請求了」,用Bob的公鑰簽名,她已經在Bob的請求消息中接收到了這個公鑰,並且還使用在HTTPS握手過程中兩人共享的某個密鑰對消息進行加密。
現在,Lisa確信只有Bob可以使用Bob單獨持有的私鑰對消息進行解碼。另外,由於內容是由只有Bob和Alice持有的密鑰加密的,因此攔截消息的人將無法恢復其內容。這向Lisa保證,只有Bob才能訪問她的電子書。
在了解了PKI所隱含的特性、身份驗證和消息隱私之後,讓我們繼續看看比特幣如何利用PKI來保護我在「什麼是比特幣」一章中提到的公共分類帳?」.
就您所知,最流行的PKI算法是RSA和ECDSA,比特幣使用後者。
Blockchain - Hashing
PKI中最重要的功能之一是哈希函數。哈希函數將任意大小的數據映射到固定大小的數據。比特幣使用SHA-256散列函數,生成256位(32位元組)大小的散列(輸出)。這在圖片中有說明;
Bob在向Lisa下訂單時,創建了一條類似於上面所示的消息。此消息通過產生32位元組哈希的哈希函數進行哈希處理。這個散列的優點在於,在所有實際應用中,散列(256位數字)對於消息內容都是唯一的。如果修改消息,哈希值將更改。不僅給定了哈希值,還不可能重建原始消息。
在了解了散列的重要性之後,讓我們繼續討論比特幣中的另一個概念,即挖掘。
Bitcoin - Mining
當Bob爲Lisa創建一個購買請求時,他不會將它單獨發送給Lisa。相反,請求消息是在他所連接的整個網絡上廣播的。鮑勃的關係網如圖所示。
該消息將發送到所有連接的節點(計算機)。圖中的一些節點被標記爲礦工。這些機器運行一個軟體來挖掘比特幣信息。我現在向你解釋一下這項開採意味著什麼。
Mining Process
由於整個網絡分布廣泛,網絡中的每個礦工在任何給定的時間段內都會收到來自多個供應商的多條消息。礦工所做的是將這些信息組合在一個塊中。這在圖片中有說明;
在形成消息塊之後,miner使用前面描述的散列函數在塊上創建散列。現在,如您所知,如果任何第三方修改此塊的內容,其散列將變爲無效。順便說一句,每條消息都有時間戳,這樣任何人都無法修改其時間順序,而不會影響塊的散列值。因此,塊中的消息完全不被篡改。如何使用這個事實來保護網絡中的所有事務將得到進一步的解釋。
Blockchain - Chaining Blocks
由不同礦工創建的區塊被連結在一起,形成一個被稱爲真正分布的公共帳本。
鏈中的每個塊包含多個消息(事務),如圖8所示。鏈子上的一塊可能來自任何礦工。在創建塊鏈時,我們觀察到前一個塊的散列被添加到當前塊的規則。
因此,挖掘器在創建塊的同時,提取鏈中最後一個塊的散列,將其與自己的一組消息組合,並爲其新創建的塊創建散列。這個新創建的區塊現在成爲了鏈的新末端,因此隨著越來越多的區塊被礦工添加到鏈中,鏈繼續增長。
Blockchain - Proof of Work
由於所有事務都有時間戳,我們需要在對等網絡上實現分布式時間戳伺服器。這需要一些額外的實現,這是我現在將要描述的工作的證明。現在,我們在每個塊中再添加一個名爲Nonce的項,如下圖所示−
Nonce是一個數字,使得塊的散列滿足某個條件。這個標準可以是生成的散列的前導四位數必須爲零。
因此,生成的散列看起來像是00001001010xxx。通常,miner從Nonce值0開始並不斷遞增,直到生成的散列滿足指定的條件。
請注意,散列生成是隨機的,並且超出了您的控制範圍—也就是說,您不能強制散列函數生成特定的散列。因此,可能需要多次疊代,直到生成包含四個前導零的所需散列。比特幣系統中生成塊的預期時間爲10分鐘。一旦礦工成功地開採了這個區塊,他就會在系統中釋放這個區塊,使之成爲這個鏈中的最後一個區塊。
請注意,有多個礦商競相生成合法區塊。比特幣系統通過給第一個成功的礦工一些比特幣來獎勵他。一般來說,擁有更多計算能力的礦工可能是早期的贏家。這會導致擁有巨大處理能力的人對整個系統進行攻擊。在本教程結束時,我將描述這些攻擊以及如何減輕這些攻擊。
Blockchain - Network & Mining
我現在總結一下上面描述的步驟;這就是網絡中發生的事情&負;
任何想從在網絡上做廣告的第三方獲得服務的人首先創建一個事務(發送給所需收件人的消息)。
在給定的一段時間內,可能有許多發送方(買方)和接收方(賣方)創建此類交易。
所有事務都在網絡上廣播到所有節點。注意,給定的事務不必到達網絡中的每個節點。
每個節點將新的事務集合到一個塊中。請注意,每個塊中的事務集獨立於其他塊中創建的集合,並且自然會與其他塊不同。這無關緊要;系統確保網絡上的每個事務廣播在合理的時間段內都包含在某個塊中。通常,發送者會通過向礦工提供一定數量的比特幣來激勵節點。礦業公司可能會選擇優先考慮那些具有更高激勵的公司。
該節點現在致力於找到其已裝配塊的工作證明。
當節點找到工作證明時,它將在網絡上廣播組裝好的塊。
接收新塊的節點只有在驗證該塊中的所有事務都有效且尚未花費之後才會接受它。
如果塊被接受爲有效的,則正在處理自己的新塊的節點將必須在其塊中重新組裝事務,以確保事務不重複。該節點現在致力於在其新創建的塊上找到工作證明;在這樣做的同時,它將接受的塊的散列作爲上一個散列。
同樣,區塊鏈也在持續增長。
現在,正如我們已經看到的整個系統是如何工作的,讓我描述一些副作用以及如何解決它們。
Blockchain - Incentives to Miners
正如我們在比特幣挖掘一章中看到的,在任何給定的時間段內,一個礦工都可能被大量的交易所淹沒。塊的最大大小是在系統中預先定義的,只需要在塊中包含一定數量的事務。
塊中的事務數由預定義的塊大小和每個塊的平均長度決定。這裡的一個重要提示是,發送者不應在其消息中包含太多信息,以使其簡短,從而激勵礦工在其他冗長的消息之前接受它。
發送者通常也會增加一定數量比特幣的交易費用,以激勵礦工儘早加入他的區塊。
構建區塊鏈的另一個後果是它的規模。在一段時間內,整個區塊鏈可能會變得太大,節點無法將其存儲在其磁碟上。這是通過使用下面描述的Merkle樹來解決的。
Blockchain - Merkle Tree
節點中的磁碟空間問題很容易解決,因爲塊中的所有事務都在Merkle樹中散列,如圖-minus所示;
塊頭現在包含Merkle樹中當前塊中所有事務的前一個塊的散列、Nonce和根散列。由於根散列包含塊內所有事務的散列,因此可以修剪這些事務以節省磁碟空間。因此,現在您的區塊鏈將如下圖所示;
這可以節省大量的磁碟空間。這個策略被一個普通的客戶使用,他只想從別人那裡得到報酬。然而,礦商需要拯救整個區塊鏈。現在問題來了,一個接收者如何在沒有能力追蹤收到的硬幣的來源的情況下驗證支付。下面將對此進行解釋。
Blockchain - Payment Verification
考慮這樣一個案例,作爲一個供應商,您可能希望核實過去支付的某筆款項。由於您在計算機上持有的區塊鏈僅包含如上圖所示的區塊頭,因此您正在搜索的事務在您的區塊鏈副本中丟失。
現在,您可以在區塊鏈副本中向後搜索,直到找到一個塊,在其中標記了所需事務的時間戳。現在,請求所選塊的merkle樹,您將擁有正在尋找的事務。下圖說明了這一點;
這裡,我們假設您正在尋找Tx103。儘管您可能看不到Tx103的內容,但您知道它所屬的塊和鏈中所有後續塊已經接受了它。因此,您可以放心地信任此交易並繼續您的業務。
Blockchain - Resolving Conflicts
正如我們所看到的,比特幣網絡包含了幾個礦工。有可能,兩個不同的礦工同時解決工作證明,從而將他們的區塊添加到鏈中最後一個已知區塊。下圖說明了這一點;
現在,我們在3號街區後面有兩個分支。兩個分支都有效。所以下一個礦塊可能會被添加到任何一個分支中。假設,礦工將新開採的塊體添加到塊體104-A中,包含塊體104-A的分支將比包含塊體104-B的分支長;
在比特幣架構中,最長的分支總是獲勝,較短的分支則被清除。因此,必須清除塊104-B。清除此塊之前,此塊中的所有事務都將返回到事務池,以便挖掘它們並將其添加到將來的某個塊中。這就是解決衝突的方法,系統只維護一個區塊鏈。
Blockchain - Privacy
由於記錄所有比特幣交易的帳本被真正公開,隱私受到威脅。世界上有誰能知道誰付錢給誰?傳統的銀行系統通過對記錄保密來維護這種隱私。
比特幣系統中的隱私是通過不同的策略實現的。請注意,我們說過比特幣的發送者需要知道該向誰付款。因此,他要求提供他想要付款的供應商的公鑰。此公鑰可以是匿名的。
從某種意義上說,作爲某些服務的供應商,當有人問你在哪裡付款時,你只需向他發送你的公鑰。此公鑰與您的關聯不會記錄在分類帳的任何位置。這樣,除了這個交易之外的任何人都只能知道交易了多少錢,以及這些錢支付給了哪個公鑰。
爲了獲得更高的隱私級別,對於每個事務,您可以爲每個事務生成一個新的私鑰/公鑰,以便您所做的多個事務不能由第三方組合在一起。對於局外人來說,這僅僅意味著進行了多次價值較小的交易,它們永遠不會與一個共同的來源相聯繫。
最後,任何基於網際網路的在線系統都容易受到濫用。我現在將描述幾種可能的比特幣系統攻擊,以及如何減輕這些攻擊。
Bitcoin - Mitigating Attacks
我將討論比特幣系統中三種不同類型的可能攻擊;
Race Attack
作爲一個攻擊者,您可能會使用兩台不同的機器將同一枚硬幣快速連續地發送給不同的供應商。如果供應商在交付貨物之前不等待區塊確認,他們很快就會意識到交易在挖掘過程中被拒絕。解決這種攻擊的辦法是,供應商必須等待至少一個區塊確認後才能發出貨物。
Finney Attack
在這種情況下,攻擊者就是礦工。礦工用他的交易挖掘一個區塊,但不在系統中釋放它。他現在在第二次交易中使用相同的硬幣,然後釋放預先開採的區塊。顯然,第二筆交易最終會被其他礦商拒絕,但這需要一段時間。爲了降低這種風險,賣方應在放行貨物前等待至少六個區塊的確認書。
The 51% Attack
在這種攻擊中,我們提出了一個不切實際的假設,即某人擁有51%的網絡計算能力。這種攻擊中的攻擊者會挖掘一個私人區塊鏈,在那裡他會加倍花費硬幣。
由於他擁有大部分的計算能力,他可以保證他的私人區塊鏈在某個時候會比「誠實」網絡的鏈長。然後,他在系統中釋放了他的私有區塊鏈,使得之前記錄在誠實區塊鏈中的所有交易都無效。
這種攻擊是虛構的,因爲獲取相當於或超過整個網絡計算能力51%的計算能力是非常昂貴的。
Blockchain - Conclusion
在這個簡短的教程中,我們以比特幣爲例向您介紹了區塊鏈的幾個概念。比特幣是區塊鏈的第一個成功實施。如今,世界上已經發現區塊鏈技術在多個行業中的應用,在這些行業中,人們希望在沒有集中管理機構參與的情況下獲得信任。歡迎來到區塊鏈世界。
Further Readings −
Satoshi−的原始文件比特幣:對等電子現金系統
官方網站−bitcoin.org