(二)区块链的共识算法:PoS 及其 例子 代码 实现

作者:林冠宏 / 指尖下的幽灵

掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8

博客:http://www.cnblogs.com/linguanh/

GitHub : https://github.com/af913337456/

腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities


前序

这篇文章是上一篇的序章,上一篇的链接地址是: https://juejin.im/post/5b78f6e46fb9a019e8227162(一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解 本篇文章将会着重介绍 PoS 共识算法和采用代码例子来实在地阐述它

关于什么是共识算法这个问题,请查看(一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解 ,里面已经给出了答案。

PoS 共识算法

PoS 全称为 Proof of Stake 股权证明。字面意思就是,股份制。就是说,谁的股份越多,谁的话事权越大,这和我们生活中的股份制公司中的股东的意思的差不多的。

但是,在区块链的应用中,我们并不可能真实地分配给链中的节点股份,取而代之的是另外一些东西,这些东西充当股份,我们将这些东西分配给链中节点。下面将举一些例子来加以阐述这个概念。

例如 PoS虚拟货币的应用中,我们可以把持币量的多少,来看作拥有股权、股份的多少,现在 以太坊 ETH 中是拥有 PoS 共识机制的,所以在以太坊中,就是把各个以太坊节点 所拥有的 ETH 代币的数量来衡量,这个节点的股份有多少,它的话事权有多少。假设一个以太坊网络,共有3个节点,A 和 B 和 C,其中 A 节点拥有10000 个 ETH 代币,而 B 和 C 分别有 1000 和 2000 个,那么在这个以太坊网络中,A 的区块是最有可能被选中的,话事权是比较大的。

再例如,假设日后的某个非虚拟货币的区块链、公有链,一条实体业结合的链,例如 汽车链,我们就可以把每一位车主所拥有的车辆数目他的车价值多少钱来分配股份,例如规定一条公式:车数*车价值 = 股份的多少,在 PoS 中股份是一个概念,一个衡量话事权的概念。

PoS 的特点

上面的描述已经说明了 PoS 共识算法的概念。因为它是以拥有某样东西的数量衡量话事权的,这就意味着,只要我们的节点,拥有这类东西,例如 ETH 代币,哪怕拥有的只有 一个,都是有话事权的,即使很小,甚至都没机会露面,但它还是有机会。

PoS 中,块是已经铸造好的(这里没有“挖矿”的概念,所以我们不用这个词来证明股份),PoW 是有挖矿概念的。

这也就造成了它有下面的特点:

  • 优点:
    • 缩短了共识达成的时间,链中共识块的速度更快
    • 不再需要大量消耗能源挖矿
    • 作弊得不尝失,因为如果一名持有 51% 以上股权的人作弊,相当于他坑了自己,因为他是拥有股权最多的人,作弊导致的结果往往是拥有着越多的损失越多
  • 缺点:
    • 攻击成本低,只有节点有物品数量,例如代币数量,就能发起脏数据的区块攻击
    • 另外拥有代币数量大的节点获得记账权的概率会更大,会使得网络共识受少数富裕账户支配,从而失去公正性

编写 PoS 代码

为了能让更多人,以及非 go 开发者能看懂,下面将通过 伪代码 来实现,完整的 go 代码请留邮箱。

首先我们使用一个候选区块数组来保存,每一个 节点 广播过来的和自己当前节点生成的区块对象:

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) // 添加
   }
}

然后从 stakeRecord选出一个竞选胜利者。这个概率就和上面的 coinNum 有关,越大就越有机会。

index = randInt()  // 得出一个整形随机数

winner = stakeRecord[index]  // 取出胜利者节点的地址

最后,我们就能取出这个 winner 所生成的区块来进行公链的接入,然后广播出去

for block ~ candidateBlocks {
    if block.NodeAddress == winner {
        // 添加
    }
}

// 广播出去

...

以上,就是一个很简单的, PoS 算法机制的代码实现,单纯地根据持币数量来做股权分配。而事实上,事情往往是比较复杂的,想想一下,如果我的股权的分配,不仅仅和代币的数量有关系呢,对吧,这样的话,就能衍生各种各样的想法变种方式

例如以太坊加入了币龄,在候选成功后,以太坊在这个步骤还会扣除币龄。种种的这些,都是可以变的,我们要理解 PoS 的精髓,才能在开发自己的公有链的时候,随心而行

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒信息

应对黑客的进攻——浅谈数字货币安全问题

摘要:随着智能合约飞速发展,越来越多的项目基于以太坊发行token,链上资产的类别和规模呈指数级增长,“虚拟世界”中的数字资产也点燃了黑客们的“热情”。以太坊区...

8930
来自专栏崔庆才的专栏

区块链入门教程

区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。 ...

35840
来自专栏飞总聊IT

比特币和区块链(2):比特币中区块链的实现

0 上一篇我们讨论电子货币的时候提出了由一个寡头负责对所有人的电子货币和交易进行记账,记录到只能增加不可修改的账本里,并且把账本公开给所有的人看的这样一个电子货...

361130
来自专栏Netkiller

区块链·理解分布式记账

中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

548130
来自专栏企鹅号快讯

比特币与区块链技术详解

最近比特币的价格大幅降低,区块链的热度同时在不断的增加。因此现在应该是聊聊这两个“奇怪生物”背后技术的好时机了。 我们先看看比特币的价格变化图: ? 图1. 从...

21660
来自专栏区块链大本营

区块链构架就是造房子!10分钟带你走遍构建全程

2008年,一个叫做中本聪(Satoshi Nakamoto)的人(或团体)定义了第一个区块链。

10920
来自专栏BestSDK

从生产到交易,一文读懂比钻石还贵的“比特币”

以物易物的比特村 话说在这个世界上,有一个叫比特村的小村庄,村庄共有几百户人家。这个村庄几乎与世隔绝,过着自给自足的生活。由于没有大规模贸易,比特村村民一直过着...

33780
来自专栏区块链入门

第十七课 【ERC721实践】迷恋猫从玩耍到开发

玩迷恋猫游戏,玩家需要在以太坊区块链上下载到这款游戏的APP,游戏开始系统会赠送玩家一只喵。刚推出时是送猫的,现在只有活动时才赠送。它让你沉迷于吸猫,然后当你无...

17440
来自专栏阮一峰的网络日志

区块链入门教程

区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。 可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。...

39050
来自专栏企鹅号快讯

虾说区块链-57-《精通比特币》笔记十二

一直在说区块链是一系列技术结合后的新的技术架构,那么这里分别介绍下这些相关技术,也涉及到一些扩展开去的相关内容。 ? 区块链-《精通比特币》笔记十二: 2018...

230100

扫码关注云+社区

领取腾讯云代金券