08.27 超級簡單的200 行 Javascript 代碼構造一個區塊鏈

區塊鏈的基礎概念是非常簡單的:一個有序遞增記錄列表的分佈式數據庫。然而,當我們在談論區塊鏈時很容易和用區塊鏈來解決問題的過程混淆。這在如今較流行的以區塊鏈為底層技術的項目,如比特幣以及以太坊中也會存在這樣的問題。“區塊鏈”這個概念經常會和以下幾個概念聯繫起來,比如交易,智能合約,或者加密貨幣。

這使得理解區塊鏈變得更加艱難,特別是從源代碼角度。在這篇文章中我會用 200 行的 Javascript 代碼構建一個簡單的區塊鏈, 叫做 NaiveChain(https://github.com/lhartikk/naivechain)。

區塊構造

第一個邏輯上的步驟是決定區塊的構造。為了儘可能簡單,只包含了必要 的幾個部分:索引,時間戳,數據,哈希以及前一個區塊的哈希。

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

區塊中必須包含前一個區塊的哈希值來保證鏈的完整性。

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

區塊哈希

需要對區塊進行哈希運算來保持數據的完整性。對區塊內容進行 SHA-256 散列。這裡的哈希運算與挖礦毫無關聯,因為這裡不包含工作量證明問題。

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

生成一個區塊

為了生成一個區塊,我們必須知道前一個區塊的哈希值以及創建區塊內容要求的剩餘部分(即索引,哈希,數據,以及時間戳)。區塊數據由最後一個使用者提供。

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

存儲區塊

內存中的 Javascript 用來存儲區塊鏈。區塊鏈中的第一個區塊被稱作 “成因塊”,它是採用硬編碼編寫的。

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

驗證區塊的完整性

在任意一個時間點我們必須能夠驗證一個區塊或區塊鏈的數據完整性。特別是有其他節點的新區塊接入時需決定是否接受它們。

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

選擇最長鏈

無論在什麼時間點,都應該只有一條明確的區塊鏈。在有衝突的情況下,選擇最大數值區塊所在的那條鏈。

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

和其他節點溝通

節點的一個重要部分是與鏈上的其他節點共享信息並在鏈上同步。下面的規則是用來確保鏈上節點的同步。

  • 當一個節點生成一個新的區塊,會在網絡上進行廣播。
  • 當一個節點鏈接到一個新的點時,它會對最後一個區塊發起請求。
  • 當一個新的節點碰見一個區塊的索引大於當前已知區塊時,它會把這個區塊添加到當前鏈上或是向整個區塊鏈發起請求。
超級簡單的200 行 Javascript 代碼構造一個區塊鏈

這是當節點遵循規定協議時的一些經典的通訊場景

不使用自動對等探索。點的位置(即 URL) 必須被手動添加。

控制節點

從某種程度上說,用戶必須能夠控制他們的節點。這通過建立 HTTP 服務器來完成。

正如所見,用戶能夠通過以下方式與節點進行交互:

  • 列出所有的區塊
  • 創建一個新的區塊,區塊內容由用戶提供
  • 列出或是添加點

控制節點最直接了當的方法是通過 Curl :

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

架構

應該指出的一點是事實上一個節點需要兩個網絡服務器:其中一個服務器是讓用戶能夠控制節點(即 HTTP 服務器),另一個服務器是供節點間進行點對點通信用的。(Websocket HTTP 服務器)

超級簡單的200 行 Javascript 代碼構造一個區塊鏈

NaiveChain 的主要組成部分

結論

NaiveChain 主要是用來演示和學習的。因為它並不包含挖礦算法(工作量證明或是權益證明),所以它不能在公網中使用。儘管如此,它還是包含了功能區塊鏈的基本特徵


分享到:


相關文章: