The Science of the Blockchain笔记(三)

拜占庭协定

  如同飞机上的传感器,系统一个节点即使崩溃也不会立即停止工作,他们有时会呈现出一种不稳定的状态,行为表现为一种随机的状态。我们称一个可能呈现任意行为的节点为拜占庭(Byzantine),该节点的表现包括以下形式:

  1. 根本不发送任何消息
  2. 向不同邻居发送不同且错误的消息
  3. 谎报自己的输入值

  我们将一个存在拜占庭节点的系统中达成的共识(详见The Science of the Blockchain笔记二)称为拜占庭协定。该系统中所有非拜占庭节点称为好节点(correct nodes),如果一个算法可以在存在f个拜占庭节点的情况下正确工作,则称该算法为 f-可适用(f - resilient)

  根据上章对共识的定义我们可以发现在拜占庭协定中一致性(Agreement)和可终止性(Termination)显然成立,下面来介绍有效性(Validity)如何保证。

有效性

  定义 4.3(任何输入有效性 Any-Input Validity) 最终的决策值必须是某个节点的输入值。

  定义 4.4(正确输入有效性 Correct-Input Validity) 决策值必须是某个好节点的输入值。

  在一个存在拜占庭节点的系统,实现正确输入有效性并不容易,因为一个拜占庭节点可以遵守协议,但是如果谎报它的输入值,此时无法将其与一个好节点进行区分。于是我们需要一个新的定义来替代它。

  定义 4.5(全部相同有效性 All-Same Validity) 如果所有好节点起始时具有相同的输入值 v,则决策值也必须是 v

  根据全部相同有效性,我们可以发现如果决策值是布尔型的,可以由该性质得到正确输入有效性。但如果输入值不是布尔型的,全部相同有效性在很多场景下并不能真正有用。

  定义 4.6 (中值有效性 Median Validity) 如果输入值是有序的,比如实数值,可以使决策值接近所有正确输入值的中值,以避免拜占庭异常。这里,与中值的差距取决于拜占庭节点的个数 f

  定义 4.7(同步 Synchronous) 在同步(Synchronous)模式下,节点运行在同步轮次中。在每一轮,每个节点可能向其他节点发送一条消息,接收其他节点发送的消息,并进行某些本地计算。

  定义 4.8(同步运行时 Synchronous Runtime) 再同步模式下,运行时(Runtime)可以简单地等同于在最坏情况下算法从开始到结束运行了多少轮。

  接下来我们将尝试设计一个算法,使其可以容忍单个拜占庭节点。

有多少个拜占庭节点

算法 4.9 拜占庭协定(f =1)

1: 	Code for node u, with input value x: 
	Round 1
2: 	Send tuple(u, x) to all other nodes 
3: 	Receive tuple(v, y) from all other nodes v 
4: 	Store all received tuple(v, y) in a set Su
	Round 2
5: 	Send set Su to all other nodes 
6: 	Receive sets Sv from all nodes v 
7: 	T = set of tuple(v, y) seen in at least two sets Sv, including own Su
8: 	Let tuple(v, y) ∈ T be the tuple with the smallest value y
9: 	Decide on value y

