周六看了几遍Silvio Micali的论文Byzantine Agreement,Made Trivial
, 理解上比以前深刻了一些。今天准备把论文叙述一遍,不会一字一句翻译,基本是自己的理解。文字记录下来理解会更深一点, 也做为接下来和守敬老师讨论的基础。
拜占庭共识在几十年间已经吸引了众多前辈投入研究, 本论文提供了一种简单可操作的拜占庭共识协议, 容错率大概在33%(1/3), 在可预期的9轮(round)之内全网节点可以达成共识。
n>=3t+1>=3
后续文中拜占庭共识用 BA代替。
论文描述的BA会使用两个工具:
接下来我们要对弈的是这样一个对手(adversary):
对手的能力:
ps: 如果不太了解BA,可能对receive和send的具体含义不太理解,下面协议描述中会有说明。
定义若干变量:
我的以为: 原论文中的soundness应该不是概率,是?
定义两条规则:
如果诚实节点i初始化值v(i)=v, 则诚实节点j的out(j)=v
定义几个标示符号:
Dolev and Strong[4]第一次提出了容错50%的BA 协议; Katz and Koo[10]接下来也提出了容错50%,且在有限轮数内全网可以到达共识的BA协议。他们的协议很完善但是太过复杂,可操作性比较低。
基于本论文的BBA*, Vinod Vaikuntanathan 和作者一起发现了容错在50%的协议方法, 后续会写出来, 本论文描述的还是容错33%的协议。
本论文基于二进制数值达成共识(0 或 1), 定义b(i)为节点i的初始化二进制数值。
下面是三个演化过程:
节点i更新自己的b(i)按照如下规则:
Ps: 诚实节点个数>=2t+1; 诚实节点出现的概率: 2/3.
下面快速分析三点:
上述三点不难理解, 对于第二点概率1/2的原因, 我个人认为因为共识数值集合是{0,1}, 所以概率是50%.
//TODO: 未完全领会,稍后补充
接下来抛开天空给我们的帮助,通过规则构造具体的c(r):
确定的随机值(0 或 1)的构造方式:
问题: 每轮协议执行之后,全网达到共识的概率是 1/3.
解决办法:
方法2: 规则改进,拆分为3步循环:
详细描述和证明过程如下:
过程描述:
Step1:
Step2:
Step3:
三点证明:
假设最小节点(lsb(H(v(m))))节点m是诚实节点, 全网通过节点m的签名消息可以唯一确定c(r).
最小节点是诚实节点的概率是: 2/3(这个比较明显,因为n>=3t+1,所以诚实节点数>=2t+1).
对于Step3的三个小步: 3.1, 3.2, 3.3会出现5种情况:
很显然,不可能出现 部分节点满足3.1,其余满足3.2的情况。
对于情景1~3, 节点在Step3结束时达成共识的概率都为1.
对于情景4和情景5, 着重说明一下:
综上, 5种场景在Step3结束时达成共识的概率最小为1/2, 而节点m是诚实节点的概率是2/3,所以Step3结束时有(1/2*2/3=1/3)的概率达成共识。
我的疑问: 和m是否为诚实节点有什么关系呢? lsb(H(v(m)))为0或1对于m是否为诚实节点无关吧? 所以A的概率应该为1/2 ?
----
假设在某个Step的开始对b达成了共识, 则所有诚实节点(>=2t+1)都会广播这个b, 所以#(b)>=2t+1对所有诚实节点都是成立的, 后续协议执行并不会改变b。
这个比较好理解,不用过多说明。
----
诚实节点数>=2t+1, 作恶节点数<=t
以Step0为例, 如果某节点满足#(0)>=2t+1而退出了循环则说明至少有 t+1个诚实节点在Step0开始前全网广播了0。
对于其余节点j有两种情况:
#(0)>=2t+1
(满足了退出循环条件且达成共识)t+1<=#(0)<2t+1
//TODO: 未完全领会,后续补充...
参见附录[5]的论文.
论文中两部分没有完全吃透,后续找时间更新:
2017-01-07