During the BFT-DPOS process, when a BP (say it is producer A) produces a block, it will broadcast to the network. Other BPs will sign the blocks as well. When A receives those signatures, will A append those signatures on the original block that A produced? Does A need to broadcast the block again once "all" signatures for the block are received? Or is it the case that A does not broadcast the block with all signatures, but every BP and full node will append the signatures independently on their own?
BFT signatures are never included directly in the blockchain however, block signatures can be used in lieu of BFT signatures for a set of blocks.
in BFT-DPOS there are 2 classes of signatures and 2 methods for calculating finality:
- DPOS Blockchain based Finality (DPOS)
- BFT Message based Finality (BFT)
And an additional guarantees that BFT finality can be reached "before" DPOS finality but IF BFT finality is reached, DPOS finality is guaranteed unless 2/3rds of the producers commit provably byzantine behavior. And DPOS finality implies BFT finality.
DPOS Blockchain Finality
Every signed block constitutes:
- A pre-commit signature for itself AND N previous blocks (where the value of N is in the block header)
- A commit signature for any block which has at least 2/3 + 1 producers pre-commit signatures.
- This set of blocks is implied by the state of all signatures that preceded this block in the chain.
Once a block receives 2/3 + 1 commit signatures it is considered DPOS final.
As each block signature can actually be considered a signature of one type or another for several blocks this ends up being a very efficient method for finality WRT size. In a nominal network, the cost for proving finality of blocks in a blockchain amortizes out to 1 signature per finalized block.
BFT Message Finality
The downside of DPOS finality is that it will take 4/3 + 2 producers worth of additional blocks in a nominal network to reach finality for a given block. With 21 producers, 12 blocks per producer and 0.5 second block times this produces a latency for DPOS finality of 180 seconds. So, while it is a very efficient pipeline, if you are more concerned with latency we can do better.
BFT Messages are analogues for the above pre-commit and commit signatures made explicitly for one block (as opposed to implicitly for many blocks) and signed/broadcast as fast as possible.
This means once a block has received 2/3 + 1 explicit BFT OR implicit DPOS pre-commit signatures, producers will start signing and broadcasting commit messages for it and once 2/3 + 1 explicit BFT OR implicit DPOS commit signatures are collected a block can be considered BFT final.
In practice this is potentially too many messages at half second blocks however, it does give the producers a facility to explicitly sign on some block interval that is far less than 180 seconds and produce a lower latency proof-of-finality than DPOS alone.
This degrades gracefully to DPOS finality as each DPOS block signature can be used as an implicit substitute for its explicit BFT signature. This means that there exists enough information in the blockchain to prove BFT finality if DPOS finality is reached.