百行代碼簡(jiǎn)單實(shí)現(xiàn)區(qū)塊鏈DPOS(股份授權(quán)證明機(jī)制)挖礦機(jī)制


源碼地址:https://github.com/corgi-kx/blockchain_consensus_algorithm/tree/master/dpos

股份授權(quán)證明機(jī)制是POS的一個(gè)變種,簡(jiǎn)單來(lái)說(shuō)就是你手里有選票(幣就相當(dāng)于選票)浦马。這時(shí)一些正在競(jìng)選超級(jí)節(jié)點(diǎn)的大節(jié)點(diǎn)們說(shuō)把票都投給我把朴上,等我當(dāng)選了超級(jí)節(jié)點(diǎn)茎匠,我吃肉你喝湯,豈不美哉?然后你就信了,把票投給了競(jìng)選節(jié)點(diǎn),這些節(jié)點(diǎn)競(jìng)選成功成為超級(jí)節(jié)點(diǎn)后會(huì)輪循的獲得出塊權(quán)愧捕。曠工費(fèi)、通脹放出的代幣也就都到了他們手里了碟摆。比較中心化的一種共識(shí)機(jī)制晃财,但是TPS很高。


區(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
    //挖出本塊的節(jié)點(diǎn)地址
    address string
}
//用于存儲(chǔ)區(qū)塊鏈
var blockchain []block
//普通節(jié)點(diǎn)
type node struct{
    //代幣數(shù)量
    votes int
    //節(jié)點(diǎn)地址
    address string
}
//競(jìng)選節(jié)點(diǎn)
type superNode struct {
     node
}
//投票節(jié)點(diǎn)池
var voteNodesPool []node
//競(jìng)選節(jié)點(diǎn)池
var starNodesPool []superNode
//存放可以挖礦的超級(jí)節(jié)點(diǎn)池
var superStarNodesPool []superNode

初始化:
生成投票節(jié)點(diǎn)池并隨機(jī)賦予代幣數(shù)量典蜕,同時(shí)為競(jìng)選節(jié)點(diǎn)池生成競(jìng)選節(jié)點(diǎn)

//初始化
func init() {
    //初始化投票節(jié)點(diǎn)
    for i:=0;i<=voteNodeNum;i++ {
        rInt,err:=rand.Int(rand.Reader,big.NewInt(10000))
        if err != nil {
            log.Panic(err)
        }
        voteNodesPool = append(voteNodesPool,node{int(rInt.Int64()),"投票節(jié)點(diǎn)"+strconv.Itoa(i)})
    }
    //初始化超級(jí)節(jié)點(diǎn)
    for i:=0;i<=superNodeNum;i++ {
        starNodesPool = append(starNodesPool,superNode{node{0,"超級(jí)節(jié)點(diǎn)"+strconv.Itoa(i)}})
    }
}

模擬普通節(jié)點(diǎn)投票(隨機(jī)的對(duì)競(jìng)選節(jié)點(diǎn)投票)

//投票
func voting() {
    for _, v := range voteNodesPool {
        rInt, err := rand.Int(rand.Reader, big.NewInt(superNodeNum+1))
        if err != nil {
            log.Panic(err)
        }
        starNodesPool[int(rInt.Int64())].votes += v.votes
    }
}

對(duì)競(jìng)選節(jié)點(diǎn)根據(jù)得票數(shù)排序断盛,前幾名成為超級(jí)節(jié)點(diǎn)

//對(duì)挖礦節(jié)點(diǎn)進(jìn)行排序
func sortMineNodes() {
    sort.Slice(starNodesPool, func(i, j int) bool {
        return starNodesPool[i].votes > starNodesPool[j].votes
    })
    superStarNodesPool = starNodesPool[:mineSuperNodeNum]
}

主函數(shù)

func main() {
    fmt.Println("初始化", voteNodeNum, "個(gè)投票節(jié)點(diǎn)...")
    fmt.Println(voteNodesPool)
    fmt.Println("當(dāng)前存在的", superNodeNum, "個(gè)競(jìng)選節(jié)點(diǎn)")
    fmt.Println(starNodesPool)
    fmt.Println("投票節(jié)點(diǎn)們開(kāi)始進(jìn)行投票...")
    voting()
    fmt.Println("結(jié)束投票,查看競(jìng)選節(jié)點(diǎn)們獲得票數(shù)...")
    fmt.Println(starNodesPool)
    fmt.Println("對(duì)競(jìng)選節(jié)點(diǎn)按獲得票數(shù)排序愉舔,前", mineSuperNodeNum, "名钢猛,當(dāng)選超級(jí)節(jié)點(diǎn)")
    sortMineNodes()
    fmt.Println(superStarNodesPool)
    fmt.Println("開(kāi)始挖礦...")
    genesisBlock := block{"0000000000000000000000000000000000000000000000000000000000000000", "", time.Now().Format("2006-01-02 15:04:05"), "我是創(chuàng)世區(qū)塊", 1, "000000000"}
    genesisBlock.getHash()
    blockchain = append(blockchain, genesisBlock)
    fmt.Println(blockchain[0])
    i, j := 0, 0
    for {
        time.Sleep(time.Second)
        newBlock := generateNewBlock(blockchain[i], "我是區(qū)塊內(nèi)容", superStarNodesPool[j].address)
        blockchain = append(blockchain, newBlock)
        fmt.Println(blockchain[i+1])
        i++
        j++
        j = j % len(superStarNodesPool)
    }
}

運(yùn)行結(jié)果:


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轩缤,隨后出現(xiàn)的幾起案子命迈,更是在濱河造成了極大的恐慌,老刑警劉巖火的,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壶愤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馏鹤,警方通過(guò)查閱死者的電腦和手機(jī)征椒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)湃累,“玉大人勃救,你說(shuō)我怎么就攤上這事≈瘟Γ” “怎么了蒙秒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宵统。 經(jīng)常有香客問(wèn)我晕讲,道長(zhǎng),這世上最難降的妖魔是什么马澈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任瓢省,我火速辦了婚禮,結(jié)果婚禮上箭券,老公的妹妹穿的比我還像新娘。我一直安慰自己疑枯,他們只是感情好辩块,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般废亭。 火紅的嫁衣襯著肌膚如雪国章。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天豆村,我揣著相機(jī)與錄音液兽,去河邊找鬼。 笑死掌动,一個(gè)胖子當(dāng)著我的面吹牛四啰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粗恢,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柑晒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了眷射?” 一聲冷哼從身側(cè)響起匙赞,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妖碉,沒(méi)想到半個(gè)月后涌庭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欧宜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年坐榆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鱼鸠。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猛拴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚀狰,到底是詐尸還是另有隱情愉昆,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布麻蹋,位于F島的核電站跛溉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扮授。R本人自食惡果不足惜芳室,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刹勃。 院中可真熱鬧堪侯,春花似錦、人聲如沸荔仁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至次洼,卻和暖如春关贵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卖毁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工揖曾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亥啦。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓炭剪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親禁悠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子念祭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容