Skip to content

Commit

Permalink
add: get_extended_sample_count with test (#6544)
Browse files Browse the repository at this point in the history
* add: get_extended_sample_count with test

* drop return

* reviews

* review fix

* fixed

* fix doc

* hooked to all_tests

* rm bin

* add updated test file

* early return, maybe need results?

* refactor function intricacies

* drop columnsCount
  • Loading branch information
agnxsh authored Sep 12, 2024
1 parent 16c21e1 commit f53b621
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 1 deletion.
7 changes: 6 additions & 1 deletion AllTests-mainnet.md
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,11 @@ OK: 10/12 Fail: 0/12 Skip: 2/12
+ snapshot_cases OK
```
OK: 5/5 Fail: 0/5 Skip: 0/5
## EIP-7594 Sampling Tests
```diff
+ EIP7594: Extended Sample Count OK
```
OK: 1/1 Fail: 0/1 Skip: 0/1
## EL Configuration
```diff
+ Empty config file OK
Expand Down Expand Up @@ -1114,4 +1119,4 @@ OK: 2/2 Fail: 0/2 Skip: 0/2
OK: 9/9 Fail: 0/9 Skip: 0/9

---TOTAL---
OK: 759/764 Fail: 0/764 Skip: 5/764
OK: 760/765 Fail: 0/765 Skip: 5/765
26 changes: 26 additions & 0 deletions beacon_chain/spec/eip7594_helpers.nim
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,29 @@ func get_custody_column_list*(node_id: NodeId,
NUMBER_OF_COLUMNS div DATA_COLUMN_SIDECAR_SUBNET_COUNT

sortedColumnIndexList(ColumnIndex(columns_per_subnet), subnet_ids)

# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/_features/eip7594/peer-sampling.md#get_extended_sample_count
func get_extended_sample_count*(samples_per_slot: int,
allowed_failures: int):
int =
## `get_extended_sample_count` computes the number of samples we
## should query from peers, given the SAMPLES_PER_SLOT and
## the number of allowed failures

# If 50% of the columns are missing, we are able to reconstruct the data
# If 50% + 1 columns are missing, we cannot reconstruct the data
const worstCaseConditionCount = (NUMBER_OF_COLUMNS div 2) + 1

# Compute the false positive threshold
let falsePositiveThreshold =
hypergeom_cdf(0, NUMBER_OF_COLUMNS, worstCaseConditionCount, samples_per_slot)

# Finally, compute the extended sample count
for i in samples_per_slot .. NUMBER_OF_COLUMNS:
if hypergeom_cdf(
allowed_failures,
NUMBER_OF_COLUMNS,
worstCaseConditionCount, i) <= falsePositiveThreshold:
return i

NUMBER_OF_COLUMNS
1 change: 1 addition & 0 deletions tests/all_tests.nim
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import # Unit test
./test_discovery,
./test_engine_api_conversions,
./test_engine_authentication,
./test_eip7594_helpers,
./test_el_manager,
./test_el_conf,
./test_eth2_ssz_serialization,
Expand Down
46 changes: 46 additions & 0 deletions tests/test_eip7594_helpers.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# beacon_chain
# Copyright (c) 2018-2024 Status Research & Development GmbH
# Licensed and distributed under either of
# * MIT license (license terms in the root directory or at https://opensource.org/licenses/MIT).
# * Apache v2 license (license terms in the root directory or at https://www.apache.org/licenses/LICENSE-2.0).
# at your option. This file may not be copied, modified, or distributed except according to those terms.

{.push raises: [].}
{.used.}

import
unittest2,
../beacon_chain/spec/[helpers, eip7594_helpers]

suite "EIP-7594 Sampling Tests":
test "EIP7594: Extended Sample Count":
proc testExtendedSampleCount() =
let samplesPerSlot = 16
const tests = [
(0, 16),
(1, 20),
(2, 24),
(3, 27),
(4, 29),
(5, 32),
(6, 35),
(7, 37),
(8, 40),
(9, 42),
(10, 44),
(11, 47),
(12, 49),
(13, 51),
(14, 53),
(15, 55),
(16, 57),
(17, 59),
(18, 61),
(19, 63),
(20, 65)
]

for (allowed_failures, extendedSampleCount) in tests:
check: get_extended_sample_count(
samplesPerSlot, allowed_failures) == extendedSampleCount
testExtendedSampleCount()

0 comments on commit f53b621

Please sign in to comment.