Description

Placeholder for a rewrite of PBFT. v1 does not use v0.6 PBFT implementation but comes up with a new "simplified" one.

Simplified BFT (SBFT) follows PBFT (http://research.microsoft.com/en-us/um/people/mcastro/publications/p398-castro-bft-tocs.pdf) to a large extent. The differences (simplifications) are as follows:
1) No watermarks (or, hard-coded watermarks in which the high watermark equals the low watermark).
2) signatures used in view change msgs of PBFT (like in OSDI'99 version of PBFT and like in v0.6)
3) simplified state-transfer. As, most of the time, an orderer does not actually need a full Raw Ledger itself, we can often allow holes in the Raw Ledger at a given orderer. This considerably simplifies the reasoning about state transfer in SBFT.
4) extension of the 3-phase message pattern of PBFT to a 4-phase pattern in which the 4th phase (CHECKPOINT) messages are signed. f+1 signed checkpoint messages constitute a proof of an individual block. If we had 3-phase common case we would need to be having 2f+1 signatures (on COMMIT messages) for the block proof. There is a tradeoff (3 vs 4 phases in common case and 2f+1 vs f+1 signatures) explored here - the final decision on the design choice here is TBD as of Dec 2016.
5) the retransmission component of PBFT and censorship protection aspects of PBFT are (will be) separated in a standalone component - see FAB-474 (https://jira.hyperledger.org/browse/FAB-474).
6) Requests are signed by the invoking clients (HL fabric clients and peers).
7) SBFT will allow individual (i.e., a one-third minority) of replicas to progress with their Raw ledger, if stuck in a view change (something that PBFT w/o proactive recovery does not offer - see FAB-707https://jira.hyperledger.org/browse/FAB-707)
8) SBFT optimizes (reduces) PBFT quorum sizes (N-F) outside the classical config where N=3F+1