评论:

  • 拜占庭节点可能不遵守上述协议并发送语法上错误的消息,这种消息很容分辨并被丢弃,但是如果拜占庭节点发送消息语法正确,内容却是伪造的,这就难以分辨。
  • 有些错误难以被轻易发现。如一个拜占庭节点想不同节点发送不同值。但有些错误可以而且必定能被检测出来,如一个拜占庭节点发送一个集合 S v S_v ,其中包含了他自己的值 t u p l e ( v , y ) tuple(v,y) ,这个元祖必然会被接收节点 u u S v S_v 中移去(算法第 6 行)。
  • 在此我们假定假节点不能伪造他们的源地址。

  引理 4.10 如果 n 4 n \geq 4 所有好节点都将得到同一个集合T。
  证明: 由于 n 4 n \geq 4 f = 1 f=1 ,所以我们至少有 3 个好节点。对于每个好节点,都会在第一轮中与另外两个好节点进行一次通信,同时也会在第二轮中通过另一好节点确认该值,于是每个好节点的值都将至少出现两次,而拜占庭节点如果将一相同值发送了超过两次,那所有好节点也会收到该值超过两次,于是被包含进最终的决策中,但如果拜占庭节点发送的值各不相同,那这些值都无法进入最终的决策。

  定理 4.11 如果 n 4 n \geq 4 算法 4.9将能达成拜占庭协定。
  证明: 由引理 4.10 可知该算法能够满足任何输入有效性,且该算法将在两轮后中止,并达成拜占庭协定。需要注意,拜占庭算法需要达成全部输入相同有效性,对于满足任何输入有效性的决策集合,算法 4.9 在其第 8 行中通过从至少出现两次的之中选择最小值的方法,保证了最后可以得到全部相同有效性。

  定理 4.12 如果网络中只包含 3 个节点,且其中一个为拜占庭节点,则该网络不能达成符合全部相同有效性的拜占庭协定。
  证明: 为了达成全部相同有效性,一个好节点若是发现另一个节点的值与自己相同,就必须将决策值设定为自己的值。第三个节点可能不同意这个值,但是它可能是拜占庭节点。

  定理 4.13 若一个有 n n 个节点的网络中存在 f n / 3 f \geq n/3 个拜占庭节点,则该网络不能达成拜占庭协定。
  证明: 采用反证法,假定存在这么一个满足条件的算法,那么根据该算法我们可以在一个只有 3 个节点的网络中解决拜占庭问题,这与定理 4.12 矛盾,所以不存在这种算法。

国王算法
Algorithm 4.14 King Algorithm (for f < n/3)
1: x = my input value
2: for phase = 1 to f + 1 do
Round 1
3: Broadcast value(x)
Round 2
4: if some value(y) at least n − f times then
5: Broadcast propose(y)
6: end if
7: if some propose(z) received more than f times then
8: x = z
9: end if
Round 3
10: Let node v i be the predefined king of this phase i
11: The king v i broadcasts its current value w
12: if received strictly less than n − f propose(x) then
13: x = w
14: end if
15: end for

  引理4.15 算法4.14实现了全部相同有效性。
  证明: 如果所有好节点初始时拥有相同的输入值,则好节点们在第2轮都会提议这个值。所有好节点将会接收到至少n-f个提案,因此所有好的节点将保持这个值,并且不会切换到国王的值。这个结论对所有阶段都适用。

  引理4.16 在n>3f的情况下,如果一个好节点提议x,不会有其他好节点提议另一个值y(y≠x)。
  证明: 采用反证法。假设一个好节点A提议x,并且有另一个好节点B提议y (y≠x)。注意到一个好节点只会在接收到n-f次包含同一个值的消息之后才会提议这个值,并且最多只有f个拜占庭节点发送x给A且发生y给B。我们可以推出下面的结论:A和B都从至少n-2f个好节点处接收到它所提议的值(x或y),且它们的消息来源没有交集。于是,网络中将至少存在2*(n-2f)+f=2n-3f个节点。由于3f<n,我们将得到2n-3f>2n-n=n,这与前提(网络中有n个节点)矛盾。

  引理4.17 至少存在一个阶段,该阶段的国王是好节点。
  证明: 算法包含f+1个阶段,每个阶段的国王都不同。由于系统中只有f个拜占庭节点,因此至少一个国王是好节点。

  引理4.18 当n>3f,如果某一轮的国王是好节点,所有的好节点们在这轮之后都不会改变它们的值v。
  证明: 如果所有的好节点都将它们的值修改为国王的值,则所有好节点的值都相同。如果某个好节点没有将它的值改为国王的值,说明它已经至少接收到某个值的提案n-f次,于是至少n-2f个好节点广播了这个提案。这样,所有的好节点都会接收到这个提议n-2f>f次(因为n>3f),所以所有好节点都会将它的值设置为这个提案的值,包括国王。注意到根据引理4.16,只有一个值可以被提议超过f次。根据引理4.15,没有哪个节点会在这一轮之后改变它的值。

  定理4.19 算法4.14解决了拜占庭协定问题
  证明: 若以下两个条件之一被满足,国王算法将达成协定。条件一:所有好节点起始的值相同。条件二:在某个阶段(该阶段的国王为好节点)之后,所有好节点在同一个值上达成一致(根据引理4.17和引理4.18)。我们知道好节点将持续保持这个值(引理4.15)。算法将确保在3*(f+1)轮之后终止。而根据引理4.15,全部相同有效性肯定成立。

