PBFT

HydraChain Consensus
Tendermint Byzantine Consensus Algorithm

HydraChain BFT

HydraChain的共识是一种拜占庭容错协议,用于协调关于区块链系统事务顺序的共识。

特点

  • 最后,没有状态重组
  • 正常运行时低开销

协议依赖于一组验证者,其中不超过1/3的验证者必须是拜占庭式的。

在每个区块的高度,一个或多个回合被用来商定一个提议区块的高度。区块的每个高度和回合的提议者是从验证者集合中选择的确定的轮询器。新回合只能启动一次+2/3的节点在最后一回合投票中投票,这使得分布式系统保持同步。

正常运行的开销很低,因为提议的区块在最后高度的区块上有法定数量的签名。

propose H -> commit H-1 -> vote H

符号

  • HR:区块高度,回合
  • B:区块
  • +1/n:超过1/n的投票

回合

  • 序列propose H -> vote H称为一个回合R
  • 在一个给定高度可能有多余一个回合
  • 超时没有收到投票则投上次的票或者表明超时

投票/锁
投票是验证者发送的签名消息,验证者的签名为:(H, R, [B])

两种投票:

  • Lock(H, R, B):验证者对锁定在H,R中的区块的投票
  • NotLocked(H, R):验证者没有锁定在H中的区块并承诺不锁定H,R

验证者每回合都会发送他们的投票(必须发送一次投票),或者是响应提议者(Lock)的消息,或者是超时(NotLocked或Lock)。

LockSet(R)
LockSet(R):至少+2/3的合格投票的集合。
每个验证者都根据收到的投票收集自己的LockSet。一个有效的LockSet必须包含+2/3的合格投票。投票可以锁定在一个区块上,也可以不锁定(在超时的情况下)。有效的LockSet允许节点进入下一回合。

三种LockSet:

  • Quorum:有超过2/3对同一个区块的合格投票
  • QuorumPossible:有超过1/3对同一个区块的合格投票
  • NoQuorum:有最多1/3对同一区块的合格投票

VoteInstruction(R, B)

R>R0的提议包括一个QuorumPossible(R-1)以及至少一个非拜占庭投票。

共识协议

为了就区块链的下一个高度达成一致,将运行基于回合的协议来确定下一个区块。每一回合至少由两步组成(提议和投票)。

如果一个提议区块存在一个Quroum则意味着回合成功

在正常操作中,一个验证者在区块高度H的步骤如下:

  1. 收到提议B(H,R0)包括在B(H-1,R)Quorum
  2. 提交B(H-1, R)
  3. 投票B(H,R0)

注意:H-1的提交是隐含的,因为H中的提议必须包含H-1上的区块的Quorum。

由于节点也需要维护自己的LockSet,它们可以在看到Quorum之后立即提交。这通常是在它们收到关于新区块高度的提议之前。因此,大多数时候的顺序看起来是这样的:

  1. 接收提议B(H,R0)
  2. 投票B(H,R0)
  3. 截获Quorum B(H, R0)
  4. 提交B(H,R0)

这个异步提交是安全的,因为如果曾经有一个Quorum-LockSet,提交者至少已经学会(并且必须包括)一个QuorumPossible,这将导致对该区块的共识。

为了避免对相互冲突的提议投赞成票,每回合投票中合格的选民在发送投票以后被锁定,即:

  • Locked(H, R, B):如果对一个区块进行了投票
  • NotLocked(H, R):如果没有在一个区块上投票

只要一个节点被锁定,它就不能在H上为另一个区块投票。只有节点为一个不同的区块(像下面描述的情况)投票时,它才被允许解锁。

  • 它处于NotLocked(也就是说,它没有看到有效的提案,并且在上一轮投票中超时)
  • 它接收到VoteInstruction(超过1/3的节点被锁在不同区块)

节点必须在每一回合投票中投票(例如重复旧的投票,但在新一回合中签名)

如果指定提议者有一个LockSet(R-1) 并不是Quorum,则必须

  • NoQuorum:提议一个新区块
  • QuorumPossible:广播一条引用区块的VoteInstruction消息

