天天看點

200 行代碼實作一個簡單的區塊鍊應用

區塊鍊的基礎概念很簡單:一個分布式資料庫,存儲一個不斷加長的 list,list 中包含着許多有序的記錄。然而,在通常情況下,當我們談到區塊鍊的時候也會談起使用區塊鍊來解決的問題,這兩者很容易混淆。像流行的比特币和以太坊這樣基于區塊鍊的項目就是這樣。“區塊鍊”這個術語通常和像交易、智能合約、加密貨币這樣的概念緊緊聯系在一起。

這就令了解區塊鍊變得不必要得複雜起來,特别是當你想了解源碼的時候。下面我将通過 200 行 js 實作的超級簡單的區塊鍊來幫助大家了解它,我給這段代碼起名為 naivechain。

第一個邏輯步驟是決定塊結構。為了保證事情盡可能的簡單,我們隻選擇最必要的部分:index(下标)、timestamp(時間戳)、data(資料)、hash(哈希值)和 previous hash(前置哈希值)。

200 行代碼實作一個簡單的區塊鍊應用

這個塊中必須能找到前一個塊的哈希值,以此來保證整條鍊的完整性。

為了儲存完整的資料,必須哈希區塊。sha-256會對塊的内容進行加密,記錄這個值應該和“挖礦”毫無關系,因為這裡不需要解決工作量證明的問題。

要生成一個塊,必須知道前一個塊的哈希值,然後創造其餘所需的内容(= index, hash, data and timestamp)。塊的data部分是由終端使用者所提供的。

記憶體中的javascript數組被用于存儲區塊鍊。區塊鍊的第一個塊通常被稱為“起源塊”,是寫死的。

在任何時候都必須能确認一個區塊或者一整條鍊的區塊是否完整。在我們從其他節點接收到新的區塊,并需要決定接受或拒絕它們時,這一點尤為重要。

任何時候在鍊中都應該隻有一組明确的塊。萬一沖突了(例如:兩個結點都生成了72号塊時),會選擇有最大數目的塊的鍊。

200 行代碼實作一個簡單的區塊鍊應用

結點的本質是和其他結點共享和同步區塊鍊,下面的規則能保證網絡同步。

當一個結點生成一個新塊時,它會在網絡上散布這個塊。

當一個節點連接配接新peer時,它會查詢最新的block。

當一個結點遇到一個塊,其index大于目前所有塊的index時,它會添加這個塊到它目前的鍊中,或者到整個區塊鍊中查詢這個塊。

200 行代碼實作一個簡單的區塊鍊應用

如圖為當節點遵循前文所述協定時會發生的一些典型通信場景

我沒有采用自動發現peer的工具。peers的位置(url)必須是手動添加的。

在某種程度上使用者必須能夠控制結點。這一點通過搭建一個http伺服器可以實作。

使用者可以用下面的方法和結點互動:

列出所有的塊

用使用者提供的内容建立一個新的塊

列出或者新增peers

下面這個curl的例子就是最直接的控制結點的方法:

需要指出的是,節點實際上展現了兩個web伺服器:一個(http伺服器)是讓使用者控制節點,另一個(websocket http伺服器)。

200 行代碼實作一個簡單的區塊鍊應用

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>

繼續閱讀