评论:

  • 算法4.14需要f+1个预先指派好的国王。我们在之前假设:这些国王及其轮值king的顺序,都是给定的。事实上,指派这些国王本身就是一个拜占庭协定任务。而且这个任务必须在国王算法执行之前完成。
  • 有没有算法可以在没有国王的情况下实现拜占庭协定?有,请见后文。
  • 我们能否在少于f+1轮内解决拜占庭协定(或至少是共识)?
“轮”数的下界

  定理4.20 在网络中存在f个崩溃节点的情况下,一个同步算法需要至少f+1轮来达成共识以判定网络中所有节点的最小输入值。
  证明: 反证法。假定存在某个算法A,A可以在f轮以内解决共识问题。某个节点u1拥有最小的输入值x,但是在第一轮中,u1在自己崩溃之前,只来得及将自己的消息(包含它的输入值x)仅仅发给了另外一个节点u2。不幸的是,在第二轮,唯一看到x的节点u2也仅将x发送给了另一个节点u3,然后崩溃。这个过程不断重复,于是在第f轮,只有节点u f+1知道最小的值x。由于算法A在第f轮终止,节点u f+1将认为最小值是x,而所有其他存活的(好)节点则会接受某个比x大的值为最小值。于是算法A没有在第f轮达成共识。

评论:

  • 我们也可以得到一个更一般的证明,不需要“判定最小值”这个限制。
  • 某些拜占庭节点也可能仅仅崩溃,因此这个下界也对拜占庭协定问题成立。因此算法4.14的运行效率是接近最优的。
  • 到现在为止,我们所谈到的拜占庭协定算法都假定同步模式。那么,拜占庭协定问题能在异步模式下解决吗?
异步模式下的拜占庭算法
Algoritnm 4.21 Asynchronous Byzantine Agreement(Ben-or,for f<n/9
1: xi∈{0,1} / input bit
2: r = 1 / round
3: decided = false
4: Broadcast propose(xi,r)
5: repeat
6: Wait until n−f propose messages of current round r arrived
7: if at least n − 2f propose messages contain the same value
x then
8: xi = x, decided = true
9: else if at least n − 4f propose messages contain the same
value x then
10: xi = x
11: else
12: choose xi randomly, with P r[xi = 0] = P r[xi = 1] = 1=2
13: end if
14: r = r + 1
15: Broadcast propose(xi,r)
16: until decided (see Line 8)
17: decision = xi

  引理4.22 假设n>9f,当一个好节点在算法第10行选择了x,所有其他好节点都会在第10行选择x
  证明: 假设0和1都在第10行被选中,则节点个数至少为2·(n-4f)>n,矛盾!

  定理4.23 f<n/9的情况下,算法4.21可解决布尔型拜占庭问题
  证明: 有效性:若所有好节点输入相同的值x,在第一轮就将达成一致,由此可见,我们满足了全部相同有效性。若好节点输入值不同,任意决策值都将符合有效性的要求。
  一致性:假定u为第一个选定x的节点,且从Su处接受消息。由于处在异步模式,另一个节点v可能从Sv处接受到消息。注意到,Su和Sv中至多有f个节点不同。考虑到拜占庭节点可能会撒谎,v还可能收到f条与u不同的消息。u至少收到n-2f条包含x的消息,则v至少收到n-2f-2f=n-4f条包含x的消息。于是v(任一好节点)将在下一轮提议x。于是满足一致性。
  可终止性:由上,只要有一个好节点终止运行,则所有好节点将在下一轮终止运行。于是我们考虑最坏的情况,即所有好节点都进入第12行,随机选择xi。显然我们希望好节点碰巧选择了同一个值。根据概率公式计算的概率为2^-(n-f)+1。因此,在最坏的情况下,运行时间将随节点数量n呈指数增长。

评论:

  • 这个算法证明了异步拜占庭协定是可以达成的。但由于运行效率过低,该算法没有实际价值。

猜你喜欢

转载自blog.csdn.net/weixin_43255133/article/details/83277357