bcosorg / bcos

BCOS平台(Be Credible, Open & Secure)
GNU General Public License v3.0
872 stars 286 forks source link

关于PBFT算法的疑问 #34

Open Xorek opened 7 years ago

Xorek commented 7 years ago

https://github.com/bcosorg/bcos/blob/fb0d2a4aab793f2fa417c25f589cee09f4ed6435/libpbftseal/PBFT.h#L95 PBFT算法是三阶段算法:第一轮发起提案、第二轮对提案投票、第三轮对第二轮投票的结果进行投票。 但从BCOS的实现上看,缺了第三轮的处理。 第一轮是broadcastPrepareReq发起提案; 第二轮是broadcastSignReq广播对提案的投票; 没有发现第三轮的处理。

wheatli commented 7 years ago

PBFT论文算法描述确实如你所说的这样,需要3阶段,第3阶段主要是确认有2/3的人收到了2/3的签名。 但是在实际场景中的网络可用性是可以保证的,第二阶段已经对拜占庭问题进行解决,同时P2P同步还会对签名进行验证,因此是安全可靠的。 业内比如小蚁区块链dBFT也采用类似做法。

Xorek commented 7 years ago

嗯。 我的理解和你有差异。 你描述中给这个算法加了一个前提条件:网络可靠; 首先,基于这个条件实现的安全可靠的算法,我个人认为不能称之为PBFT算法; 其次,加了这个条件之后,该算法的安全可靠需要理论和测试的支持; 最后,我没了解过小蚁,我了解的超级账本、tendermint的PBFT实现都是三阶段提交的算法,BCOS的实现是考虑了性能之后的折中吗?

wheatli commented 7 years ago

同意你的描述, 理论角度分析是可以优化的

haiki commented 6 years ago

@wheatli default 这个描述中说的是leader广播区块,这个可以看作是pre-prepare阶段,那么后面的广播签名投票,可以认为是prepare阶段吗?广播落盘投票是commit?按照楼主的说法,是只在描述的时候说了这样,实际代码实现不是这样的是吗?