專案 GitHub 位置: https://github.com/weiawesome/block-chain_go
區塊運算中最核心的部分 便是 礦工
而所謂挖礦就是去找 Nonce 以符合區塊難度
不過基於現代多核心的處理器
完全可以運用這優勢 去進行平行運算
此處便是透過 Goroutine 的方式同時開啟多個運算單位
另外再透過一個 領導者 領導 礦工們運作
此處分為以下幾點敘述
完成的範圍便是 礦工管理者 與 礦工們
礦工管理者
Channel 名稱 | Channel 類型 | 地點 |
---|---|---|
MinersBlockChannel | 進 | 刷新區塊 |
SuccessBlockChannel | 進 | 礦工們 |
minersChannels | 出 | 礦工們 |
MinersSuccessBlockChannel | 出 | 接收驗證區塊 |
礦工們
Channel 名稱 | Channel 類型 | 地點 |
---|---|---|
minersChannels | 進 | 礦工管理者 |
SuccessBlockChannel | 出 | 礦工管理者 |
檔案位置: "./service/miners_leader/miners_leader.go"
func MinerLeader(Miners int, MinersBlockChannel chan blockchain.Block, MinersSuccessBlockChannel chan blockchain.Block) {
var minersChannels []chan blockchain.Block
SuccessBlockChannel := make(chan blockchain.Block)
Lower := uint32(0)
Upper := ^uint32(0)
nonceRange := (Upper - Lower + 1) / uint32(Miners)
for i := 0; i < Miners; i++ {
minerChannel := make(chan blockchain.Block)
go miners.Miner(Lower, Lower+uint32(i)*nonceRange, minerChannel, SuccessBlockChannel)
minersChannels = append(minersChannels, minerChannel)
}
for {
select {
case mb := <-MinersBlockChannel:
for _, channel := range minersChannels {
channel <- mb
}
case sb := <-SuccessBlockChannel:
MinersSuccessBlockChannel <- sb
}
}
}
檔案位置: "./service/miners/miners.go"
func Miner(Lower uint32, Upper uint32, MinerBlockChannel chan blockchain.Block, SuccessBlockChannel chan blockchain.Block) {
for {
select {
case b := <-MinerBlockChannel:
if len(b.BlockTransactions) <= 1 && conseous.MineEmpty == false {
continue
}
i := Lower
flag := false
for {
select {
case nb := <-MinerBlockChannel:
i = Lower - 1
b = nb
default:
b.BlockTop.Nonce = i
b.ComputeBlockHash()
if b.CheckDifficulty() {
SuccessBlockChannel <- b
flag = true
break
}
i++
if i == Upper {
flag = true
break
}
}
if flag {
break
}
}
default:
continue
}
}
}
根據所限定的範圍去尋找 Nonce 以符合區塊難度
另外此處有一個設定 MineEmpty 代表是否要挖空的區塊
(像是在比特幣當中 若是區塊內無交易 則獎勵減半)
因此透過這個設計 就可以設定這個區塊鏈是否會挖掘空區塊
在市面上 會常常聽聞使用 GPU 挖礦
究其原由 就是因為 GPU 本身設計模式
GPU 相較於 CPU 有非常多的核心
CPU 可能 6核、9核 但 GPU 可以到上千核心
不過就單個核心計算能力 CPU 大於 GPU
因此 GPU 適用於 多點同時得簡單運算(如圖像、深度學習運算...
而 CPU 則做為 電腦核心使用
希望透過此處能夠理解
目前對於區塊運算就告一段落了!
其實邏輯上現在區塊鏈已經能成功運作起來了
包括 建立節點、連接節點、傳輸訊息、計算區塊...
不過目前對於 提交交易 或是 查詢區塊...的服務
需要提供一個接口
因此是時候來建立 API (應用程序接口)