300行 Golang 實現區塊鏈
作者 瘋魔慕薇
0x1 開篇
區塊鏈,時下最火的技術。前段時間一篇《A blockchain in 200 lines of code》更是在技術圈裡刷屏。在讀過 Lauri Hartikka 寫的這篇文章和程式碼後,我愈發對區塊鏈興趣濃厚。
紙上得來終覺淺,要深入瞭解一門技術,終究是需要自己造一次輪子。於是,我著手用 Go 語言仿造著實現了一個 naivechain。
0x2 區塊資料結構
和 Lauri Hartikka 一樣,資料結構上我們一切從簡,只使用 Index
,PreviousHash
,Timestamp
,Data
,Hash
這幾個必要的欄位。
0x3 區塊雜湊
區塊雜湊
用於驗證區塊資料
Index
, PreviousHash
,Timestamp
, Data
拼接字串的摘要。0x4 建立新區塊
為了生成新區塊,我們需要知道前區塊
和新區塊的必要資料(Index
,Hash
,Timestamp
, 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"
檢視節點
1
curl http://localhost:3001/peers
0xA 結語
這是一個最簡單的區塊鏈實現,用於學習區塊鏈的工作原理,因為沒用實現工作量證明這一類的挖礦演算法,不適宜在公共網路使用。更多的細節請訪問 Github: https://github.com/kofj/naivechain。