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

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

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

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

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


目录

  • 前序
  • PoS 共识算法
  • PoS 的特点
  • 编写 PoS 代码
    • 候选块数组
    • 块中的节点地址
    • 进行股权分配
    • 根据股权选出赢家
    • 结束

前序

这篇文章是上一篇的序章,上一篇的链接地址是:

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 的精髓,才能在开发自己的公有链的时候,随心而行

(二)区块链的共识算法:PoS 及其 例子 代码 实现的更多相关文章

  1. 老K漫谈区块链的共识(3)——分布式系统和区块链共识

    1. 啥是分布式系统 当我们评价一个新的事物或者介绍一个新的技术的时候,我们不能架空历史和环境,新的事物不可能脱离历史和环境凭空诞生.任何新的事物和新的技术总是或多或少的,与旧的事件以及过去的技术有所 ...

  2. 老K漫谈区块链的共识(1)——免信任的共识机制

    老k,柏链道捷CTO.清华阿尔山区块链研究中心高级工程师,超过17年的系统软件开发经验,在操作系统.编译器.虚拟机和符号执行方面都有实战经验.主持开发多个开眼项目,目前主要从事区块链底层系统开发工作. ...

  3. [区块链] 加密算法——Hash算法(进阶)

    为了为保证存储于区块链中的信息的安全与完整,区块链中使用了包含密码哈希函数和椭圆曲线公钥密码技术在内的大量的现代密码学技术,同时,这些密码学技术也被用于设计基于工作量证明的共识算法并识别用户. 在前边 ...

  4. 共识算法 pos,Dpos

    在之前讲解了比特币中的共识算法pow(proot of work),我们先来简单的回顾一下. 新的交易将会广播给所有节点. 每个节点将都会讲新的交易收集到一个区块中. 每个节点都在为其区块收集困难的工 ...

  5. 区块链--Bitcoin共识机制

    目录 中心化和去中心化 比特币共识机制 拜占庭将军共识机制 比特币成功解决了拜占庭问题 中心化和去中心化 中心化模式: 优点:效率高 缺点:中间层次太多(组织层次连接) 去中心化模式: 缺点:效率低 ...

  6. 只用120行Java代码写一个自己的区块链-3挖矿算法

    在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...

  7. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述

    共识算法 区块链中最重要的便是共识算法,比特币使用的是POS(Proof of Work,工作量证明),以太币使用的是POS(Proof of Stake,股权证明)使得算理便的不怎么重要了,而今PO ...

  8. Bystack的高TPS共识算法

    共识算法是分布式系统保证节点数据状态一致性的方法,在区块链的共识算法分POW(工作量证明)和POS(权益证明)两大类.第一类POW模式是在公链项目中运用的最广泛应用的共识算法,比特币长达10年的运行已 ...

  9. 分布式共识算法 (四) BTF算法(区块链使用)

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 前面介绍的算法,无论是 Paxos ...

随机推荐

  1. Centos7——NFS(Network File System)服务

    NFS(Network File System)即网络文件系统,允许计算机之间通过网络共享资源:在NFS客户端即可NFS服务端所共享的目录挂载到本地,此时即可像读写本地目录一样读写远程计算机的目录与文 ...

  2. 2018-8-16JWTtoken用户登录认证思路分析9502751

    2018-8-16JWTtoken用户登录认证思路分析9502751 JWT token在商城中的实现 class UserView(CreateAPIView): serializer_class ...

  3. db2 load报文件系统满

    使用db2 load导入数据 数据量比较大时常常会报文件系统已满错误. 原因分析:导入表建有索引,在load的“索引复制”阶段会从系统临时表空间拷贝到目标表空间,导致系统临时表空间所在的文件系统满,l ...

  4. Vue(二十一)使用express模拟接口数据

    1.下载express ... 2.使用vue-cli下载好项目文件 ... 3.找到文件 build - webpack.dev.conf.js 'use strict' const utils = ...

  5. ASCII到Unicode到UTF-8

    1.很久以前使用的是ASCII:只有一个字节,也就是2的8次方,可以表示256个不同状态,电脑最初起源于美国,够用了,刚开始只是使用了127位,后来后面的部分被他们用来表示一些横线字符之类的128-2 ...

  6. REST风格的增删改查(1)

    一.RESTFUL风格的CRUD(增删改查)案例 1.需求: ①显示所有员工信息:URI:emps,请求方式:GET ②添加员工所有信息:显示添加页面:URI:emp,请求方式:GET, 添加员工信息 ...

  7. 问题8:手机端实现点击按钮时更换颜色(解决IOS不显示背景)

    CSS: .sval:active, .sval:focus{ background: #999;color:#fff;opacity:50; } 在触屏上,:hover和:active也不是直接就起 ...

  8. pygame-KidsCanCode系列jumpy-part5-屏幕滚动

    接上回继续,方块不断向上跳动的过程中,从视觉上看,整个背景屏幕应该不断向下滚动,而且上方要不断出现新档板(否则就没办法继续向上跳了),这节我们将来实现这种效果,感觉好象很复杂,但实现起来其实很简单,只 ...

  9. 阿里云ACE深圳同城会 开始报名

    大家好,阿里云 ACE深圳同城会本周末第一活动,主要大家一起聚聚,互相认识和熟悉,未来一起玩儿一起进步~ 通知大家一个好消息,当前凡是加入深圳ACE同城会组织(群)的朋友,通过跟群主报名申请,将有机会 ...

  10. 【经典】5种IO模型 | IO多路复用

    上篇回顾:静态服务器+压测 3.2.概念篇 1.同步与异步 同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成. 异步是指不需要等待被依赖的任务完成,只是通 ...