5. 如果牧师p 收到Q 中每个牧师q 发来的赞成票Vote(b,q) , 则将法律d 写入他的账目中 , 并向所有q发送Success(d) 消息 。
6. 收到Success(d) 消息后 , 牧师q 将法律d 写入到自己的账目中 。

文章插图
说明:第一步表示发起法律的牧师p 希望下一个选举的编号是b。牧师q 用LastVote(b,v) 回应了牧师p 的请求 , 也就是向牧师p 通过法律时保证了v=MaxVote(b,q,B) 的被改变 , 具体来说就是不在b 和b_bal 之间的选举投赞成票 。
第三步要求法律d 需要满足B3 , 这里我开始有点迷糊 , 实际系统中的值是客户端决定的 , 而不应该是B3 决定的 。这里我们还是用上面的key-value 数据库的例子来理清下思路:当某个节点/牧师第一次发起更新前相当于B为空集 , 发起更新/选举的操作不断进行 , 直至所有法定人数(quorum)都对法律投了赞成票(即majority set 的节点都更新了该key-value 的值则认为更新成功) , B3对应的就是之前的更新没有成功 , 那么新的选举值需要保持的情况 。第四步允许牧师可以不发送Vote(b,q) 或者发送几次 , 对应的是发送的信息可能因为通信而失败而未发送或者被多次发送 。一旦牧师投了赞成票则确认可以修改该值 。
考虑到最后第六步法律d 才被牧师q 写入到账目 , 有可能出现的情况就是在第五步的时候牧师p 将法律写入到了自己账目中 , 接着发送Success(d) 给其他牧师 , 其中因为通信或者牧师离开议会大厅而没有被写入到自己的账目中 , 导致不一致 。所以真正写入到账目时机应该是在第四步牧师q 在发送给牧师p 赞成票的同时就法律写入到了各自账目中 。而不用考虑如何保证牧师q 第四步写入的法律会导致不一致 , 因为法律如果没有通过则还有更多的选举来保证一致性 。后面也谈到了当法律第一次别写入到账目中算通过法律 。
基础协议
初始协议(Preliminary Protocol)要求每个牧师都保存 (i) 他发起的每个选举; (ii) 他投的每个赞成票; (iii) 他发送的每个$LastVote$ 。为了简化牧师需要保存的数据 , 我们对上面的协议做一个限制 , 得到基础(Basic Protocol)协议 。首先介绍三个新的参数:
lastTried[p] 牧师p 发起的最后一个选举
prevVote[p] 牧师p 最近一次的投票
nextBal[p] 收到的选举编号的b 的最大值 , 即牧师p参加的最大选举编号
在初始协议中 , 每个牧师可以同时发起任意个选举 , 在基础协议中要求每个牧师只能发起一个选举lastTried[p] , 一旦发起一个选举 , 那么之前发起选举的信息就都不重要了 。在初始协议中要求每个牧师不能在b_bal 和b 之间投赞成票 , 在基础协议中则更严格地要求不能给小于b 的选举投赞成票 。那么基础协议可以概述为下面几步:
1. 牧师p 选择一个大于lastTried[p] 的选举编号b , 发送NextBallot(b)给其他牧师
2. 牧师q 收到NextBallot(b) 且b>nextBal[q]后设置nextBal[q]=b , 接着发送LastVote(b,v) 给牧师p , 其中v==prevBa[q]。(如果b 小于或等于nextBal[q] , 则不回复)
3. 从满足某个大部分集合Q 中每个牧师收到了LastVote(b,v) 信息 , 牧师p 发起一个编号为b , 法定人数为Q , 法律为d(满足B3 )的选举 , 并将BeginBallot(b,d) 发送给Q 中每个牧师 。(如果没有满足任意大部分集合Q 的牧师返回 , 则返回第一步)
4. 牧师q 收到BeginBallot(b,d) , 决定投赞成票 , 设置prevVote[p] 为这次投票 , 并发送Vote(b,q) 给牧师p 。(如果在收到BeginBallot(b,d) 后发现b 不等于nextBal[q] 则忽略这条信息 , 说明这期间牧师q 还收到了其他的编号更大的选举)
5. 牧师p 从大部分集合Q 中每个牧师q 收到了Voted(b,d) , 且b==lastTried[p] , 则认为这次选举成功 , 将法律d 记录在账目中 , 并向Q 中每个牧师q 发功成功消息Success(d)。
6. 每个牧师q 收到Success(d) 消息后将法律写入账目 。
基础协议是初始协议的限制版 , 因为两者都对牧师没有行为要求 , 所以也不保证过程(QS) 。下面介绍一个保证过程的协议— 完整议会协议(complete Synode protocol) 。
完整议会协议
推荐阅读
- 心居|DNF:原来红狗的由来那么奇葩,这是被策划恶搞了?太好笑了
- 网购|大学女老师网购一条裤子 然后3小时被骗24万
- 路虎|违停路虎被出警消防车撞烂!车主:我全责 不用赔
- 梦见被蛇咬左手出血是什么意思 昨晚梦见蛇咬我右手出血了
- 梦见家里被盗了到处一片乱糟糟 梦见房子进小偷了一团乱
- 梦见自己被别人威胁是什么意思 做梦梦见被他人威胁是怎么回事?
- 北京楼市:这些郊区不要投资,价格不涨还被套
- 被蚊子咬了,除了忍还有什么好的止痒办法?
- 梦见石头掉下来差点砸到自己 梦见差点被落石砸中
- 今年春节能离开武汉回家过年吗2022,武汉春节回老家会被管控吗