在这两种情况下,消息都包含LockSet(R-1),它允许节点最终解锁并再次投票(在R中提议的区块上或在R-n中提议并指示在R中投票)

NewRound(H, R)

如果一个节点在R中收到并投票赞成一个有效的提案,或者在R中收到+2/3的投票时,那么该节点就会进入到下一回合R+1。更高的回合有更高的超时,timeout(R) = t_base * t_inc ^ R

Propose(H, R)

H,R处的block的提议者是从验证者集合中选择的轮询器。只有一个验证者必须在H,R上指定一个区块。
提议者必须在R-1中获得至少2/3的投票,才能有一个有效的LockSet(R-1)
如果是QuorumPossible,那么提议者广播一个VoteInstruction(R, B)指令。

否则,它会广播一个新的提案,如果它知道是Quorum,就会广播一个新的区块高度。

H,R0的有效新提案是区块表示为:

  • block H-1包含一个Quorum-LockSet
  • 描述一个H-1 > H的有效状态变化

H, R > R0的有效新提案是另外的区块:

  • 包括一个NoQuorum(R-1)

提议会尽快被广播,因为在最后一回合投票中,可以是下面任何一个LockSet:

  • Quorum:共识 ->广播新区块B(H, R0)
  • NoQuorum:最多只有1/3的选票锁定在同一个block上 -> 广播新区块B(H, R)
  • QuorumPossible:超过1/3的投票锁定在区块B(H, Rn < R)上 -> 广播VoteInstruction B(H, Rn < R)

Commit(H, R)

当节点第一次得知Quorum(H,R)时,进入Commit回合。这可以通过在提案中获得一个LockSet,或者通过在其本地LockSet收集足够的投票来实现。

如果区块的父区块未知,节点进入同步模式并请求丢失的区块。

如果父区块可用:

  • Commit引用Quorum的区块
  • unlock
  • 隐式移动到新的区块高度H+1

On Timeout(H, R)

  • 验证者在前一个回合被锁定在区块B,广播Lock(H, R, B)
  • 验证者未被锁定,广播NotLocked(H, R)
  • 当前高度timeout增加

Vote(H, R)

案例:验证者从H,R收到合法提议

  • 如果被锁定在一个区块:解锁
  • 将新提议锁定
  • 广播一个新的Lock(H, R, B)

案例:验证者从H, R收到非法提议

  • 如果被锁住,广播Locked(H, R, B)
  • 如果没被锁住,广播NotLocked(H, R)

案例:验证者收到一个合法的VoteInstruction(H, R, B)

  • 如果被锁定在一个区块:解锁
  • 从VoteInstruction锁定B
  • 广播Lock(H, R, B)

有效的Proposals/VoteInstructions必须由H,R指定提议者签署。它们必须为R>0提供一个有效的LockSet(R-1)

在投票之前,验证所提议区块的状态转换。

无效的提议被忽略。

Tendermint PBFT

Byzantine Consensus Algorithm

状态机的状态:NewHeightProposePrevotePrecommit,和Commit

在区块链的每个高度处,运行基于回合的协议以确定下一个区块。

每一个回合:

  • 三个基本步骤:ProposePrevotePrecommit
  • 两个特殊步骤:CommitNewHeight

在最佳方案中,步骤顺序为:

NewHeight -> (Propose -> Prevote -> Precommit)+ -> Commit -> NewHeight ->...

(Propose -> Prevote -> Precommit)被称为一个回合。

每一个区块高度可能需要不止一个回合,原因:

  • 指定提议者不在线
  • 指定提议者提议的区块无效
  • 指定提议者提议的区块没有及时广播
  • 提议的区块有效,但当到达Precommit步骤时,没有及时收到超过2/3的prevotes
  • 提议的区块有效,并且接收到足够的+2/3的prevotes,但是验证者节点没有收到超过2/3的precommit

