1. 程式人生 > >300行 Golang 實現區塊鏈

300行 Golang 實現區塊鏈

作者 瘋魔慕薇

0x1 開篇

  區塊鏈,時下最火的技術。前段時間一篇《A blockchain in 200 lines of code》更是在技術圈裡刷屏。在讀過 Lauri Hartikka 寫的這篇文章和程式碼後,我愈發對區塊鏈興趣濃厚。
  紙上得來終覺淺,要深入瞭解一門技術,終究是需要自己造一次輪子。於是,我著手用 Go 語言仿造著實現了一個 naivechain

0x2 區塊資料結構

  和 Lauri Hartikka 一樣,資料結構上我們一切從簡,只使用 IndexPreviousHashTimestampDataHash 這幾個必要的欄位。

0x3 區塊雜湊

  區塊雜湊用於驗證區塊資料

的完整性,使用 SHA-256 演算法生成Index, PreviousHashTimestamp, Data 拼接字串的摘要。

0x4 建立新區塊

  為了生成新區塊,我們需要知道前區塊和新區塊的必要資料(IndexHashTimestamp, Data);區塊資料由終端使用者提供。

0x5 創世塊

  區塊鏈的第一個區塊被稱之為創世塊,被硬編碼在程式內。

0x6 區塊儲存

  這裡使用 Go 語言的 Slice 儲存區塊。區塊鏈是有序 List,為了保證有序性,需要對記憶體中儲存區塊的陣列進行排序。定義按 Index 排序的結構體 ByIndex,並實現 sort.Interface

0x7 區塊完整性驗證

0x8 節點通訊

  每個節點在啟動時監聽一個埠(由 -p2p 引數指定),使用 websocket 協議和其它節點通訊。

0x9 節點控制

  沒個節點在啟動時監聽一個埠(由 -api 引數指定),接收 HTTP 協議的 JSON 控制命令。使用示例:

  • 檢視區塊

    1

    curl http://localhost:3001/blocks

  • 建立區塊

    1

    curl -H "Content-type:application/json" --data '{"data" : "Some data to the first block"}' http://localhost:3001/mine_block

  • 新增節點

    1

    curl -H "Content-type:application/json"

    --data '{"peer" : "ws://localhost:6002"}' http://localhost:3001/add_peer

  • 檢視節點

    1

    curl http://localhost:3001/peers

0xA 結語

  這是一個最簡單的區塊鏈實現,用於學習區塊鏈的工作原理,因為沒用實現工作量證明這一類的挖礦演算法,不適宜在公共網路使用。更多的細節請訪問 Github: https://github.com/kofj/naivechain。