This PR contains the following changes:
* SCP fix for issue above
* There is an invariant (per the [whitepaper](https://www.stellar.org/papers/stellar-consensus-protocol.pdf) ) that `h.value == b.value` (see page 23 for what the `PREPARE` message contains) — yet rule `2` (see page 24 for the 9 rules that drive state changes) implies that `h` should be updated even though `b` may not be updated by rule `8` if `b > h`.
* the fix here is to NOT set `h` if it would lead to `h.value != b.value` (we still calculate the value of `h candidate`).
* This is slightly different than what the corrected version of the internet draft does: in the draft, `h` is set but the `PREPARE` message does not set `h.n` if `b.value != h.value`. The problem with that approach is that this makes reconstructing the internal state of the SCP state machine impossible from just the last `PREPARE` message, which could lead to undefined behavior when restarting a node.
* better logging and status of the validation state (a validator could silently not be validating)
* I had to add an entirely new test to trigger this bug. What makes this possible is to receive a message that triggers both v-blocking and quorum conditions at once: for example, in a 2 out of 3 setup, 2 nodes can be both v-blocking and form a quorum for some interesting value.
— [ ] Reviewed the [contributing](https://github.com/stellar/stellar-core/blob/master/CONTRIBUTING.md#submitting-changes) document
— [ ] Rebased on top of master (no merge commits)
— [ ] Ran `clang-format`
— [ ] Compiles
— [ ] Ran all tests
— [ ] If change impacts performance, include supporting evidence per the [performance document](https://github.com/stellar/stellar-core/blob/master/performance-eval.md)
You can view, comment on, or merge this pull request online at:
— Commit Summary —
* add validation status to SCP status in «info»
* Add more logging on value validation
* new SCP test to cover v-blocking set is quorum
* SCP: don’t set h if not compatible with b
— File Changes —
M src/herder/HerderImpl.cpp (15)
M src/herder/HerderSCPDriver.cpp (33)
M src/scp/BallotProtocol.cpp (76)
M src/scp/BallotProtocol.h (2)
M src/scp/SCP.cpp (14)
M src/scp/SCP.h (3)
M src/scp/SCPTests.cpp (175)
M src/scp/Slot.cpp (7)
— Patch Links —