state: require block.Time of the fist block to be genesis time (#2594)

* require block.Time of the fist block to be genesis time

Refs #2587:

```
We only start validating block.Time when Height > 1, because there is no
commit to compute the median timestamp from for the first block. This
means a faulty proposer could make the first block with whatever time
they want.

Instead, we should require the timestamp of block 1 to match the genesis
time.

I discovered this while refactoring the ValidateBlock tests to be
table-driven while working on tests for #2560.
```

* do not accept blocks with negative height

* update changelog and spec

* nanos precision for test genesis time

* Fix failing test (#2607)
This commit is contained in:
Anton Kaliaev
2018-10-12 09:03:58 +04:00
committed by Ethan Buchman
parent 3744e8271d
commit e1538bf67e
11 changed files with 48 additions and 21 deletions

View File

@@ -230,6 +230,15 @@ It must equal the weighted median of the timestamps of the valid votes in the bl
Note: the timestamp of a vote must be greater by at least one millisecond than that of the
block being voted on.
The timestamp of the first block must be equal to the genesis time (since
there's no votes to compute the median).
```
if block.Header.Height == 1 {
block.Header.Timestamp == genesisTime
}
```
See the section on [BFT time](../consensus/bft-time.md) for more details.
### NumTxs