You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The previous description of when an epoch ends was a bit confusing. It
mentioned that two conditions are needed for a block to be the last
block of an epoch, but in reality only one of them matters, as one
condition is implied by the other. This makes the descripion harder to
parse - why are there two conditions, if only one of them matters? It
can lead to some confusion.
Let's improve the description to make it clearer and easier to
understand. A diagram is also added for clarity.
Refs: [zulip
discussion](https://near.zulipchat.com/#narrow/stream/295558-pagoda.2Fcore/topic/When.20does.20an.20Epoch.20end.3F/near/422463251)
---------
Co-authored-by: Marcelo Fornet <[email protected]>
`epoch_length` is defined in `genesis_config` and has a value of `43200` height delta on mainnet (12 hours at 1 block per second).
19
21
22
+
Since every final block must have two more blocks on top of it, it means that the last block in an epoch will have a height of at least `block.last_finalized_height + 2`, so for the last block it holds that `block.height + 1 >= estimated_next_epoch_start`. Its height will be at least `estimated_next_epoch_start - 1`.
23
+
24
+
Note that an epoch only ends when there is a final block above a certain height. If there are no final blocks, the epoch will be stretched until the required final block appears. An epoch can potentially be longer than `epoch_length`.
25
+
26
+

27
+
20
28
### EpochHeight
29
+
21
30
Epochs on one chain can be identified by height, which is defined the following way:
31
+
22
32
- Special epoch that contains genesis block only: undefined
23
33
- Epoch starting from the block that's after genesis: `0` (NOTE: in current implementation it's `1` due to a bug, so there are two epochs with height `1`)
24
34
- Following epochs: height of the parent epoch plus one
25
35
26
36
### Epoch id
37
+
27
38
Every block stores the id of its epoch - `epoch_id`.
28
39
29
40
Epoch id is defined as
41
+
30
42
- For special genesis block epoch it's `0`
31
43
- For epoch with height `0` it's `0` (NOTE: the first two epochs use the same epoch id)
32
44
- For epoch with height `1` it's the hash of genesis block
33
45
- For epoch with height `T+2` it's the hash of the last block in epoch `T`
34
46
35
-
### End of an epoch
47
+
### Epoch end
48
+
36
49
- After processing the last block of epoch `T`, `EpochManager` aggregates information from block of the epoch, and computes
37
50
validator set for epoch `T+2`. This process is described in [EpochManager](EpochManager.md).
38
51
- After that, the validator set rotates to epoch `T+1`, and the next block is produced by the validator from the new set
0 commit comments