「用不到200行 Go 代碼就能實現一個本身的區塊鏈!」 聽起來有意思嗎?有什麼能比開發一個本身的區塊鏈更好的學習實踐方法呢?那咱們就一塊兒來實踐下!html
由於咱們是一家從事醫療健康領域的科技公司,因此咱們採用人類平靜時的心跳數據(BPM心率)做爲這篇文章中的示例數據。讓咱們先來統計一下你一分鐘內的心跳數,而後記下來,這個數字可能會在接下來的內容中用到。
經過本文,你將能夠作到:git
建立本身的區塊鏈github
理解 hash 函數是如何保持區塊鏈的完整性web
如何創造並添加新的塊算法
多個節點如何競爭生成塊json
經過瀏覽器來查看整個鏈瀏覽器
全部其餘關於區塊鏈的基礎知識網絡
可是,對於好比工做量證實算法(PoW)以及權益證實算法(PoS)這類的共識算法文章中將不會涉及。同時爲了讓你更清楚得查看區塊鏈以及塊的添加,咱們將網絡交互的過程簡化了,關於 P2P 網絡好比「全網廣播」這個過程等內容將在下一篇文章中補上。數據結構
咱們假設你已經具有一點 Go 語言的開發經驗。在安裝和配置 Go 開發環境後以後,咱們還要獲取如下一些依賴:函數
go get github.com/davecgh/go-spew/spew
spew 能夠幫助咱們在 console 中直接查看 struct 和 slice 這兩種數據結構。
go get github.com/gorilla/mux
Gorilla 的 mux 包很是流行, 咱們用它來寫 web handler。
我有幾張阿里雲幸運券分享給你,用券購買或者升級阿里雲相應產品會有特惠驚喜哦!把想要買的產品的幸運券都領走吧!快下手,立刻就要搶光了。
go get github.com/joho/godotenv
godotenv 能夠幫助咱們讀取項目根目錄中的 .env 配置文件,這樣咱們就不用將 http port 之類的配置硬編碼進代碼中了。好比像這樣:
ADDR=8080
接下來,咱們建立一個 main.go 文件。以後咱們的大部分工做都圍繞這個文件,讓我開始編碼吧!
咱們將全部的依賴包以聲明的方式導入進去:
package main import ( "crypto/sha256" "encoding/hex" "encoding/json" "io" "log" "net/http" "os" "time" "github.com/davecgh/go-spew/spew" "github.com/gorilla/mux" "github.com/joho/godotenv" )
接着咱們來定義一個結構體,它表明組成區塊鏈的每個塊的數據模型:
type Block struct { Index int Timestamp string BPM int Hash string PrevHash string }
Index 是這個塊在整個鏈中的位置
Timestamp 顯而易見就是塊生成時的時間戳
Hash 是這個塊經過 SHA256 算法生成的散列值
PrevHash 表明前一個塊的 SHA256 散列值
BPM 每分鐘心跳數,也就是心率。還記得文章開頭說到的嗎?
接着,咱們再定義一個結構表示整個鏈,最簡單的表示形式就是一個 Block 的 slice: