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

掘金: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. django实战模拟博客系统

    数据库代码块 from django.db import models from django.utils import timezone from django.contrib.auth.model ...

  2. Linux命令第二篇

    作业二: 1)   在用户的主目录下创建目录test,进入test创建空文件file1 # ls /home/test file 2)   以长格式形式显示文件信息,注意文件的权限和所属用户和组 # ...

  3. python基础介绍二

    一.python种类 1.1 Cpython python官方版本,使用c语言实现,运行机制:先编译,py(源码文件)->pyc(字节码文件),最终执行时先将字节码转换成机器码,然后交给cpu执 ...

  4. jitwatch查看JIT后的汇编码

    1.下载Apache Maven 3.5.3 http://maven.apache.org/download.cgi apache-maven-3.5.3-bin.zip 解压为C:\maven3 ...

  5. jquery-网站收藏

    jquery跑马灯:http://www.dowebok.com/demo/188/index3.html

  6. Hadoop的启动和停止说明

    Hadoop的启动和停止说明   sbin/start-all.sh 启动所有的Hadoop守护进程.包括NameNode. Secondary NameNode.DataNode.ResourceM ...

  7. 批处理文件 bat 后台运行

    当运行 批处理文件bat 时 , 会有一个黑窗口显示 , 对于不懂的人来说, 还是很吓人的;  有两种办法,可以让bat后台运行,不出现黑窗口   第一种解决办法(推荐) : 在你写的批处理文件,开头 ...

  8. 【jquery采坑】Ajax配合form的submit提交(微擎表单提交,ajax验证,submit提交)

    1.采坑:实现form的submit提交,在提交之前,进行ajax的不同校验,然后onsubmit=return check(),进行提交 1/1 目的:可以实现以 from的submit提交,然后还 ...

  9. android构建过程

    参考: http://blog.csdn.net/shangmingchao/article/details/47375111 首先,需要了解一下构建APK的七大工具: ①aapt 全称是Androi ...

  10. vue前端知识点整理

    1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter, ...