2018年5月29日 星期二

[譯] 一個程式設計師眼中的區塊鏈技術




文章摘要: 因為只需要在將交易新增到區塊之前檢查交易區塊內交易的順序由網路參與者(即生成該區塊的人員



我為什麼要寫這篇文章?在瞭解區塊鏈相關資訊時(例如維基百科上的內容),我發現這些內容非常零碎和不連貫。要把這些零碎的資訊整合在一起,形成一個完整的檢視需要花費大量的時間。不過現在,我想我已經知道在引入區塊鏈時要使用哪些東西,以及應該按照怎樣的順序來了解它們,以便讓開發人員能夠在 1 到 1.5 小時內看到完整的檢視。本文內容經過一定程度的簡化,如果有人對更復雜的細節感興趣,可以繼續深入探討。


非對稱加密已經存在很長一段時間了,非對稱加密包含了公鑰和私鑰。我們使用公鑰加密並使用私鑰解密,並且無法從這兩者中的一箇中獲得另外一個。因此,在使用非對稱加密技術時,我可以向某人傳送一條資訊,比如「我轉賬 100 美元」,每個人都知道它是我傳送出去的,而且中間沒有被篡改過。



假設有十個人,他們每個人都擁有一定數量(假設是美元)的新貨幣。他們每個人都確定(並確信)一個叫「X」的人支出了 30 萬美元,但 X 是否真的擁有 30 萬美元還不得而知。爲了弄清楚情況,我們需要知道每個人的餘額。我們只需要將他所有收入交易加起來,並扣除所有支出交易,這樣就能得到餘額。為此,我們需要了解有關收入和支出的資訊,於是公共賬本出現了。有了公共賬本,我們就知道某人是否真的有能力支出 30 萬美元。


比特幣:開端


還有一個問題——如果我把所有錢同時發給兩個人會怎樣?這個問題被稱為雙重支出(double spending)。當然,這兩個人不應該同時收到我賬戶裡的錢。讓他們自己商量誰將收到我賬戶裡的錢?這樣做不方便。通過檢視時間戳來確定我把錢先轉給了誰?這樣做不保險。不過,還是有一個解決方案——對交易進行流水化。如果這樣做了,那麼很明顯第一筆付款發給了 John,那麼就無法再將它發給第二個人,因為我沒有更多的錢。但現在還不清楚誰將決定交易的順序。在銀行和其他集中式系統中,銀行本身就是受託人,也就是單一故障點和信任點,負責與第一個接收人溝通。


在區塊鏈中,不存在這樣的單個受託人,取而代之的是網路中的大部分參與者(當然,這是指將整個網路作為一個整體,因為你不能相信每個個體參與者,因為其中肯定有一些騙子)。我們假設網路不受一個人的控制,並且大多數參與者嚴格按照自己的經濟利益行事。


但流水化交易仍然存在問題,我們還需要在網路參與者中達成「共識」。這個問題需要通過共識演算法來解決,這是區塊鏈領域的一個關鍵演算法。


在討論特定的共識演算法之前,先讓我們來說說臭名昭著的區塊鏈的「區塊」。區塊是一種技術度量,是批處理的一個例項,因此我們可以以「批量」的方式計算多個交易的共識,並且網路的開銷成本可以通過多個交易來「分攤」。


區塊內交易的順序由網路參與者(即生成該區塊的人員,也稱為「礦工」)定義,但區塊本身的順序則由共識演算法來確定。共識演算法已經存在了相當長一段時間。例如,多主 NoSQL 系統中的 Paxos 和 Raft 等演算法就屬於共識演算法,但它們並不適用於擁有數百萬個參與者的網路。


比特幣的工作證明(proof of work,PoW)共識演算法在剛開始時被認為是革命性的。許多網路參與者(礦工)同時生成新區塊,那麼就有必要確定區塊之間的順序。爲了讓一個區塊成為鏈中的下一個區塊,礦工必須進行非常耗時的雜湊計算。對一個區塊(隨同一個隨機串,一個遞增的數字)進行持續的雜湊計算,直到雜湊值看起來像是一個符合某些條件的大數,例如包含 10 個前導零。這需要數十億次的雜湊操作,這一過程代表礦工「證明」該區塊的存在。但檢查礦工的工作是否正確卻十分容易——只需要再進行一次雜湊操作。需要注意的是,整個網路(其中包括成千上萬的礦工)平均在 10 分鐘內(比特幣生成區塊的平均間隔)只可以生成一個區塊 。這大大減少了出現衝突的可能性,即同時有兩個或多個區塊作為下一個區塊。



但是,衝突的可能性仍然存在。於是就有了如下規則——網路參與者接受形成最長鏈的那個區塊。


事實上,它不是一個鏈,而是一個有許多分支和鏈的有向無環圖(DAG)。鏈通常被稱為「共同歷史」(它是最長的鏈)。共識不會立即達成,至少需要在生成幾個區塊之後,所以必須等待一段時間。爲了防止比特幣的雙重支出,人們通常會等待六個區塊(這需要一個小時)。


除了交易資料之外,一個區塊還包含對前一個區塊的雜湊值。因此,過去的某些內容不可能被修改,因為如果修改了就會使其後的所有雜湊無效。在挖礦過程中,你將獲得獎勵,也就是新的資金收益!否則的話,該如何將資金引入到這個系統呢?如果說資金必須發放給某人,那麼這個人就變得很特別,這與去集中化的想法是相矛盾的。為挖礦者發錢似乎是一種合乎邏輯和可接受的解決方案。


順便說一些關於挖礦的事。礦工的主要工作是對新區塊進行雜湊計算,這裏沒有使用非對稱加密技術,因為只需要在將交易新增到區塊之前檢查交易。比特幣使用 SHA-256 雜湊,以太坊則使用 Keccak-256。如果你是獨自挖礦,那麼在生成一個區塊之前,需要很長的時間(每十分鐘產生一個區塊,而你的競爭者有成千上百萬)。因此,礦工需要聚集在一起形成礦池。在礦池中,獎勵在參與者之間通過各種方式進行分配,這意味著你有可能會更經常地獲得獎勵。在這種情況下,風險和收益都是「分散」的。隨著時間趨於無限,來自礦池開採獎勵的數學期望值(無視礦池佣金)等於獨自挖礦的數學期望值。


到目前為止,我們主要介紹的是網路參與者之間的資料交換,並沒有深入太多細節。要記住,資料通過網路進行點對點交換,讓每個挖礦者都能看到交易。


這就是比特幣區塊鏈技術。


智慧合約和 ICO


讓我們繼續。兩個操作(加法和減法)在比特幣的每個賬戶上執行,任何人(主要是礦工)都可以檢查它們。但如果我們向帳戶新增內部變數並新增比較操作呢?假設當我積累了 1000 萬美元時,我不想再讓我的帳戶繼續接受資金,也就是說除了向賬戶新增資金的操作,還需要一定的條件。於是我們有了確定性圖靈機(每個人仍然可以檢查我的賬戶),然後是智慧合同。本文所說的智慧合約指的是以太坊網路中的智慧合約,因為它是目前最受歡迎的智慧合約。


確定性意味著在交易引數相同和儲存初始狀態相同的情況下,我們最終會得到相同的結果以及相同的儲存變更。只有在這些條件得到滿足的情況下,網路才能就每筆交易達成共識。我們必須明白,因為對確定性、可驗證性和去中心化的要求,智慧合約孤立於外部世界。例如,它無法呼叫去中心化的 Web API。另外,智慧合約對外界的控制也非常有限。例如,要通過智慧合約來租用公寓(交換加密貨幣)仍然是很困難的,因為我仍然需要確信當我來到公寓門口時,電子鎖上面不會再套著一把老式的掛鎖。


要了解智慧合約的執行結果(新的餘額或儲存變更),網路節點必須執行該合約規定的操作。在多個節點上的計算不是免費的,因此,以太坊引入了瓦斯(gas)的概念,以避免出現硬編碼加密貨幣佣金,並讓使用者可以計算運算數量及設定價格。這種結構提供了一個額外的間接層,讓使用者可以在低成本交易和快速交易之間進行選擇。



當資金被髮送到合約賬戶(通過地址)時,它便觸發了回退功能,即預設的入口。與賬戶不同的是,合約有多個入口——因此可以接受引數。要修改合約(無論入口是什麼),你必須將交易傳送到網路。但是,如果你只想以只讀模式檢視某些內容,則可以通過使用最新的區塊鏈在本地執行此操作。另外,與賬戶不同的是,智慧合約沒有私鑰。你不能直接從餘額中提取資金——這可以通過使用定義好的方法來完成,當然這些方法應該有安全限制,例如檢查試圖訪問資金的使用者的地址。


最後,我們在比特幣風格的區塊鏈上獲得智慧合約技術。


許多加密貨幣或所謂的「代幣」都是基於以太坊智慧合約。是的,通常這種加密貨幣只是一個以太坊合約。餘額是 map 形式的智慧合約儲存條目,貨幣從一個參與者到另一個參與者的轉移如下所示:


map[Alice] –= payment;map[Bob] += payment;


他們不需要自己挖礦和自己的網路,他們可以使用以太坊的基礎設施。在以太坊中,ICO/ITO 是指加密貨幣(代幣)的乙太網交換(以太坊網路的加密貨幣)。 ERC20 標準說明了哪些方法必須在加密貨幣中定義,這要歸功於交易所對加密貨幣的支援以及以太坊錢包提供的支援。


未來的發展


除了智慧合約之外,還有很多其他建立在區塊鏈基本概念之上的想法,比如「零知識證明(zero-knowledge proof)」和「自律網路(self-regulated network)」。


零知識證明基於同名的密碼協議族,實質上,它最初用於在不解開整個物件的情況下證明該物件的所有權。例如,如果我能夠說出某個檔案隨機十個位元組的位置,那就可以證明我擁有這個 1GB 的檔案。顯然,在這種情況下,我將只公開了 1GB 中的 10 個位元組。由於 RSA 加密涉及求冪,並且


(Y ∗ X) ^ a = Y^a ∗ X^a


所以最後變成了


encrypted(Y ∗ X) = encrypted(Y) ∗ encrypted(X)


也就是說,任何人都可以檢查我的帳戶餘額是否正確執行了乘法預算,而且沒有必要透露我的帳戶上有多少錢!基於這個想法,我們可以建立一種可以保護餘額和支付隱私資訊的加密貨幣(實際上,這樣的貨幣已經存在,如 Zcash)。


區塊鏈提供的通用設定已經包含在網路客戶端的程式碼中,例如區塊的交易數量。通常,更改它們需要網路參與者社羣接受這些更改(以程式碼更新的形式),這會帶來網路分支的風險(當一些參與者決定不接受更改並繼續使用「舊」程式碼)。自我監管嘗試解決這些問題(參見 Tezos 或 EOS 區塊鏈)。這個想法的本質是,對於每一次變更,都可以使用自己的資金進行投票(當然,不會失去它們)。


結論



簡而言之,區塊鏈技術走過了以下的路徑:


交易簽名(非對稱加密技術)+ 交易的開放性 + 交易的流水化 + 到圖靈機的擴充套件 +(零知識證明 | 自我監管 | ……)


我已經提到,許多加密貨幣實際上是以太坊的智慧合約,也就是說它們使用了以太坊區塊鏈。但除了比特幣和以太坊之外,還有其他專案——它們在細節和主要特徵方面可能會有所不同,有人已經嘗試建立幾乎全新的區塊鏈,如 EOS,甚至是不同的區塊拓撲,如 Tangle 和 AElf。


英文原文:https://medium.com/@Eenae/blockchain-through-the-eyes-of-a-developer-68415cc083c0


如果,Google 早已解決不了你的問題。


如果,你還想知道 Apple、Facebook、IBM、阿里等國內外名企的核心架構設計。


來,我們在深圳準備了 ArchSummit 全球架構師峰會,想和你分享:



  • 微信百億訊息背後的萬級機器是怎麼做 AI 排程的




  • 滴滴三核心引擎之一的地圖,如何計算路徑規劃和道路匹配




  • 微博如何做萬億級關係的實時協同推薦




  • 微眾區塊鏈首席架構師的兩個具體案例實操




  • 羅輯思維 Go 語言微服務完整改造全過程




  • 阿里菜鳥全球跨域 RPC 架構設計




  • 前特斯拉視覺深度學習負責人帶來的核心技術解析




  • 微服務楷模 Netflix 在 FaaS 上的最新實踐







http://www.kubonews.com/2018052919144.html

更多有趣新聞請上:http://www.kubonews.com

沒有留言:

張貼留言