From 4b4874e8b6ee37cdddfc142c3176972b98e2b38e Mon Sep 17 00:00:00 2001 From: Jitendra Bhurat Date: Fri, 7 Feb 2020 14:59:52 -0500 Subject: [PATCH] IBFT Documentation (#935) --- docs/Consensus/Consensus.md | 2 +- docs/Consensus/ibft/ibft.md | 184 ++++++++++++++++++ .../ibft/images/IBFTStateTransition.png | Bin 0 -> 48554 bytes mkdocs.yml | 1 + 4 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 docs/Consensus/ibft/ibft.md create mode 100644 docs/Consensus/ibft/images/IBFTStateTransition.png diff --git a/docs/Consensus/Consensus.md b/docs/Consensus/Consensus.md index 97857c83d..b83a7f2d4 100644 --- a/docs/Consensus/Consensus.md +++ b/docs/Consensus/Consensus.md @@ -5,7 +5,7 @@ With no need for POW/POS in a permissioned network, Quorum instead offers multip * __Raft-based Consensus__: A consensus model for faster blocktimes, transaction finality, and on-demand block creation. See [Raft-based consensus for Ethereum/Quorum](../raft) for more information -* __Istanbul BFT (Byzantine Fault Tolerance) Consensus__: A PBFT-inspired consensus algorithm with transaction finality, by AMIS. See [Istanbul BFT Consensus documentation](https://github.com/ethereum/EIPs/issues/650), the [RPC API](../ibft/istanbul-rpc-api.md), and this [technical web article](https://medium.com/getamis/istanbul-bft-ibft-c2758b7fe6ff) for more information +* __Istanbul BFT (Byzantine Fault Tolerance) Consensus__: A PBFT-inspired consensus algorithm with immediate transaction finality, by AMIS. See [Istanbul BFT Consensus documentation](../ibft/ibft), the [RPC API](../ibft/istanbul-rpc-api), and this [technical web article](https://medium.com/getamis/istanbul-bft-ibft-c2758b7fe6ff) for more information * __Clique POA Consensus__: a default POA consensus algorithm bundled with Go Ethereum. See [Clique POA Consensus Documentation](https://github.com/ethereum/EIPs/issues/225) and a [guide to setup clique json](https://hackernoon.com/hands-on-creating-your-own-local-private-geth-node-beginner-friendly-3d45902cc612) with [puppeth](https://blog.ethereum.org/2017/04/14/geth-1-6-puppeth-master/) diff --git a/docs/Consensus/ibft/ibft.md b/docs/Consensus/ibft/ibft.md new file mode 100644 index 000000000..cc764d314 --- /dev/null +++ b/docs/Consensus/ibft/ibft.md @@ -0,0 +1,184 @@ +# IBFT Consensus Overview + +## Introduction + +Istanbul Byzantine Fault Tolerant (IBFT) consensus is inspired by Castro-Liskov 99 [paper](http://pmg.csail.mit.edu/papers/osdi99.pdf). IBFT inherits from the original PBFT by using a 3-phase consensus, `PRE-PREPARE`, `PREPARE` and `COMMIT`. The system can tolerate at most `F` faulty nodes in a `N` validator network, where `N = 3F + 1`. + +## Implementation + +### Terminology + +- `Validator`: Block validation participant. +- `Proposer`: A block validation participant that is chosen to propose block in a consensus round. +- `Round`: Consensus round. A round starts with the proposer creating a block proposal and ends with a block commitment or round change. +- `Proposal`: New block generation proposal which is undergoing consensus processing. +- `Sequence`: Sequence number of a proposal. A sequence number should be greater than all previous sequence numbers. Currently each proposed block height is its associated sequence number. +- `Backlog`: The storage to keep future consensus messages. +- `Round state`: Consensus messages of a specific sequence and round, including pre-prepare message, prepare message, and commit message. +- `Consensus proof`: The commitment signatures of a block that can prove the block has gone through the consensus process. +- `Snapshot`: The validator voting state from last epoch. + +### Consensus +Istanbul BFT Consensus protocol begins at Round `0` with the validators picking a proposer from themselves in a round robin fashion. The proposer will then propose a new block proposal and broadcast it along with the `PRE-PREPARE` message. Upon receiving the `PRE-PREPARE` message from the proposer, other validators validate the incoming proposal and enter the state of `PRE-PREPARED` and broadcast `PREPARE` message. This step is to make sure all validators are working on the same sequence and on the same round. When `ceil(2N/3)` of `PREPARE` messages is received by the validator from other validators, the validator switches to the state of `PREPARED` and broadcasts `COMMIT` message. This step is to inform other validators that it accepts the proposed block and is going to insert the block to the chain. Lastly, validators wait for `ceil(2N/3)` of `COMMIT` messages to enter `COMMITTED` state and then append the block to the chain. + +Blocks in Istanbul BFT protocol are final, which means that there are no forks and any valid block must be somewhere in the main chain. To prevent a faulty node from generating a totally different chain from the main chain, each validator appends `ceil(2N/3)` of received `COMMIT` signatures to `extraData` field in the header before inserting it into the chain. Thus all blocks are self-verifiable. However, the dynamic `extraData` would cause an issue on block hash calculation. Since the same block from different validators can have different set of `COMMIT` signatures, the same block can have different block hashes as well. To solve this, we calculate the block hash by excluding the `COMMIT` signatures part. Therefore, we can still keep the block/block hash consistency as well as put the consensus proof in the block header. + +#### Consensus States +Istanbul BFT is a state machine replication algorithm. Each validator maintains a state machine replica in order to reach block consensus. Various states in IBFT consensus are, + +- `NEW ROUND`: Proposer to send new block proposal. Validators wait for `PRE-PREPARE` message. +- `PRE-PREPARED`: A validator has received `PRE-PREPARE` message and broadcasts `PREPARE` message. Then it waits for `ceil(2N/3)` of `PREPARE` or `COMMIT` messages. +- `PREPARED`: A validator has received `ceil(2N/3)` of `PREPARE` messages and broadcasts `COMMIT` messages. Then it waits for `ceil(2N/3)` of `COMMIT` messages. +- `COMMITTED`: A validator has received `ceil(2N/3)` of `COMMIT` messages and is able to insert the proposed block into the blockchain. +- `FINAL COMMITTED`: A new block is successfully inserted into the blockchain and the validator is ready for the next round. +- `ROUND CHANGE`: A validator is waiting for `ceil(2N/3)` of `ROUND CHANGE` messages on the same proposed round number. + +**State Transitions**: +![State Transitions](images/IBFTStateTransition.png) + +- `NEW ROUND` -> `PRE-PREPARED`: + - **Proposer** collects transactions from txpool. + - **Proposer** generates a block proposal and broadcasts it to validators. It then enters the `PRE-PREPARED` state. + - Each **validator** enters `PRE-PREPARED` upon receiving the `PRE-PREPARE` message with the following conditions: + - Block proposal is from the valid proposer. + - Block header is valid. + - Block proposal's sequence and round match the **validator**'s state. + - **Validator** broadcasts `PREPARE` message to other validators. +- `PRE-PREPARED` -> `PREPARED`: + - Validator receives `ceil(2N/3)` of valid `PREPARE` messages to enter `PREPARED` state. Valid messages conform to the following conditions: + - Matched sequence and round. + - Matched block hash. + - Messages are from known validators. + - Validator broadcasts `COMMIT` message upon entering `PREPARED` state. +- `PREPARED` -> `COMMITTED`: + - **Validator** receives `ceil(2N/3)` of valid `COMMIT` messages to enter `COMMITTED` state. Valid messages conform to the following conditions: + - Matched sequence and round. + - Matched block hash. + - Messages are from known validators. +- `COMMITTED` -> `FINAL COMMITTED`: + - **Validator** appends `ceil(2N/3)` commitment signatures to `extraData` and tries to insert the block into the blockchain. + - **Validator** enters `FINAL COMMITTED` state when insertion succeeds. +- `FINAL COMMITTED` -> `NEW ROUND`: + - **Validators** pick a new **proposer** and begin a new round timer. + +#### Round change flow + +- There are three conditions that would trigger `ROUND CHANGE`: + - Round change timer expires. + - Invalid `PREPREPARE` message. + - Block insertion fails. +- When a validator notices that one of the above conditions applies, it broadcasts a `ROUND CHANGE` message along with the proposed round number and waits for `ROUND CHANGE` messages from other validators. The proposed round number is selected based on following condition: + - If the validator has received `ROUND CHANGE` messages from its peers, it picks the largest round number which has `F + 1` of `ROUND CHANGE` messages. + - Otherwise, it picks `1 + current round number` as the proposed round number. +- Whenever a validator receives `F + 1` of `ROUND CHANGE` messages on the same proposed round number, it compares the received one with its own. If the received is larger, the validator broadcasts `ROUND CHANGE` message again with the received number. +- Upon receiving `ceil(2N/3)` of `ROUND CHANGE` messages on the same proposed round number, the **validator** exits the round change loop, calculates the new **proposer**, and then enters `NEW ROUND` state. +- Another condition that a validator jumps out of round change loop is when it receives verified block(s) through peer synchronization. + +#### Proposer selection + +Currently we support two policies: **round robin** and **sticky proposer**. + +- Round robin: Round robin is the default proposer selection policy. In this setting proposer will change in every block and round change. +- Sticky proposer: in a sticky proposer setting, proposer will change only when a round change happens. + +#### Validator list voting + +Istanbul BFT uses a similar validator voting mechanism as Clique and copies most of the content from Clique [EIP](https://github.com/ethereum/EIPs/issues/225). Every epoch transaction resets the validator voting, meaning any pending votes for adding/removing a validator are reset. + +For all transactions blocks: + +- Proposer can cast one vote to propose a change to the validators list. +- Only the latest proposal per target beneficiary is kept from a single validator. +- Votes are tallied live as the chain progresses (concurrent proposals allowed). +- Proposals reaching majority consensus `VALIDATOR_LIMIT` come into effect immediately. +- Invalid proposals are not to be penalized for client implementation simplicity. +- A proposal coming into effect entails discarding all pending votes for that proposal (both for and against) and starts with a clean slate. + +#### Future message and backlog + +In an asynchronous network environment, one may receive future messages which cannot be processed in the current state. For example, a validator can receive `COMMIT` messages on `NEW ROUND`. We call this kind of message a "future message." When a validator receives a future message, it will put the message into its **backlog** and try to process later whenever possible. + +#### Constants +Istanbul BFT define the following constants + +- `EPOCH_LENGTH`: Default: 30000 blocks. Number of blocks after which to checkpoint and reset the pending votes. +- `REQUEST_TIMEOUT`: Timeout for each consensus round before firing a round change in millisecond. +- `BLOCK_PERIOD`: Minimum timestamp difference in seconds between two consecutive blocks. +- `PROPOSER_POLICY`: Proposer selection policy, defaults to round robin. +- `ISTANBUL_DIGEST`: Fixed magic number `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` of `mixDigest` in block header for Istanbul block identification. +- `DEFAULT_DIFFICULTY`: Default block difficulty, which is set to `0x0000000000000001`. +- `EXTRA_VANITY`: Fixed number of extra-data prefix bytes reserved for proposer vanity. + - Suggested `32` bytes to retain the current extra-data allowance and/or use. +- `NONCE_AUTH`: Magic nonce number `0xffffffffffffffff` to vote on adding a validator. +- `NONCE_DROP`: Magic nonce number `0x0000000000000000` to vote on removing a validator. +- `UNCLE_HASH`: Always `Keccak256(RLP([]))` as uncles are meaningless outside of PoW. +- `PREPREPARE_MSG_CODE`: Fixed number `0`. Message code for `PREPREPARE` message. +- `PREPARE_MSG_CODE`: Fixed number `1`. Message code for `PREPARE` message. +- `COMMIT_MSG_CODE`: Fixed number `2`. Message code for `COMMIT` message. +- `ROUND_CHANGE_MSG_CODE`: Fixed number `3`. Message code for `ROUND CHANGE` message +- `VALIDATOR_LIMIT`: Number of validators to pass an authorization or de-authorization proposal. + - Must be `floor(N / 2) + 1` to enforce majority consensus on a chain. + +#### Block Header +Istanbul BFT does not add new block header fields. Instead, it follows Clique in repurposing the `ethash` header fields as follows: + +- `nonce`: Proposer proposal regarding the account defined by the beneficiary field. + - Should be `NONCE_DROP` to propose deauthorizing beneficiary as an existing validator. + - Should be `NONCE_AUTH` to propose authorizing beneficiary as a new validator. + - **Must** be filled with zeroes, `NONCE_DROP` or `NONCE_AUTH` +- `mixHash`: Fixed magic number `0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365` for Istanbul block identification. +- `ommersHash`: Must be `UNCLE_HASH` as uncles are meaningless outside of PoW. +- `timestamp`: Must be at least the parent timestamp + `BLOCK_PERIOD` +- `difficulty`: Must be filled with `0x0000000000000001`. +- `extraData`: Combined field for signer vanity and RLP encoded Istanbul extra data, where Istanbul extra data contains validator list, proposer seal, and commit seals. Istanbul extra data is defined as follows: + ``` + type IstanbulExtra struct { + Validators []common.Address //Validator addresses + Seal []byte //Proposer seal 65 bytes + CommittedSeal [][]byte //Committed seal, 65 * len(Validators) bytes + } + ``` + Thus the `extraData` would be in the form of `EXTRA_VANITY | ISTANBUL_EXTRA` where `|` represents a fixed index to separate vanity and Istanbul extra data (not an actual character for separator). + + - First `EXTRA_VANITY` bytes (fixed) may contain arbitrary proposer vanity data. + - `ISTANBUL_EXTRA` bytes are the RLP encoded Istanbul extra data calculated from `RLP(IstanbulExtra)`, where `RLP()` is RLP encoding function, and `IstanbulExtra` is the Istanbul extra data. + - `Validators`: The list of validators, which **must** be sorted in ascending order. + - `Seal`: The proposer's signature sealing of the header. + - `CommittedSeal`: The list of commitment signature seals as consensus proof. + +#### Block hash, proposer seal and committed seals +The Istanbul block hash calculation is different from the `ethash` block hash calculation due to the following reasons: + +1. The proposer needs to put proposer's seal in `extraData` to prove the block is signed by the chosen proposer. +2. The validators need to put `ceil(2N/3)` of committed seals as consensus proof in `extraData` to prove the block has gone through consensus. + +The calculation is still similar to the `ethash` block hash calculation, with the exception that we need to deal with `extraData`. We calculate the fields as follows: + +##### Proposer seal calculation +By the time of proposer seal calculation, the committed seals are still unknown, so we calculate the seal with those unknowns empty. The calculation is as follows: + +- `Proposer seal`: `SignECDSA(Keccak256(RLP(Header)), PrivateKey)` +- `PrivateKey`: Proposer's private key. +- `Header`: Same as `ethash` header only with a different `extraData`. +- `extraData`: `vanity | RLP(IstanbulExtra)`, where in the `IstanbulExtra`, `CommittedSeal` and `Seal` are empty arrays. + +##### Block hash calculation +While calculating block hash, we need to exclude committed seals since that data is dynamic between different validators. Therefore, we make `CommittedSeal` an empty array while calculating the hash. The calculation is: + +- `Header`: Same as `ethash` header only with a different `extraData`. +- `extraData`: `vanity | RLP(IstanbulExtra)`, where in the `IstanbulExtra`, `CommittedSeal` is an empty array. + +##### Consensus proof +Before inserting a block into the blockchain, each validator needs to collect `ceil(2N/3)` of committed seals from other validators to compose a consensus proof. Once it receives enough committed seals, it will fill the `CommittedSeal` in `IstanbulExtra`, recalculate the `extraData`, and then insert the block into the blockchain. **Note** that since committed seals can differ by different sources, we exclude that part while calculating the block hash as in the previous section. + +Committed seal calculation: + +Committed seal is calculated by each of the validators signing the hash along with `COMMIT_MSG_CODE` message code of its private key. The calculation is as follows: + +- `Committed seal`: `SignECDSA(Keccak256(CONCAT(Hash, COMMIT_MSG_CODE)), PrivateKey)`. +- `CONCAT(Hash, COMMIT_MSG_CODE)`: Concatenate block hash and `COMMIT_MSG_CODE` bytes. +- `PrivateKey`: Signing validator's private key. + + +## Provenance +Istanbul BFT implementation in Quorum is based on [EIP 650](https://github.com/ethereum/EIPs/issues/650). It has been updated since the EIP was opened to resolve safety issues by introducing locking. diff --git a/docs/Consensus/ibft/images/IBFTStateTransition.png b/docs/Consensus/ibft/images/IBFTStateTransition.png new file mode 100644 index 0000000000000000000000000000000000000000..255d667dae23a9db225274b3e39b0461c7dfa77e GIT binary patch literal 48554 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