状态机图:

                         +-------------------------------------+
                         v                                     |(Wait til `CommmitTime+timeoutCommit`)
                   +-----------+                         +-----+-----+
      +----------> |  Propose  +--------------+          | NewHeight |
      |            +-----------+              |          +-----------+
      |                                       |                ^
      |(Else, after timeoutPrecommit)         v                |
+-----+-----+                           +-----------+          |
| Precommit |  <------------------------+  Prevote  |          |
+-----+-----+                           +-----------+          |
      |(When +2/3 Precommits for block found)                  |
      v                                                        |
+--------------------------------------------------------------------+
|  Commit                                                            |
|                                                                    |
|  * Set CommitTime = now;                                           |
|  * Wait for block, then stage/save/commit block;                   |
+--------------------------------------------------------------------+

状态机说明:

Propose Step (height:H,round:R)
进入Propose:

  • 指定节点在(H, R)提议一个区块

结束propose:

  • 进入Propose的timeoutProposeR后 --> 进入Prevote(H,R)
  • 接收到提议的区块之后,在PoLC-Round进行所有prevotes --> 进入Prevote(H,R)
  • 常见退出条件

Prevote Step (height:H,round:R)

进入Prevote,每个验证者广播它的prevote投票:

  • 首先,如果从LastLockRound开始验证者就锁定在一个区块上,但是现在在PoLC- round回合上有一个PoLC,在那里LastLockRound < PoLC- round < R,然后它就会解锁。
  • 如果验证者仍然锁定在一个区块上,那么执行prevotes
  • 否则,如果Propose(H,R)提议的区块是好的,那就prevotes
  • 否则,如果提案无效或没有按时收到,它将prevotes <nil>

结束Prevote:

  • 对一个区块超过2/3的prevote或者nil,进入Precommit(H,R)
  • 接收到超过2/3的prevote时timeoutPrevote,进入Precommit(H,R)。
  • 常见退出条件

Precommit Step (height:H,round:R)

进入Precommit,每个验证者广播它的Precommit投票

  • 如果验证者对某一个区块在H,BPoLC,那么锁定区块B,设置LastLockRound = R。
  • 如果验证者在H,BPoLC<nil>,解锁它并precommits <nil>
  • 否则保持锁定提交precommits <nil>

对于<nil>Precommit 意味着“我在这一轮没有看到PoLC,但我确实得到了+2/3的prevotes,并等待了一会儿”。

结束Precommit:

  • 超过2/3的precommit为空,进入Propose(H,R+1)
  • 接收到2/3的precommit的timeoutPrecommit,进入Propose(H,R+1)
  • 常见退出条件

常见退出条件

  • 对一个区块有+2/3的precommits,进入commit(H)
  • 在(H,R+x)接收到+2/3的prevotes,进入Prevote(H,R+x)
  • 在(H,R+x)接收到+2/3的precommits,进入Precommit(H,R+x)

Commit Step (height:H)

  1. 设置CommitTime = now()
  2. 接收到新区块,进入NewHeight(H+1)

NewHeight Step (height:H)

  1. 从PreCommits转到LastCommit,增加高度
  2. 设置StartTime = CommitTime+timeoutCommit
  3. deng
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容

  • 巍峨的大山连绵起伏,参天树木郁郁葱葱,一个僻静的小小村庄便坐落在这大山窝子里。 中午时,几家的屋顶上...
    祝叶阅读 1,415评论 0 2
  • 下雪啦 今天下了可能是狗年的最后一场雪,雪下=的非常魔幻,一条路总感觉走不到头,感觉就像在梦里,...
    AaronCxh阅读 173评论 0 1
  • 本章为作者的成长体验自述,字里行间体会到作者人格慢慢丰满而圆润起来,最后达到了东西贯通的哲学,老子的无为而治,在这...
    郑小p阅读 110评论 0 0
  • 近来读《傅雷家书》,感慨颇多。 文中拳拳爱子之心,化严厉为絮语,句句真挚,封封感人。如果不加背...
    嫩寒锁梦696阅读 1,356评论 0 1