# rated-list-specs - part 1.2
Our starting point assumes that a peer-to-peer (P2P) network layout is already established. For example:

Our target is to convert the p2p network into a p2p tree. Here are some points to clarify:
- To convert it, we will currently use brute-force methods, without employing any dictionaries or search algorithms.
- Each node will have its own P2P tree; however, the route will be similar, with the only difference being the root node.
- Each node downloads and custodies a minimum of CUSTODY_REQUIREMENT rows and CUSTODY_REQUIREMENT columns per slot and link the sample with node id.
ref: https://ethresear.ch/t/peerdas-a-simpler-das-approach-using-battle-tested-p2p-components/16541
#### get_custody_columns function
```
def get_custody_columns(node_id: NodeID, custody_subnet_count: uint64) -> Sequence[ColumnIndex]:
assert custody_subnet_count <= DATA_COLUMN_SIDECAR_SUBNET_COUNT
subnet_ids: List[uint64] = []
current_id = uint256(node_id)
while len(subnet_ids) < custody_subnet_count:
subnet_id = (
bytes_to_uint64(hash(uint_to_bytes(uint256(current_id)))[0:8])
% DATA_COLUMN_SIDECAR_SUBNET_COUNT
)
if subnet_id not in subnet_ids:
subnet_ids.append(subnet_id)
if current_id == UINT256_MAX:
# Overflow prevention
current_id = NodeID(0)
current_id += 1
assert len(subnet_ids) == len(set(subnet_ids))
columns_per_subnet = NUMBER_OF_COLUMNS // DATA_COLUMN_SIDECAR_SUBNET_COUNT
return sorted([
ColumnIndex(DATA_COLUMN_SIDECAR_SUBNET_COUNT * i + subnet_id)
for i in range(columns_per_subnet)
for subnet_id in subnet_ids
])
```
- For the rating function, we will assess the block's rate, with each node linked to a block. The time interval for rating the block should be defined, for example, as half an hour. "Due to the deterministic custody functions, a node knows exactly what a peer should be able to respond to. In the event that a peer does not respond to samples of their custodied rows/columns, a node may downscore or disconnect from a peer."
## Next step for the spec definition
Instead of constructing the P2P tree, the specification should focus on a local point. Certain functions and structures need to be defined:
`Data Structure:` Defines the entire peer relationships.
`Score Structure:` Maintains and updates the score.
`List Function:` A function that can be called from a node to list all the peers.
`Score Function:` Updates the score to refresh all nodes.
The data structure and score structure are crucial, as they should enable quick identification of peers from whom we can request samples.
The example of these structure can be refered from the consensus repo ():
https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#get_block_root