常用共识算法

Proof of Work

给予一个随机数,在其前面补齐N位0,然后首个求出一个解使得hash之后等于这个值的矿工将获得这个新增区块的记账权,同时给予该矿工一定的奖励。

Proof of Stake

获得下一个区块记账权的概率随着拥有的代币的数量和时间增长而增长,同时根据持有的代币来返还利息。

Delegated Proof of Stake

通过投票产生代表,获得投票数前100位的代表按照既定顺序轮流产生区块,且每个代表的投票权都是相等的;

Pratical Byzentine Fault Torerence

假设f为拜占庭错误节点的个数,那么最少节点为2f + 1
一个共识的过程具体如下:

  1. 客户端向leader发送一个请求,leader负责把该请求通过一次pre-prepare请求广播到所有的节点上,并附上本次请求的序列号n和当前的视图v;
  2. 所有节点收到 2f + 1个pre-prepare请求并验证无误,则向所有节点广播prepare请求;
  3. 所有节点收到 2f + 1个prepare请求并验证无误,则向所有节点广播commit请求;
  4. 所有节点收到 2f + 1 个commit请求并验证无误,则执行客户端发送过来的请求,并向客户端返回执行结果;
  5. 客户端收到 2f + 1个执行结果时,则表示该请求执行成功

Paxos

(适用于非拜占庭模型,即可信环境)
参考Paxos Made Simple
prepare 阶段

  • proposer发出一个带有序号为n的proposal的prepare请求;
  • acceptor收到该prepare请求,若已响应过序号大于n的prepare请求,则拒绝;若没有则响应该prepare请求并承诺不再接受其他序号小于n的prepare请求,且当曾经响应过序号小于n的prepare请求(值为v),顺带返回序号最大的v做为本次的共识value;

accept 阶段

  • proposer收到acceptor对其prepare请求的响应,选其返回的value做为共识的value(若没有则任选);向acceptor发出accepte请求,带上其序列号n和值v
  • acceptor收到一个序号为n的accept请求,若没有收到其他prepare请求序号大于n,则接受该accept请求。

Raft

演示
论文
raft算法可以分成三个部分来理解:

  • Leader选举
    每个节点分别有三种状态:leader, candidate 和 follower。当集群中不存在leader时,follower会将自己变更成leader进行一轮选举,选举成功的则为leader。
  • 日志复制
    leader收到客户端传来的指令时,负责把该指令复制到所有follower节点上
  • Safety
  1. 被选举权限制
    只有与集群中大部分的节点同样’up-to-date’的candidate,才能获得选票;此外还保证了日志只会单向的从leader到follower,简化了复杂度;
  2. 拒绝提交遗留entry
    一个新的leader不会因为大部分节点包含了某个来自于上个term的entry而对其进行提交;

raft的特性:

  • 在一个任期(term)内最多只能有一个leader;
  • leader不会覆盖或者删除在其log中的entries;只会新增;
  • 在两个节点的log中,如果存在一个entry,他们的序号(index)和任期都相等,那么在这个index之前的所有log都是相同的;
  • 如果一个entry在term n 内已经被提交(committed),那么n+1 term的leader都会有该entry;
  • 如果一个节点在index i 已经把entry提交,那么不会存在另外一个节点在同样的index i 提交了不同的entry