[关闭]
@w460461339 2018-07-24T20:03:21.000000Z 字数 1639 阅读 825

情景模拟-共识算法

顺丰工作


1、参考

https://zhuanlan.zhihu.com/p/35847127

https://www.jianshu.com/p/fb5edf031afd

2、问题

1、宕机节点的问题是不响应请求;恶意节点的问题是会发送恶意信息?

2、通过主节点分配的序号保证顺序,通过节点的多数原则以及三个过程(pre,prepare,commit)保证正确性。

3、如何确定主节点:

1、初始设置view number, v =0;
2、一共有 R=3f+1个replica(副本),主节点也是其中的一个replica,主节点称为ρ。
3、那么主节点 ρ= v mod R (相当于从0~R-1循环往复)
4、每次view change时,v自加1.

4、为什么不能在一个节点prepare结束后立即人为全网都认可了这个执行顺序?

1、光有一个节点prepare结束时不够的(即收到了其他所有节点的prepare信息)。
2、当假设4个节点,0~3;1节点收到了2和3传来的prepare信息,结束了prepare,但是2和3都还没收到。
3、此时若是发生了view change,会使得2和3中此条message的执行被作废,而1还保留有该信息。
4、但是对于client而言,该信息的执行需要有f+1个节点的认可,因此最终1节点进入到prepare的信息也同样作废。
5、因此,需要所有节点都完成prepare阶段才行。
6、此时需要每个节点在完成prepare后都发送一条commit信息,当每个节点收到2f+1个commit信息(包括自己的)后,就知道所有节点都完成了prepare,即认可了这个信息,那么就可以开始执行了。

5、从节点是坏的怎么办?

在系统设计的时候已经考虑到这个问题,因此我们定义:
    恶意节点个数为f,
    宕机节点个数也为f
    好的节点数要大于等于f+1才行。
只要满足这个条件,从节点是恶意节点也无所谓(多数原则)

6、尽管系统能够解决从节点是恶意节点的情况,但是如果主节点是恶意节点怎么办?

首先看主节点是恶意节点时会发生的攻击:

https://www.zhihu.com/question/52254063

3、代码启动&debug

可以通过以下指令拿到输出结果:

sudo docker logs -f  容器ID

注意,输出可以通过logger的形式写,案例:

 logger.info("I'm node XXX")

4、代码架构

./code/api

提供网络api,可以处理
https://github.com/luckydonald/pbft/tree/master/code/api
提到的指令。

./code/node:

每个节点的主要运行代码,从消息的发送,接收,cache等等都在这里,需要重点学习。

./code/node_java:

java版本的node,可以不用管。

./code/web:

提供web服务所需要的内容,可以暂时先放一放。

依赖关系:
image_1cj5hndi31gur113bnes187m11s63r.png-36.7kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注