# PBTS: Protocol Specification
## Proposal Time
PBTS computes for a proposed value `v` the proposal time `v.time`, with bounded difference to the actual real-time the proposed value was generated.
The proposal time is read from the clock of the process that proposes a value for the first time, its original proposer.
With PBTS, therefore, we assume that processes have access to **synchronized clocks**.
The proper definition of what it means can be found in the [system model][sysmodel],
but essentially we assume that two correct processes do not simultaneous read from their clocks
time values that differ more than `PRECISION`, which is a system parameter.
### Proposal times are definitive
When a value `v` is produced by a process, it also assigns the associated proposal time `v.time`.
If the same value `v` is then re-proposed in a subsequent round of consensus,
it retains its original time, assigned by its original proposer.
A value `v` is re-proposed when it becomes a valid value, i.e., when it receives `2f + 1 PREVOTE`s in a round `r` of consensus.
This means that processes with `2f + 1`-equivalent voting power accepted, in round `r`, both `v` and its associated time `v.time`.
Since the originally proposed value and its associated time were considered valid, there is no reason for reassigning `v.time`.
## Time Monotonicity
Values decided in successive heights of consensus must have increasing times, so:
- Monotonicity: for any process `p` and any two decided heights `h` and `h'`, if `h > h'` then decisionp[h].time > decisionp[h'].time.
For ensuring time monotonicity, it is enough to ensure that a value `v` proposed by process `p` at height hp has v.time > decisionp[hp-1].time.
So, if process `p` is the proposer of a round of height hp and reads from its clock a time nowp <= decisionp[hp-1],
it should postpone the generation of its proposal until nowp > decisionp[hp-1].
> Although it should be considered, this scenario is unlikely during regular operation,
as from decisionp[hp-1].time and the start of height hp, a complete consensus instance need to terminate.
The time monotonicity of values proposed in heights of consensus is verified by the `valid()` predicate, to which every proposed value is submitted.
A value rejected by the `valid()` implementation is not accepted by any correct process.
## Timely Proposals
PBTS introduces a new requirement for a process to accept a proposal: the proposal must be `timely`.
It is a temporal requirement, associated with the following synchrony (that is, timing)
[assumptions][sysmodel] regarding the behavior of processes and the network:
- Synchronized clocks: the values simultaneously read from clocks of any two correct processes differ by at most `PRECISION`;
- Bounded transmission delays: the real time interval between the sending of a proposal at a correct process, and the reception of the proposal at any correct process is upper bounded by `MSGDELAY`.
#### **[PBTS-RECEPTION-STEP.1]**
Let nowp be the time, read from the clock of process `p`, at which `p` receives the proposed value `v`.
The proposal is considered `timely` by `p` when:
1. nowp >= v.time - PRECISION
1. nowp <= v.time + MSGDELAY + PRECISION
The first condition derives from the fact that the generation and sending of `v` precedes its reception.
The minimum receiving time nowp for `v` be considered `timely` by `p` is derived from the extreme scenario when
the clock of `p` is `PRECISION` *behind* of the clock of the proposer of `v`, and the proposal's transmission delay is `0` (minimum).
The second condition derives from the assumption of an upper bound for the transmission delay of a proposal.
The maximum receiving time nowp for `v` be considered `timely` by `p` is derived from the extreme scenario when
the clock of `p` is `PRECISION` *ahead* of the clock of the proposer of `v`, and the proposal's transmission delay is `MSGDELAY` (maximum).
## Updated Consensus Algorithm
The following changes are proposed for the algorithm in the [arXiv paper][arXiv].
#### New `StartRound` (Lines 11 - 21)
There are two additions to the `propose` round step when executed by the `proposer` of a round:
1. The proposer does not propose a value until its current local time becomes greater than the previously decided value's time;
1. When the proposer produces a new proposal, it sets the proposal's time to its current local time;
- No changes are made to the logic when a proposer re-proposes its `validValue`, which retains its original proposal time.
```go
function StartRound(round) {
round_p ← round
step_p ← propose
if proposer(h_p, round_p) = p {
wait until now_p > decision_p[h_p-1].time // time monotonicity
if validValue_p != nil {
proposal ← validValue_p
} else {
proposal ← getValue()
proposal.time ← now_p // proposal time
}
broadcast ⟨PROPOSAL, h_p, round_p, proposal, validRound_p⟩
} else {
schedule OnTimeoutPropose(h_p,round_p) to be executed after timeoutPropose(round_p)
}
}
```
#### New rule for accepting values (Lines 22 - 27)
The rule on line 22 applies to values `v` proposed for the first time, i.e., for proposals not backed by `PREVOTE`s for `v` in a previous round `vr < r`.
The `PROPOSAL` message, in this case, carry `-1` in its `validRound` field.
The new rule for issuing a `PREVOTE` for a proposed value `v` requires the value to be `timely`.
The `timely` predicate is evaluated in the moment that the value is received,
as part of a `PROPOSAL` message, by comparing the process local time with `v.time`.
```go
upon ⟨PROPOSAL, h_p, round_p, v, −1⟩ from proposer(h_p, round_p) while step_p = propose do {
if timely(v.time) ∧ valid(v) ∧ (lockedRound_p = −1 ∨ lockedValue_p = v) {
broadcast ⟨PREVOTE, h_p, round_p, id(v)⟩
}
else {
broadcast ⟨PREVOTE, h_p, round_p, nil⟩
}
step_p ← prevote
}
```
#### All other rules remains unchanged
Notice, in particular, that the rule on line 28 for values re-proposed, and backed by `2f + 1`-equivalent voting power `PREVOTE` messages, is not affected by the changes.
Back to [main document][main].
[main]: ./README.md
[sysmodel]: ./pbts-sysmodel_002_draft.md
[bfttime]: https://github.com/tendermint/tendermint/blob/master/spec/consensus/bft-time.md
[arXiv]: https://arxiv.org/pdf/1807.04938.pdf