區塊鍊的基礎概念很簡單:一個分布式資料庫,存儲一個不斷加長的 list,list 中包含着許多有序的記錄。然而,在通常情況下,當我們談到區塊鍊的時候也會談起使用區塊鍊來解決的問題,這兩者很容易混淆。像流行的比特币和以太坊這樣基于區塊鍊的項目就是這樣。“區塊鍊”這個術語通常和像交易、智能合約、加密貨币這樣的概念緊緊聯系在一起。
這就令了解區塊鍊變得不必要得複雜起來,特别是當你想了解源碼的時候。下面我将通過 200 行 js 實作的超級簡單的區塊鍊來幫助大家了解它,我給這段代碼起名為 naivechain。
第一個邏輯步驟是決定塊結構。為了保證事情盡可能的簡單,我們隻選擇最必要的部分:index(下标)、timestamp(時間戳)、data(資料)、hash(哈希值)和 previous hash(前置哈希值)。
這個塊中必須能找到前一個塊的哈希值,以此來保證整條鍊的完整性。
為了儲存完整的資料,必須哈希區塊。sha-256會對塊的内容進行加密,記錄這個值應該和“挖礦”毫無關系,因為這裡不需要解決工作量證明的問題。
要生成一個塊,必須知道前一個塊的哈希值,然後創造其餘所需的内容(= index, hash, data and timestamp)。塊的data部分是由終端使用者所提供的。
記憶體中的javascript數組被用于存儲區塊鍊。區塊鍊的第一個塊通常被稱為“起源塊”,是寫死的。
在任何時候都必須能确認一個區塊或者一整條鍊的區塊是否完整。在我們從其他節點接收到新的區塊,并需要決定接受或拒絕它們時,這一點尤為重要。
任何時候在鍊中都應該隻有一組明确的塊。萬一沖突了(例如:兩個結點都生成了72号塊時),會選擇有最大數目的塊的鍊。
結點的本質是和其他結點共享和同步區塊鍊,下面的規則能保證網絡同步。
當一個結點生成一個新塊時,它會在網絡上散布這個塊。
當一個節點連接配接新peer時,它會查詢最新的block。
當一個結點遇到一個塊,其index大于目前所有塊的index時,它會添加這個塊到它目前的鍊中,或者到整個區塊鍊中查詢這個塊。
如圖為當節點遵循前文所述協定時會發生的一些典型通信場景
我沒有采用自動發現peer的工具。peers的位置(url)必須是手動添加的。
在某種程度上使用者必須能夠控制結點。這一點通過搭建一個http伺服器可以實作。
使用者可以用下面的方法和結點互動:
列出所有的塊
用使用者提供的内容建立一個新的塊
列出或者新增peers
下面這個curl的例子就是最直接的控制結點的方法:
需要指出的是,節點實際上展現了兩個web伺服器:一個(http伺服器)是讓使用者控制節點,另一個(websocket http伺服器)。
naivechain的主要組成部分
創造 naivechain 的目的是為了示範和學習,因為它并沒有“挖礦”算法(pos of pow),不能被用于公用網絡,但是它實作了區塊鍊運作的基本特性。
<a target="_blank" href="https://github.com/lhartikk/naivechain">https://github.com/lhartikk/naivechain</a>
<a target="_blank" href="https://medium.com/@lhartikk/a-blockchain-in-200-lines-of-code-963cc1cc0e54#.nee3pfym6">https://medium.com/@lhartikk/a-blockchain-in-200-lines-of-code-963cc1cc0e54#.nee3pfym6</a>