源碼地址:https://github.com/corgi-kx/blockchain_consensus_algorithm/tree/master/pos
權(quán)益證明機(jī)制最開(kāi)始是由點(diǎn)點(diǎn)幣提出并應(yīng)用(出塊概率=代幣數(shù)量 * 幣齡) 簡(jiǎn)單來(lái)說(shuō)誰(shuí)的幣多,誰(shuí)就有更大的出塊概率芳誓。但是深挖下去,這個(gè)出塊概率誰(shuí)來(lái)計(jì)算?碰到無(wú)成本利益關(guān)系問(wèn)題怎么辦?這個(gè)共識(shí)算法初看很簡(jiǎn)單,實(shí)際有很多問(wèn)題需要解決歇父,且看以太坊什么時(shí)候能完全轉(zhuǎn)換到POS機(jī)制吧
區(qū)塊結(jié)構(gòu)
type block struct {
//上一個(gè)塊的hash
prehash string
//本塊hash
hash string
//時(shí)間戳
timestamp string
//區(qū)塊內(nèi)容
data string
//區(qū)塊高度
height int
//挖出本塊的地址
address string
}
聲明兩個(gè)節(jié)點(diǎn)池语盈。
mineNodesPool 用來(lái)存放指定的挖礦節(jié)點(diǎn)
probabilityNodesPool 用于存入挖礦節(jié)點(diǎn)的代幣數(shù)量*幣齡獲得的概率
//用于存儲(chǔ)區(qū)塊鏈
var blockchain []block
//代表挖礦節(jié)點(diǎn)
type node struct{
//代幣數(shù)量
tokens int
//質(zhì)押時(shí)間
days int
//節(jié)點(diǎn)地址
address string
}
//挖礦節(jié)點(diǎn)
var mineNodesPool []node
//概率節(jié)點(diǎn)池
var probabilityNodesPool []node
初始化節(jié)點(diǎn)池:
func init () {
//手動(dòng)添加兩個(gè)節(jié)點(diǎn)
mineNodesPool = append(mineNodesPool,node{1000,1,"AAAAAAAAAA"})
mineNodesPool = append(mineNodesPool,node{100,3,"BBBBBBBBBB"})
//初始化隨機(jī)節(jié)點(diǎn)池(挖礦概率與代幣數(shù)量和幣齡有關(guān))
for _,v:=range mineNodesPool{
for i:=0;i<=v.tokens * v.days; i ++ {
randNodesPool = append(randNodesPool,v)
}
}
}
每次挖礦都會(huì)從概率節(jié)點(diǎn)池中隨機(jī)選出獲得出塊權(quán)的節(jié)點(diǎn)地址
//隨機(jī)得出挖礦地址(挖礦概率跟代幣數(shù)量與幣齡有關(guān))
func getMineNodeAddress() string{
bInt:=big.NewInt(int64(len(randNodesPool)))
//得出一個(gè)隨機(jī)數(shù),最大不超過(guò)隨機(jī)節(jié)點(diǎn)池的大小
rInt,err:=rand.Int(rand.Reader,bInt)
if err != nil {
log.Panic(err)
}
return randNodesPool[int(rInt.Int64())].address
}
func main() {
//創(chuàng)建創(chuàng)世區(qū)塊
genesisBlock := block{"0000000000000000000000000000000000000000000000000000000000000000","",time.Now().Format("2006-01-02 15:04:05"),"我是創(chuàng)世區(qū)塊",1,"0000000000"}
genesisBlock.getHash()
//把創(chuàng)世區(qū)塊添加進(jìn)區(qū)塊鏈
blockchain = append(blockchain,genesisBlock)
fmt.Println(blockchain[0])
i:=0
for {
time.Sleep(time.Second)
newBlock:=generateNewBlock(blockchain[i],"我是區(qū)塊內(nèi)容","00000")
blockchain = append(blockchain,newBlock)
fmt.Println(blockchain[i + 1])
i++
}
}
運(yùn)行結(jié)果:
image