2021-08-18 17:11:38 -06:00
# Data Availability Sampling -- Fork Choice
2020-01-15 16:03:07 -07:00
**Notice**: This document is a work-in-progress for researchers and implementers.
## Table of contents
2021-03-18 00:07:15 +01:00
2020-01-15 16:03:07 -07:00
<!-- TOC -->
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE - RUN doctoc TO UPDATE -->
- [Introduction ](#introduction )
2020-12-11 16:10:50 +08:00
- [Dependency calculation ](#dependency-calculation )
2020-01-15 16:03:07 -07:00
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
<!-- /TOC -->
2021-03-18 00:07:15 +01:00
2020-01-15 16:03:07 -07:00
## Introduction
2021-08-18 17:11:38 -06:00
This document is the beacon chain fork choice spec for Data Availability Sampling. The only change that we add from phase 0 is that we add a concept of "data dependencies";
2021-03-17 23:44:16 +01:00
a block is only eligible for consideration in the fork choice after a data availability test has been successfully completed for all dependencies.
2021-03-30 01:33:17 +02:00
The "root" of a shard block for data dependency purposes is considered to be a `DataCommitment` object, which is a pair of a Kate commitment and a length.
2020-01-15 16:03:07 -07:00
2020-12-10 14:48:57 +08:00
## Dependency calculation
2020-07-03 10:49:19 +08:00
```python
2020-12-10 14:48:57 +08:00
def get_new_dependencies(state: BeaconState) -> Set[DataCommitment]:
return set(
# Already confirmed during this epoch
[c.commitment for c in state.current_epoch_pending_headers if c.confirmed] +
# Already confirmed during previous epoch
[c.commitment for c in state.previous_epoch_pending_headers if c.confirmed] +
# Confirmed in the epoch before the previous
2020-12-28 16:53:50 +00:00
[c for c in shard for shard in state.grandparent_epoch_confirmed_commitments if c != DataCommitment()]
2020-07-03 10:49:19 +08:00
)
2020-05-01 10:52:45 +08:00
```
```python
2020-12-10 14:48:57 +08:00
def get_all_dependencies(store: Store, block: BeaconBlock) -> Set[DataCommitment]:
2021-04-21 00:24:44 +08:00
if compute_epoch_at_slot(block.slot) < SHARDING_FORK_EPOCH:
2020-12-10 14:48:57 +08:00
return set()
else:
latest = get_new_dependencies(store.block_states[hash_tree_root(block)])
older = get_all_dependencies(store, store.blocks[block.parent_root])
return latest.union(older)
2020-05-01 10:52:45 +08:00
```