這是一篇從程序員視角看區(qū)塊鏈的文章,將區(qū)塊鏈落地為程序員能夠理解的概念,比如圖靈狀態(tài)機,而狀態(tài)機是一種狀態(tài)模式,是事件驅(qū)動建模的核心。本文適合區(qū)塊鏈入門閱讀:
不對稱密碼已經(jīng)存在了很長一段時間,密鑰有公鑰和私鑰之分。我們使用公鑰進行加密并使用私鑰解密?;蛳喾匆嗳?。你無法從一個密鑰中獲得另外一個密鑰。因此,如果使用不對稱加密技術,我可以向某人發(fā)送一條信息,比如“我轉賬100美元”,并且每個人都會知道它是由我發(fā)送的,并且沒有任何改動。
假設有十個人都同意每個人擁有一百萬單位的新貨幣。他們每個人都可以確保(并且每個人都可以確信)是有某人發(fā)送了三十萬個單位。但是X是否真的擁有這些三十萬個單位貨幣卻還不得而知。為了找到答案,我們可以了解每個人的余額情況。為此,我們只需將所有收入交易加起來并扣除所有費用進行計算。由此,我們就需要有關收入和支出的信息,這就是公共賬本。它可以讓我們識別某個人是否真的可以發(fā)出30萬個單位的貨幣。
比特幣:開始
還有一個問題 - 如果我把我所有的錢同時寄給兩個人怎么辦?這被稱為雙重支出。如果讓這兩個人彼此溝通以找出誰最終獲得付款是不方便的;查看時間戳以確定我首先將資金發(fā)送誰了?這種辦法非fail-safe的。這里有一個解決方案 - 我們需要流線化交易,在這種流線化交易模式下,很明顯能看出第一筆付款已經(jīng)發(fā)給了約翰,根本無法再將這筆付款發(fā)給第二個人,因為我沒有更多的錢了。
流線型交易主要是對交易進行排序,但是現(xiàn)在還不清楚怎么來決定交易的順序。在銀行和其他集中系統(tǒng)中,銀行自身代表了受托人,是單點風險點,也是單點信任點。該銀行可以出面澄清說,某某的錢先寄給了誰。但是在區(qū)塊鏈中,沒有單個受托人。它可能是網(wǎng)絡的大部分參與者(當然,這意味著整個網(wǎng)絡,因為你不能相信每一個參與者,因為其中肯定有一些騙子)。這里的假設前提是網(wǎng)絡不受任何一個人的控制,并且大多數(shù)參與者嚴格按照利于自己的經(jīng)濟利益行事(自利)。
但是流線型交易的一致性問題仍然沒有徹底解決 - 這就要求我們在網(wǎng)絡參與者中實現(xiàn)一種稱之為“共識”的機制。這個問題是由一個共識算法處理的,這是每個區(qū)塊鏈中的一個關鍵算法。
在我們討論一個特定的共識算法之前,先說說區(qū)塊鏈的塊。塊是一種技術措施,是批量處理(稱為批處理)的一個實例,因此許多交易能在一個“批量”內(nèi)計算以達成共識,并且網(wǎng)絡的間接費用可以跨多個交易中“分攤”。塊內(nèi)交易的順序是由網(wǎng)絡參與者(即生成該塊的人員(也稱為“礦工”))定義的。但塊之間的順序由共識算法確定。共識算法存在相當長的一段時間。例如包括多主NoSQL系統(tǒng)中的Paxos和Raft等算法。但這些算法并不適合擁有一百萬對參與者的網(wǎng)絡。
比特幣在它出現(xiàn)的時候代表了相當革命性的東西 - 一種工作證明(PoW)共識的算法。許多網(wǎng)絡參與者(礦工)會同時生成很多新塊。因此有必要決定這些塊中的哪一個塊能夠被真正用作區(qū)塊鏈的下一塊。
為了使自己產(chǎn)生的塊成為區(qū)塊鏈中真正的下一個塊,礦工必須執(zhí)行特別挑選且非常耗時的哈希計算。當一個哈希數(shù)值計算到一個大數(shù)字,且必須符合某些條件,比如必須前面包含10個零。這就會需要數(shù)十億次哈希計算,這個計算量就代表礦工能“證明”其塊的確實存在的證據(jù)。同時,檢查這項工作是否正確完成是非常容易的 - 您只需要一次哈希操作。必須了解到的是:平均而言,整個網(wǎng)絡(其中包括成千上萬的礦工?。┰?0分鐘內(nèi)就可以生成一個區(qū)塊(比特幣生成區(qū)塊的平均間隔)! 。這大大降低了曠工之間碰撞的可能性,即就不可能同時有兩個礦工提供兩個或更多的塊作為下一個塊。
但是,發(fā)生碰撞的可能性還是可能存在的。因此,存在這樣規(guī)則 - 網(wǎng)絡參與者接受形成最長鏈的塊(當有兩個塊同時生成時,選擇其中一個更長的鏈的塊)。
事實上,它不是一個鏈,而是一個有許多分支和有向無環(huán)圖(DAG)的鏈,而鏈通常被稱為“共同歷史”(它是最長的鏈)。既然共識不能立即達成,你就必須等待一段時間直到出現(xiàn)幾個塊之后。為了防止比特幣的雙重支出,人們通常會等待六個塊(在比特幣里需要花費一個小時)。
除了事務之外,塊還包括前一個塊的哈希。因此,過去歷史就不可能被修改,因為這會使隨后的所有哈希無效。同時,連接到同一個塊,您會獲得挖礦獎勵,這會給您帶來新的收益!否則,就無法將新資金引入這個系統(tǒng)中 - 資金將不得不發(fā)放給某人,這會使這個人變得特殊,這與分權的想法會形成矛盾。為挖礦發(fā)錢似乎是一種合乎邏輯和可接受的解決方案。
順便說一句,關于挖礦。你需要明白,礦工的主要工作是猛烈地哈希計算出新塊; 這里沒有非對稱加密技術,因為這里僅僅需要在交易加入塊之前檢查交易。比特幣使用SHA-256哈希; 在以太坊中,它是采取Keccak-256。如果你是單獨開采,那么在你生成一個區(qū)塊之前,需要準備好長時間(每十分鐘產(chǎn)生一個區(qū)塊,你的競爭者數(shù)量達到數(shù)百成千上萬的?。?。如果礦工聚集在一起。在一個池中,參與者之間的獎勵是以各種方式分配的(有不同的方法),這意味著您可以更經(jīng)常地獲得獎金(盡管數(shù)量比較少)。在這種情況下,風險和收益都是成正比的。
到目前為止,我們主要處理的是網(wǎng)絡參與者之間的數(shù)據(jù)交換,而沒有深入細節(jié)。牢記數(shù)據(jù)通過網(wǎng)絡對等進行交換是非常重要的。
這就是比特幣區(qū)塊鏈技術。
智能合約和ICO
在比特幣的每個賬戶上執(zhí)行兩個操作(加法和減法),并且可以由任何人檢查,當然主要由礦工檢查。但是如果我們將一個內(nèi)部變量添加到帳戶(存儲),它是用來進行操作比較的,假設我積累了1000萬美元時,我想讓我的帳戶停止接受資金 - 這意味著代碼實現(xiàn)上不僅要將資金能夠增加到我的帳戶中,還要為這種增加再添加一定的條件。通過開發(fā)這個角度看過去,我們看到的是一個圖靈機,一種確定性的類型(每個人仍然可以檢查我的賬戶)。因此,我們有了一個智能合約。在下文中,智能合約指的是以太坊網(wǎng)絡中的智能合約,因為它是目前最受歡迎的合約。
確定性意味著,在有相同的交易參數(shù)和存儲的初始狀態(tài)相同的情況下,我們最終會得到相同的結果,以及存儲中同樣的更改動作(banq注:操作事件)。只有在這些條件下,網(wǎng)絡才能就每筆交易達成一致。
這里必須明白,由于要求確定性,可驗證性和分散性,智能合約與外部世界相當孤立。例如,它不能觸發(fā)分散式Web API(有解決方案,即所謂的“oracles”,但這些都很復雜,需要分別處理)。
另外,合同對外界的控制也非常有限。例如,要了解智能合同執(zhí)行結果(新余額或存儲的更改動作),網(wǎng)絡節(jié)點必須執(zhí)行該合同規(guī)定的操作。在多個節(jié)點上進行計算不是沒有成本的。因此,以太坊引入了gas 的概念,以避免加密貨幣硬編碼進行計算帶來的成本,并允許用戶計算計算次數(shù)并設置其價格。這種結構提供了一個額外的間接層,它允許用戶在低成本交易和快速交易之間進行選擇。
當資金被發(fā)送到合約賬戶(通過簡單地使用地址)時,它觸發(fā)回調(diào)函數(shù),這是默認設置。與前面比特幣的帳戶類型不同,智能合約的合約中有多個輸入點 - 這些是可以接受參數(shù)的方法。要修改合約(無論輸入點是什么),您必須將交易發(fā)送到網(wǎng)絡才能進行更改。但是,如果您只想以只讀模式查看某些內(nèi)容,則可以通過使用實時更新的區(qū)塊鏈在本地執(zhí)行此操作。另外與賬戶不同的是,智能合約沒有私鑰。您不能直接從余額中提取資金 - 這可以通過使用明確定義的方法來完成,當然這些方法應該有安全限制,例如檢查試圖訪問資金的用戶的地址。
最后,我們在比特幣風格的區(qū)塊鏈上獲得了智能合約技術。
許多加密貨幣或所謂的“代幣tokens”都基于以太坊智能合約。是的,通常這種加密貨幣只是以太坊中的一個合同(一個?。?。余額通常是智能合約存儲中的map數(shù)據(jù)類型的一個數(shù)據(jù)條目,并且從一個參與者轉移貨幣到另一個參與者如下:
map[Alice] –= payment;
map[Bob] += payment;
他們不需要自己的曠工和網(wǎng)絡 - 他們可以使用以太坊的基礎設施。在以太坊,ICO / ITO實際就是加密貨幣(tokens)的以太網(wǎng)交換(以太坊網(wǎng)絡的加密貨幣)。
未來發(fā)展
除了智能合約之外,基于區(qū)塊鏈的基本概念之上還有很多其他想法,比如“零知識證明”和“自律網(wǎng)絡”。
零知識證明是基于密碼協(xié)議的同名家族,實質(zhì)上,它被設計為證明對象的所有權但不完全暴露它。例如,如果我能夠回答關于某文件的各種隨機位置中有關字節(jié)的十個問題,我就可以證明我擁有一個特定的1 GB文件。顯然,在這種情況下,我只需公開1 GB中的10個字節(jié)即可。
這意味著可以讓任何人檢查我的帳戶余額是否正確,同時卻沒有必要透露我的帳戶上有多少錢!通過構建這個想法,我們可以創(chuàng)建一個包含余額和支付隱私信息的加密貨幣(實際上,它已經(jīng)存在了;參見Zcash),并且完全隱藏了智能合約中計算參數(shù)。
區(qū)塊鏈有寫入網(wǎng)絡客戶端程序代碼的網(wǎng)絡通用設置,例如包含在該區(qū)塊中的交易數(shù)量。通常,更改它們需要網(wǎng)絡上所有參與者接受這些更改(以代碼更新的形式出現(xiàn)),這會帶來網(wǎng)絡分支的威脅(當一些參與者決定不接受更改并繼續(xù)與“舊”碼)。Self-regulation試圖解決這些問題(例如,參見Tezos或EOS區(qū)塊鏈)。這種想法的本質(zhì)是,對于每一次變更,您都可以用自己的資金進行投票(當然不會失去這些資金)。