serai/substrate/tendermint/machine
Luke Parker 8ca90e7905
Initial In Instructions pallet and Serai client lib (#233)
* Initial work on an In Inherents pallet

* Add an event for when a batch is executed

* Add a dummy provider for InInstructions

* Add in-instructions to the node

* Add the Serai runtime API to the processor

* Move processor tests around

* Build a subxt Client around Serai

* Successfully get Batch events from Serai

Renamed processor/substrate to processor/serai.

* Much more robust InInstruction pallet

* Implement the workaround from https://github.com/paritytech/subxt/issues/602

* Initial prototype of processor generated InInstructions

* Correct PendingCoins data flow for InInstructions

* Minor lint to in-instructions

* Remove the global Serai connection for a partial re-impl

* Correct ID handling of the processor test

* Workaround the delay in the subscription

* Make an unwrap an if let Some, remove old comments

* Lint the processor toml

* Rebase and update

* Move substrate/in-instructions to substrate/in-instructions/pallet

* Start an in-instructions primitives lib

* Properly update processor to subxt 0.24

Also corrects failures from the rebase.

* in-instructions cargo update

* Implement IsFatalError

* is_inherent -> true

* Rename in-instructions crates and misc cleanup

* Update documentation

* cargo update

* Misc update fixes

* Replace height with block_number

* Update processor src to latest subxt

* Correct pipeline for InInstructions testing

* Remove runtime::AccountId for serai_primitives::NativeAddress

* Rewrite the in-instructions pallet

Complete with respect to the currently written docs.

Drops the custom serializer for just using SCALE.

Makes slight tweaks as relevant.

* Move instructions' InherentDataProvider to a client crate

* Correct doc gen

* Add serde to in-instructions-primitives

* Add in-instructions-primitives to pallet

* Heights -> BlockNumbers

* Get batch pub test loop working

* Update in instructions pallet terminology

Removes the ambiguous Coin for Update.

Removes pending/artificial latency for furture client work.

Also moves to using serai_primitives::Coin.

* Add a BlockNumber primitive

* Belated cargo fmt

* Further document why DifferentBatch isn't fatal

* Correct processor sleeps

* Remove metadata at compile time, add test framework for Serai nodes

* Remove manual RPC client

* Simplify update test

* Improve re-exporting behavior of serai-runtime

It now re-exports all pallets underneath it.

* Add a function to get storage values to the Serai RPC

* Update substrate/ to latest substrate

* Create a dedicated crate for the Serai RPC

* Remove unused dependencies in substrate/

* Remove unused dependencies in coins/

Out of scope for this branch, just minor and path of least resistance.

* Use substrate/serai/client for the Serai RPC lib

It's a bit out of place, since these client folders are intended for the node to
access pallets and so on. This is for end-users to access Serai as a whole.

In that sense, it made more sense as a top level folder, yet that also felt
out of place.

* Move InInstructions test to serai-client for now

* Final cleanup

* Update deny.toml

* Cargo.lock update from merging develop

* Update nightly

Attempt to work around the current CI failure, which is a Rust ICE.

We previously didn't upgrade due to clippy 10134, yet that's been reverted.

* clippy

* clippy

* fmt

* NativeAddress -> SeraiAddress

* Sec fix on non-provided updates and doc fixes

* Add Serai as a Coin

Necessary in order to swap to Serai.

* Add a BlockHash type, used for batch IDs

* Remove origin from InInstruction

Makes InInstructionTarget. Adds RefundableInInstruction with origin.

* Document storage items in in-instructions

* Rename serai/client/tests/serai.rs to updates.rs

It only tested publishing updates and their successful acceptance.
2023-01-20 11:00:18 -05:00
..
src Initial Tendermint implementation (#145) 2022-12-03 18:38:02 -05:00
tests Run latest nightly clippy 2023-01-01 04:18:23 -05:00
Cargo.toml Initial In Instructions pallet and Serai client lib (#233) 2023-01-20 11:00:18 -05:00
LICENSE Update licenses 2023-01-11 23:05:31 -05:00
README.md Update runtime commentary in Tendermint 2022-12-05 09:04:50 -05:00

Tendermint

An implementation of the Tendermint state machine in Rust.

This is solely the state machine, intended to be mapped to any arbitrary system. It supports an arbitrary signature scheme, weighting, and block definition accordingly. It is not intended to work with the Cosmos SDK, solely to be an implementation of the academic protocol.

Caveats

  • Only SCALE serialization is supported currently. Ideally, everything from SCALE to borsh to bincode would be supported. SCALE was chosen due to this being under Serai, which uses Substrate, which uses SCALE. Accordingly, when deciding which of the three (mutually incompatible) options to support...

  • The only supported runtime is tokio due to requiring a sleep implementation. Ideally, the runtime choice will be moved to a feature in the future.

  • It is possible for add_block to be called on a block which failed (or never went through in the first place) validation. This is a break from the paper which is accepted here. This is for two reasons.

    1. Serai needing this functionality.
    2. If a block is committed which is invalid, either there's a malicious majority now defining consensus OR the local node is malicious by virtue of being faulty. Considering how either represents a fatal circumstance, except with regards to system like Serai which have their own logic for pseudo-valid blocks, it is accepted as a possible behavior with the caveat any consumers must be aware of it. No machine will vote nor precommit to a block it considers invalid, so for a network with an honest majority, this is a non-issue.

Paper

The paper describes the algorithm with pseudocode on page 6. This pseudocode isn't directly implementable, nor does it specify faulty behavior. Instead, it's solely a series of conditions which trigger events in order to successfully achieve consensus.

The included pseudocode segments can be minimally described as follows:

01-09 Init
10-10 StartRound(0)
11-21 StartRound
22-27 Fresh proposal
28-33 Proposal building off a valid round with prevotes
34-35 2f+1 prevote -> schedule timeout prevote
36-43 First proposal with prevotes -> precommit Some
44-46 2f+1 nil prevote -> precommit nil
47-48 2f+1 precommit -> schedule timeout precommit
49-54 First proposal with precommits -> finalize
55-56 f+1 round > local round, jump
57-60 on timeout propose
61-64 on timeout prevote
65-67 on timeout precommit

The corresponding Rust code implementing these tasks are marked with their related line numbers.