8000 RPOW · usechain/doc Wiki · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
IkarosCoCo edited this page Jun 14, 2019 · 5 revisions

RPOW

简介

当链上地址拥有真实身份后,也就意味着链上地址是稀有的。通过矿工签名构造前向相关的伪随机函数,结合移动检查点机制,保证主链安全性的同时提高了共识的效率。RPOW算法移除了算力竞争,避免资源浪费,降低了对节点性能的要求。由于一个真实身份只会对应一个挖矿地址,在保证交易性能的前提下,真正做到了“1 person 1 vote”的去中心化区块链系统。

算法概述

在介绍RPOW共识机制算法之前,我们先来看下目前主流的其他共识算法以及它们存在的问题:

  1. POW:作为 8000 特币以及很多早期区块链项目使用的共识机制,其通过算力来选出矿工的方式,在带来较高安全性的同时也造成了资源浪费以及中心化的风险。
  2. POS:通过持有的权益来选出当前区块的矿工,在一定程度上缩短了共识达成的时间,不再需要大量消耗能源去挖矿。但是同样存在中心化的问题。
  3. PBFT:拜占庭容错机制是一种采用“许可投票、少数服从多数”来选举领导者并进行记账的共识机制,该共识机制允许拜占庭容错,允许强监督节点参与,具备权限分级能力,性能更高,耗能更低,而且每轮记账都会由全网节点共同选举领导者,允许33%的节点作恶,容错率为33%。
  4. Paxos:一种传统的分布式一致性算法,是一种基于选举领导者的共识机制。领导者节点拥有绝对权限,并允许强监督节点参与,其性能高,资源消耗低。所有节点一般有线下准入机制,但选举过程中不允许有作恶节点,不具备容错性。

基于身份认证系统的基础之上,Usechain与其他公链系统最大的区别在于链上身份是稀有的,且在最理想的情况下,每一个真实有效的身份只会对应一个挖矿的主地址。通过链上身份的签名产生前向相关的伪随机数,挑选出矿工进行出块,通过身份支持进行主链的分叉裁剪。

基本算法思路

链上维护着一个矿工列表,矿工想加入列表需要先通过身份认证并且缴纳一定的押金(目前是50USE)。

  • 选取矿工:当前区块的出块者,由前一个区块的出块者的签名,前一个区块的coinbase地址,当前的区块高度以及矿工列表共同计算得到。公式如下:
Q_r=Hash([Coinbase]_(r-1) ||r||[Sig]_(r-1))
[ID_Target]_r=Q_r  mod N
  • 矿工惩罚:在分布式系统中很难保证所有节点都时刻保持在线并且正常运行,系统选举出的矿工也很可能不能正常出块。因此我们引入了矿工惩罚机制:当选出的矿工在指定时间内没有正常出块时,会累计该矿工的惩罚分,当惩罚分到达一定数量时,会暂时或永久剥夺矿工的出块权。具体规则如下: 正常情况下区块产生的间隔时间为5s,当选举出的矿工在25s之内都没有出块时,系统将重新选择矿工进行出块,公式如下:
[ID]_nλ=hash([ID_Target]_r ||nλ||[Sig]_(r-1))

且最初被选为出块者的矿工地址将累计5分惩罚分,当惩罚分达到150分之后,将被剥夺出块权直到17280个区块(大概一天)之后才能自动恢复,如果惩罚累计达到300分,则再次被剥夺出块权直到17280个区块之后才能自动恢复,如果惩罚分累计达到450分,则将永久被剥夺出块权。 且被永久惩罚的矿工在退出矿工列表时只返还一半的押金。

移动检查点机制

RPOW算法使用最长链原则来选择主链,同时为了抵抗长程攻击,我们引入了验证者投票机制。通过设置一个区块周期,暂定为10块,每经过一个周期就对目前的主链进行一次投票确认,超过1/2票数的分叉链被确认为主链,确认点之前的区块不可被篡改。

验证者节点引入,避免了攻击者在确认点之前进行长程攻击,同时任何矿工也不会在分叉点之前的分叉上继续出块。

  • 具体实现: 每隔10个区块,usechain必须产生一个“检查点”区块,该区块不打包普通交易,只会打包投票信息。在轮到出“检查点”区块时,委员会节点针对目前网络中存在的分叉进行投票,至于如何让大部分诚实节点(假设委员会超过1/2的节点是诚实的)选择同一条链呢?

首先存在的分叉链的长度必然是相等的,否则部分分叉不可能进入“检查点”投票阶段。在长度相等的条件下,投票基于以下原则:

1. 拥有第一匹配位矿工(Qr第一次匹配的矿工)数量较多的分叉,获得投票;

2. 若拥有相同的第一匹配位矿工,检查点前连续的第一匹配位矿工越多,获得投票;

3. 若还是相等,检查点前一个区块的hash最大的链,获得投票;

4. 如果未收集到半数以上的投票,则在等待5分钟之后会重新进行投票。

Clone this wiki locally
0