做者:林冠宏 / 指尖下的幽灵git
掘金:juejin.im/user/587f0d…github
GitHub : github.com/af913337456…数组
腾讯云专栏: cloud.tencent.com/developer/u…网络
BTW:本人技术书籍《区块链以太坊DApp开发实战》现已出版并可网购了,适合初中级区块链技术相关研发人员阅读。app
这篇文章是上一篇的序章,上一篇的连接地址是:post
juejin.im/post/5b78f6…(一)区块链的共识算法:总体介绍 及 分叉 的通俗讲解 区块链
本篇文章将会着重介绍
PoS
共识算法和采用代码例子来实在地阐述它ui
关于什么是共识算法
这个问题,请查看(一)区块链的共识算法:总体介绍 及 分叉 的通俗讲解 ,里面已经给出了答案。spa
PoS
全称为 Proof of Stake 股权证实
。字面意思就是,股份制。就是说,谁的股份越多,谁的话事权越大,这和咱们生活中的股份制公司
中的股东的意思的差很少的。
可是,在区块链的应用中,咱们并不可能真实地分配给链中的节点
股份,取而代之的是另一些东西,这些东西充当股份,咱们将这些东西分配给链中节点
。下面将举一些例子来加以阐述这个概念。
例如 PoS
在虚拟货币
的应用中,咱们能够把持币量的多少,来看做拥有股权、股份的多少,假设某条公链以拥有的 XXX
代币的数量来衡量,这个节点的股份有多少,它的话事权有多少。假设一个公链网络中,共有3个节点
,A 和 B 和 C,其中 A 节点拥有10000 个 XXX 代币,而 B 和 C 分别有 1000 和 2000 个,那么在这个以太坊网络中,A 的区块是最有可能被选中的,话事权是比较大的。
再例如,假设往后的某个非虚拟货币
的区块链、公有链,一条实体业结合的链,例如 汽车链
,咱们就能够把每一位车主所拥
有的车辆数目
和他的车价值多少钱
来分配股份
,例如规定一条公式:车数*车价值 = 股份的多少
,在 PoS
中股份是一个概念,一个衡量话事权的概念。
上面的描述已经说明了 PoS
共识算法的概念。由于它是以拥有某样东西的数量
来衡量
话事权的,这就意味着,只要咱们的节点,拥有这类东西,哪怕拥有的只有 一个
,都是有话事权的,即便很小,甚至都没机会露面,但它仍是有机会。
在 PoS
中,块是已经铸造好的(这里没有“挖矿”的概念,因此咱们不用这个词来证实股份),PoW
是有挖矿概念的。
这也就形成了它有下面的特色:
优势:
缺点:
脏数据的区块攻击
为了能让更多人,以及非 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
算法机制的代码实现,单纯地根据持币数量来作股权分配。而事实上
,事情每每是比较复杂的,想一想一下,若是个人股权的分配,不只仅和代币的数量有关系呢,对吧,这样的话,就能衍生各类各样的想法变种方式