Code前端首页关于Code前端联系我们

区块链共识算法:PoS 及其例子go语言代码实现

terry 2年前 (2023-09-27) 阅读数 66 #数据结构与算法
区块链共识算法:PoS及其go语言代码实现示例。它的字面意思是共享系统。换句话说,谁拥有的股份越多,谁的权力就越大。这类似于股份公司股东在我们生活中的重要性。

然而,在区块链的应用程序中,实际上不可能将份额节点分配给链中的份额。相反,还有其他东西充当份额,我们将这些东西分配到链上。中间节点。下面将给出几个例子来说明这个概念。

例如PoS虚拟货币应用我们可以控制货币的数量作为拥有的股权和股份的数量。现在以太坊ETH有共识机制PoS,所以在以太坊中它是通过每个以太坊拥有的代币ETH数量来衡量的嗯节点 ,该节点拥有多少股份以及拥有多少权力。假设有一个以太坊网络,共有3个节点,A、B、C。其中,节点A有10,000个ETH代币,而B和C分别有1,000和2,000个。那么,在这个以太坊网络中,A区块很可能会被选中,在决策过程中拥有更大的发言权。

再举个例子,假设未来有一个非虚拟货币区块链和一条公链,一个结合了现实产业的链比如汽车链,你可以给定车主拥有的第辆汽车,以及他的车值多少钱,用于将份额分配给,例如指定公式: 汽车数量*汽车价值=股份数量。在PoS中,份额是一个概念,一个衡量话语权的概念。

PoS的特点

上面的描述解释了PoS共识算法的概念。因为它是以

的东西的拥有者的数量来衡量的,也就是说只要我们的节点有ETH代币之类的东西,即使有也只有一个 每个人都有发言权。哪怕他们还小,连露面的机会都没有,但他们还是有机会的。

PoS中,区块已经被铸造(这里没有“挖矿”的概念,所以我们不使用这个词作为权益证明),PoW是挖矿概念性的。

这也带来了以下特点:

  • 优点:
    • 减少达成共识的时间,链上共识区块的速度更快
    • 你不再需要花费大量的精力挖矿
    • 作弊得不偿失,因为如果一个拥有51%以上股权的人作弊,就相当于欺骗了自己,因为他是股权最多的人,作弊的结果往往是他拥有的越多,失去的也越大。
  • 众多
  • 弱点:
    • 攻击成本低。只要节点拥有一定数量的元素,比如代币数量,就可以发起区块攻击脏数据
    • 此外,拥有大量代币的节点可以获得算力的概率会更高,使得网络共识被少数富豪账户所主导,从而失去公正性
  • 编写PoS代码

    为了让更多人和非围棋开发者理解,将采用以下伪代码 如需实施,请通过电子邮件留下完整的代码。

    首先我们使用一组候选块进行存储,每个节点发出一个由其当前节点创建的块对象:

    
    candidateBlocks [ ]Blocks   候选区块数组
    
    复制代码

    每个块结构有一个变量,其中用于记录创建该块的节点的节点

    type Block struct {
        Timestamp   string    // 时间戳,代表该区块的生成时间
        Hash        string    // 这个区块的 hash 值
        PrevHash    string    // 这个区块的 上一个 区块的 hash 值
        NodeAddress string    // 生成这个区块的 节点地址
        Data        string    // 区块携带的数据
    }
    复制代码

    的地址。然后是子,负责遍历候选块号来的矩阵来,根据块中的节点地址获取令牌数量,然后分配权益

    
    stakeRecord []string  // 数组
    
    for block ~ candidateBlocks {
       coinNum = getCoinBalance(block.NodeAddress) // 获取代币数量
       for i ~ coinNum {  // 币有多少,就循环添加多少次
           if stakeRecord.contains(block.NodeAddress) {  // 是否以及包含了
               break // 包含的就不再重复添加
           }
           stakeRecord = append(block.NodeAddress) // 添加
       }
    }
    
    复制代码

    中选择 活动 获胜者 。这个概率与上面的coinNum有关。越大,机会就越大。

    
    index = randInt()  // 得出一个整形随机数
    
    winner = stakeRecord[index]  // 取出胜利者节点的地址
    
    复制代码

    最后我们可以把这个winner产生的区块移出来接入公链,然后进行铸造

    
    for block ~ candidateBlocks {
        if block.NodeAddress == winner {
            // 添加
        }
    }
    
    // 广播出去
    
    ...
    
    复制代码

    上面很简单,PoS算法的代码实现机制简单地根据拥有的代币数量来分配权益。而实际上事情往往更复杂。想一想,如果我的资金分配不仅仅与筹码数量有关,对吧?这样的话就有不同类型不同的想法和版本

    比如以太坊增加了币龄。当候选人成功后,以太坊也会在这一步减去币龄。这一切都是可以改变的。我们要明白PoS的本质,才能顺心去开发自己的公链

    作者:林冠宏
    链接:https://juejin.im/post/5b95d052f265da0a914527e4
    来源:掘金 版权归作者所有。商业转载请联系作者获得许可。非商业转载请注明来源。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门