Commit Graph

676 Commits

Author SHA1 Message Date
Andreas Fackler d83ef9cf67
Fix BA message handling on epoch change.
Binary agreement erroneously kept handling queued incoming messages for
an epoch `n`, even if during the handling, the epoch was incremented to
`n + 1`. This caused `DuplicateAux` faults in the tests, but it could
potentially break consensus.
2019-04-02 14:01:27 +02:00
Vladimir Komendantskiy 89ba1f6799 using threshold_crypto 0.3.1 2019-04-02 12:42:51 +02:00
Vladimir Komendantskiy 10dbf705e4 using serde derive feature 2019-04-02 12:42:51 +02:00
Andreas Fackler 2e046906f9 Don't drop re-added peers from sender queue. (#391)
If a previously removed peer gets added back as a validator,
`SenderQueue` now removes that peer from `last_epochs`, so it doesn't
drop it later.
2019-04-01 10:05:46 +01:00
David Forstenlechner 61171bb475 Eliminated the old network simulator (#389)
queuing_honey_badger ported to the new net simulator
2019-03-19 16:55:56 +00:00
David Forstenlechner c1e634ecf2 Ported more integration tests to the new net simulator (#387)
* Ported threshold_sign test to the new framework

* Ported the first three broadcast tests to the new framework

* Extracted messages storting and random swapping to reusable functions

Used to compose ProposeAdversary's behavior without having to duplicate code

* Implemented ProposeAdversary for the new integration testing framework

Added "id()" function to the "NodeMutHandle", required for sending messages to all nodes

ProposeAdversary needs access to all faulty node's netinfo. We follow the example of the binary_agreement_mitm integration test of using an reference counted Mutex to make netinfo available on both Consensus Protocol construction and in the Adversary implementation.
Unlike binary_agreement_mitm every faulty node needs to use its own netinfo for the broadcast algorithm, so we store all nodeinfo structures in a Map instead of just the nodeinfo of the first node.
Ideallly the new network simulation library should provide netinfo similar to the old library to avoid these hideous workarounds.

* Migrated test_broadcast_random_delivery_adv_propose to the new network simulator

Refactored the implementation of ProposeAdversary to closely resemble the behavior in the old network simulator library.
Implemented a pick_random_node function to sort messages for a random node id. Switched from using "inject_message" to joining messages generated by adversaries' temporary Broadcast Consensus Protocols with the Step generated by regular operation.

* Ported RandomAdversary to the new network simulator library

Ported all broadcast integration tests and replaced the old tests with the new.

* Eliminated the old broadcast integration test, replaced with the new

* Ported subset test to the new framework

Adjusted message queue size as suggested by Andreas

* Ported the first three honey_badger tests to the new framework

* Re-implemented FaultyShareAdversary for the new framework

Eliminated the old honey_badger integration tests, replaced with implementations using the new net simulator framework

* Fixed issues reported by clippy

* Fixed issues reported on code review

* Fixed issues reported by clippy

* Implemented a broadcast test dropping messages similar to the tests written in the old framework

* Picking the proposer id at random, verifying all possible output cases

If the proposer is faulty the message queue may starve, but the outputs of all correct nodes need to be empty, if the broadcast protocol produces output nonetheless all correct nodes need to have the same output.
If the proposer was correct all correct nodes need to output its proposed value.

* Eliminated duplicated semicolon

* Consistently using TestRng and proptest in all newly ported tests

* Increased the drop_and_re_add test message limit to 20k per node

* Removed unnecessary closure

* Increased the tolerance for deviations from the expected value range to eliminate random test failures
2019-03-14 13:41:23 +00:00
Andreas Fackler 57455d47ae Fix a SyncKeyGen and a DHB test issue.
`SyncKeyGen` should tolerate duplicate `Part` messages as long as they
are identical.

The `drop_and_re_add` test had an arithmetic overflow, because it tried
to remove more faulty nodes than nodes in total.
2019-03-14 14:09:27 +01:00
Constantine Solovev 3336fa772d Remove a random subset of validators in net_dynamic_hb (#385)
* Choose pivot node at random

* Choose random number of nodes for removing in net_dynamic_hb test

* Docs and code small fixes

* clippy fix

* Cargo fmt for stable toolchain and add rust-toolchain file as well

* Remove rust-toolchain file

* Fix grammar and improve selecting nodes for removing

* Simplify selecting nodes for remove

* Fix tests

* Remove net_dynamic_hb.proptest-regressions file
2019-02-27 16:39:57 +00:00
C.Solovev 0e7edb2be7 Add `honey_badger` getter for `DynamicHoneyBadger` 2019-02-25 18:43:15 +01:00
Vladimir Komendantskiy 5b86543bbf
Merge pull request #382 from RicoGit/small-fixes
Add to .gitignore .idea/ folder and fix test's readme
2019-02-25 11:42:48 +00:00
C.Solovev cc0812193c Add to .gitignore .idea/ folder and fix test's readme 2019-02-25 15:05:08 +04:00
Vladimir Komendantskiy d4a7b19adb
Merge pull request #379 from poanetwork/afck-badge
Add docs.rs and crates.io badges.
2019-01-10 14:21:09 +00:00
Andreas Fackler 3f82db6071 Add docs.rs and crates.io badges. 2019-01-10 14:36:26 +01:00
Vladimir Komendantskiy ae4d77096b
Merge pull request #378 from poanetwork/afck-2018
Use Rust 2018 idioms consistently.
2019-01-09 12:19:17 +00:00
Andreas Fackler bd74cc2fa9 Use Rust 2018 idioms consistently.
Apply `cargo fix --edition-idioms`.
2019-01-09 11:56:40 +01:00
Andreas Fackler 87b1d45d97 Rename DistAlgorithm to ConsensusProtocol. 2019-01-08 14:14:34 +01:00
Andreas Fackler a71611d8f2 Link to the security audit. Update dependencies. (#376)
* Link to the security audit.

* Update dependencies.
2019-01-07 15:16:18 +00:00
Sebastian Geisler c887b6810b Enable DynamicHoneyBadgers to rejoin after connection loss (#366)
Implementing an epoch setter for the `DynamicHoneyBadgerBuilder` enables the creation of a `DynamicHoneyBadger` that will join the consensus at a given epoch.
2019-01-07 13:31:12 +00:00
Vladimir Komendantskiy 742ad7b83a
Fixes the net_dynamic_hb test (#372)
* started waiting for a full epoch after node removal in net_dynamic_hb

* clarified the use of the stored join plan

* go back to rejoining the node in the same epoch it was removed

* cleanup of debug prints

* clippy lints and more cleanup

* cleaned up unused methods

* review comments; cleaned up net_dynamic_hb

* relaxed the condition on the readd input epoch

* updated the fault error in tests
2019-01-03 09:22:44 +00:00
phahulin 5bfcd6c692 Split FaultKind. (#371) 2019-01-02 13:55:50 +03:00
Andreas Fackler 108ac574bb Migrate to rand 0.6. (#368)
* Migrate to rand 0.6.

* Prefer SliceRandom where it makes sense.
2018-12-27 10:34:34 +01:00
Andreas Fackler 8689e6501e Remove impossible Reed-Solomon errors. 2018-12-18 09:58:59 +01:00
Andreas Fackler ee99aad266 Make Step::extend_with must_use. 2018-12-17 15:38:18 +01:00
Andreas Fackler 7677f6343c Remove unwrap and expect calls from production code. 2018-12-17 15:38:18 +01:00
Vladimir Komendantskiy 14960a148e
Remove peers from sender queue (#352)
* impl. old validator removal from sender queue peer list

* provided current validators for sender queue peer removal

* renamed validators as nodes in the sender queue

* Revert "renamed validators as nodes in the sender queue"

This reverts commit 78e1e1569d5f624c469bf752a5bf874b434a61d2.

* cleaned up the SQ builder and moved removal of old validators to triggers

* computing participant transitions from batches in the sender queue

* added a missing comment

* removing old validators as soon as all messages are delivered up to the last epoch

* review comments

* rejoined Node 0 in the old DHB test

* DHB test uses the first step of the DHB algorithm on the restarted node

* changed test batch verification to account for node 0 removal

* updated net_dynamic_hb test to cope with the removal of node 0

* relaxed verification of batches to only check inclusion of node 0 transactions

* corrected test state transitions in DHB and QHB tests

* added a builder function for a joining QHB

* rejoin the pivot node instead of node 0

* changed VirtualNet::verify_batches to take a full node as an argument

* corrected a variable name

* correction: use the pivot node ID instead of indices

* corrected the pivot node ID

* simplified a find

* simplified a conditional statement

* corrected the inference of expected output in verify_batches

* WIP on DHB and QHB tests; VirtualNet::verify_batches made more general

* readded node 0 in the DHB test when InProgress change is output

* allowed node 0 to miss a few batches while it is removed in the QHB test

* edition and rebase fixes

* refactored the use of process_step

* added VirtualNet functionality of node insertion and removal

* restarting the pivot node after all validators add it as peer

* clippy lints in net_dynamic_hb

* added observer in the QHB test; removed the DHB TestNetwork test

* fixed rng usage in the QHB test

* check output length when verifying batches; comment correction
2018-12-17 13:27:46 +00:00
Marc Brinkmann eafa77d5fc OsRng / external RNG Refactoring (#357)
* Use `OsRng` in place of `thread_rng`.

This changes the defaults of any builder by instantiating an `OsRng` instead of
a `thread_rng`, the former being much more secure than the latter.

Additionally, all the unit tests that still instantiate RNGs manually used `OsRng`s
as well; while there is no actual need for this level of security in tests, the performance overhead is very small and random number generation complexity has such a small impact on these tests that the convenience of being able to ban `thread_rng` from the codebase altogether, setting a good example and avoid issues when refactoring later greatly outweigh the negatives.

* Instead of storing random number generators in the various consensus algorithm instances, pass them in from the outside whenever they are needed.

This changes a large amount of interfaces (and in this commit is only partially done, since `DistAlgorithm` needs to be fundamentally altered as well.

It also obsoletes parts of the `util` module.

* Added an `R: Rng` type parameter to both methods of `DistAlgorithm`, forcing callers to pass in their own Rngs.

* Fixed documentation grammar and spelling in some of the altered interfaces due to RNG refactoring.

* Move `rng` argument to the end of the argument for most functions.

Also includes a reformatting due to Rust 1.30.

* Updated tests, accomodate `rng`-API changes.

* Fixed remaining compilation issues with new RNG code.

* Fix illegal `self` import outside curly braces.

* Cleaned up comments and fixed broken definition of `broadcast_input`.

* Updated existing test cases to properly work with static dispatch randomness.

* Do not use boxed `Rng`s for key generation in test networks.

* Use the passed-in `Rng` in `ReorderingAdversary`, instead of storing a boxed one.

* Fixed clippy lints after refactoring.

* Removed some no-longer necessary manual `fmt::Debug` implementations in test framework.

* Use `OsRng` even in tests in `binary_agreement_mitm`.

* Use a proper deterministic RNG in tests `binary_agreement_mitm`.

* Refactor `examples/simulation.rs` by not using `ThreadRng`, passing generic `Rng` parameters throughout and using a type alias instead of a newtype as the `Transaction`.

* Remove `thread_rng` use from `examples/node.rs`.

* Explicitly construct `InternalContrib` in `DynamicHoneyBadger::propose`.

* Fixed typo in description of `DistAlgorithm` trait.
2018-12-14 12:51:09 +00:00
Andreas Fackler 1c7fc60db9 Add docs and assert that 3 * f < N. (#364) 2018-12-12 13:39:52 +01:00
Vladimir Komendantskiy 3a0e512798
Merge pull request #363 from poanetwork/afck-consensus-node
Fix consensus-node --help.
2018-12-12 09:25:31 +00:00
Andreas Fackler cea579803b Fix consensus-node --help. 2018-12-12 09:55:28 +01:00
Demi Marie Obenour 7fb172cda2 Switch to 2018 edition idioms (#359)
* Switch to 2018 edition idioms

* Fix build with Rust 2018.

* Remove unnecessary cloning, make `max_faulty` const.

* Remove unneeded `extern crate` statements.
2018-12-11 14:44:36 +01:00
Vladimir Komendantskiy c1c7ffff49
Added fault checking on every step in the net framework (#338)
* added fault checking in the net framework

* check that the node in the fault report is not faulty

* simplified a condition

* made error on fault a parameter of VirtualNet

* updated the BA test to error on fault

* explained errors and refactored an assignment

* typo fix
2018-12-11 08:12:38 +00:00
Vladimir Komendantskiy f297d84514
Added a test for expected participants when receiving a batch from a correct node (#355)
* test expected participants when receiving a batch from a correct node

* restrict the batch participant check to correct participants

* check only for the absence of unexpected batch participants

* check the minimum number of contributors for each batch

* corrected the minimum number of batch contributions

* removed an irrelevant FIXME

* added an equivalence check for batches output in the same epoch

* comment correction
2018-12-11 07:28:27 +00:00
Vladimir Komendantskiy 99d01bf428
Update the crossbeam dependency to 0.5 (#361)
* updated crossbeam to 0.5

* removed an obsolete Clippy directive
2018-12-10 17:10:13 +00:00
Andreas Fackler ceb416a6e1 Make received_proposals public.
We are going to need this if we use `HoneyBadger` directly, to replace
`DynamicHoneyBadger::should_propose`.
2018-12-03 17:51:49 +01:00
Andreas Fackler 54c882234b Keep key gen messages with values encrypted to self. Remove TODO.
Not only is the code easier this way, it also has the advantage that a
node that has crashed and is restarting can recompute its key share.
2018-11-29 18:49:47 +01:00
Andreas Fackler da3d50d1b0 Fix some TODOs, make key share in net info optional. 2018-11-29 12:45:39 +01:00
Andreas Fackler 5dc52e0e51 Apply review suggestions. 2018-11-27 12:25:50 +01:00
Andreas Fackler b2071fe2be Extend the documentation, simplify errors.
This changes and adds several doc comments, adds the `missing_docs` lint
and simplifies some of the error types.
2018-11-27 12:25:50 +01:00
Andreas Fackler ae37879239 Remove the random_value option. 2018-11-22 13:07:58 +01:00
Andrew Gross a9c3f96047
Merge pull request #348 from poanetwork/ag-README-diagram
README update
2018-11-21 08:44:18 -07:00
Andrew Gross c505a64d46
Updated links, reorg sections, added visualization 2018-11-21 08:19:43 -07:00
Andreas Fackler c2a76add5d Include the full Params in JoinPlan.
This ensures that a new node runs with exactly the same parameters as
the rest of the network.
2018-11-21 10:28:56 +01:00
Vladimir Komendantskiy 5735cf23a1
Binary Agreement test updated to the proptest framework (#336)
* converted the BA test to net framework

* fixed lints and corrected docs

* seeded the Rng and removed logging

* allowed pass by value of binary_agreement argument

* handling of input via proptest and doc correction
2018-11-20 15:16:15 +00:00
Andreas Fackler 9049dd1793 Add a `Params` struct with HB parameters.
This removes some duplication between DHB, HB and their builders.
2018-11-19 14:01:46 +01:00
Andreas Fackler c94e3ff16f Add epoch getters to JoinPlan, HB, DHB and QHB. 2018-11-18 10:48:38 +01:00
Andreas Fackler e89688bbd8
Allow arbitrary validator set changes in DHB. (#339)
* Allow arbitrary validator set changes in DHB.

This replaces `NodeChange` with a full list of IDs and public keys,
instead of just a single to-be-added or to-be-removed node, to allow
completely replacing the set of validators by any arbitrary new set in a
single key generation step.

* Address review comments: added_nodes, comments.

* Fix MessageScheduler::First.

Make sure every node eventually gets to handle its messages.
2018-11-18 10:17:33 +01:00
Andreas Fackler 767944c0f6 Fix random_value doc comment. 2018-11-12 14:16:21 +01:00
Andreas Fackler 30cce9bed8 Add a random_value option to HB and DHB.
This includes a threshold signature in each batch that can be used as a
pseudorandom value.

Also moves `EncryptionSchedule` from `threshold_decrypt` to
`honey_badger`.
2018-11-12 14:16:21 +01:00
Vladimir Komendantskiy e4435d5622
Make the incoming message queue finite in Binary Agreement (#329)
* added BA max_future_epochs and limited incoming messages in an epoch

* corrected a comment
2018-11-12 11:15:02 +00:00
Andreas Fackler b3c63774a7 Remove Epoched bound from SenderQueueableMessage. 2018-11-08 13:14:43 +01:00