@w460461339
2018-07-24T20:03:21.000000Z
字数 1639
阅读 821
顺丰工作
https://zhuanlan.zhihu.com/p/35847127
https://www.jianshu.com/p/fb5edf031afd
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
1)全部启动之后,可以运行下列代码终止所有容器:
sudo docker-compose down
2) 没有修改代码时,想要重启代码,使用下面这个shell:
将上述文件放到 ./pbft下,执行./nochange.sh,在命令行执行./nochange.sh 即可。
4)想要看到输出,使用logger.info("内容即可"),只不过刷出的内容比较多,需要自己找一下。
可以通过以下指令拿到输出结果:
sudo docker logs -f 容器ID
注意,输出可以通过logger的形式写,案例:
logger.info("I'm node XXX")
1)现在的目录结构:
2)第一级:code和extras:
code是放置一些重要的code的地方,我们主要需要学习的也是这里。
extras主要是放一些额外依赖,或者php的管理,不是很重要,不需要太多学习经历。
3)第二级:./code/api ; ./code/node ; ./code/node_java ; ./code/web
./code/api:
提供网络api,可以处理
https://github.com/luckydonald/pbft/tree/master/code/api
提到的指令。
./code/node:
每个节点的主要运行代码,从消息的发送,接收,cache等等都在这里,需要重点学习。
./code/node_java:
java版本的node,可以不用管。
./code/web:
提供web服务所需要的内容,可以暂时先放一放。
依赖关系: