基于以太坊go-ethereum的DPOS实现(六)代表选择

源码

GitHub地址 https://github.com/TTCECO/gttc

目录

基于以太坊go-ethereum的DPOS实现(一)源码及测试运行
基于以太坊go-ethereum的DPOS实现(二)简要说明
基于以太坊go-ethereum的DPOS实现(三)创世块
基于以太坊go-ethereum的DPOS实现(四)共识接口
基于以太坊go-ethereum的DPOS实现(五)定时出块
基于以太坊go-ethereum的DPOS实现(六)代表选择

代表选择

在POW共识中,没有代表的概念,任何地址都可以出块没有限制。对于整体来说,算力证明来保证最长链的安全,对于个体来说,一切都是运气。出块块的过程,好像是不停再重复着一个赢家通吃的赌*博游戏。这也是比特币设计中精彩的地方,利用人性的贪婪来维护系统的运行。

相比而言,DPOS共识更像一个现代的社会形态,由选出来的代表来执行某些特定的任务,即出块。现实中的选择过程会集中统计每个个体的选择结果,在区块链当中,依然如此,不过个体由生命变为资金。或者换句话说,每个加密货币拥有者做出的选择,是你代替你的每一个单位的加密货币做出的选择。

在程序中,我们会构造一种特别的交易,从A地址向B地址转移数量为0的代币,代表A投*票给B地址,而票数的计算则是A地址当前拥有货币的数量。

func (a *Alien) processEventVote(currentBlockVotes []Vote, state *state.StateDB, tx *types.Transaction, voter common.Address) []Vote {

    a.lock.RLock()
    stake := state.GetBalance(voter)
    a.lock.RUnlock()

    currentBlockVotes = append(currentBlockVotes, Vote{
        Voter:     voter,
        Candidate: *tx.To(),
        Stake:     stake,
    })

    return currentBlockVotes
}

每个投票的结果,都会在snapshot中进行计算,其结果会直接决定哪些地址有资格成为代表,打包交易,生产新的块。

你可能感兴趣的:(基于以太坊go-ethereum的DPOS实现(六)代表选择)