add: recover matrix (#6553)
This commit is contained in:
parent
205dff3378
commit
1feeff4f92
|
@ -539,8 +539,9 @@ OK: 1/1 Fail: 0/1 Skip: 0/1
|
|||
## EIP-7594 Unit Tests
|
||||
```diff
|
||||
+ EIP-7594: Compute Matrix OK
|
||||
+ EIP:7594: Recover Matrix OK
|
||||
```
|
||||
OK: 1/1 Fail: 0/1 Skip: 0/1
|
||||
OK: 2/2 Fail: 0/2 Skip: 0/2
|
||||
## EL Configuration
|
||||
```diff
|
||||
+ Empty config file OK
|
||||
|
@ -1124,4 +1125,4 @@ OK: 2/2 Fail: 0/2 Skip: 0/2
|
|||
OK: 9/9 Fail: 0/9 Skip: 0/9
|
||||
|
||||
---TOTAL---
|
||||
OK: 761/766 Fail: 0/766 Skip: 5/766
|
||||
OK: 762/767 Fail: 0/767 Skip: 5/767
|
||||
|
|
|
@ -120,6 +120,41 @@ proc compute_matrix*(blobs: seq[KzgBlob]): Result[seq[MatrixEntry], cstring] =
|
|||
|
||||
ok(extended_matrix)
|
||||
|
||||
# https://github.com/ethereum/consensus-specs/blob/v1.5.0-alpha.5/specs/_features/eip7594/das-core.md#recover_matrix
|
||||
proc recover_matrix*(partial_matrix: seq[MatrixEntry],
|
||||
blobCount: int):
|
||||
Result[seq[MatrixEntry], cstring] =
|
||||
## This helper demonstrates how to apply recover_cells_and_kzg_proofs
|
||||
## The data structure for storing cells is implementation-dependent
|
||||
var extended_matrix: seq[MatrixEntry]
|
||||
for blob_index in 0..<blobCount:
|
||||
var
|
||||
cell_indices: seq[CellIndex]
|
||||
cells: seq[Cell]
|
||||
|
||||
for e in partial_matrix:
|
||||
if e.row_index == uint64(blob_index):
|
||||
cell_indices.add(e.column_index)
|
||||
cells.add(e.cell)
|
||||
|
||||
let recoveredCellsAndKzgProofs =
|
||||
recoverCellsAndKzgProofs(cell_indices, cells)
|
||||
if not recoveredCellsAndKzgProofs.isOk:
|
||||
return err("Issue in recovering cells and proofs")
|
||||
|
||||
for i in 0..<recoveredCellsAndKzgProofs.get.cells.len:
|
||||
let
|
||||
cell = recoveredCellsAndKzgProofs.get.cells[i]
|
||||
proof = recoveredCellsAndKzgProofs.get.proofs[i]
|
||||
extended_matrix.add(MatrixEntry(
|
||||
cell: cell,
|
||||
kzg_proof: proof,
|
||||
row_index: blob_index.uint64,
|
||||
column_index: i.uint64
|
||||
))
|
||||
|
||||
ok(extended_matrix)
|
||||
|
||||
# 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):
|
||||
|
|
|
@ -66,6 +66,34 @@ suite "EIP-7594 Unit Tests":
|
|||
doAssert len(row) == kzg_abi.CELLS_PER_EXT_BLOB
|
||||
testComputeExtendedMatrix()
|
||||
|
||||
test "EIP:7594: Recover Matrix":
|
||||
proc testRecoverMatrix() =
|
||||
var rng = initRand(126)
|
||||
|
||||
# Number of samples we shall be recovering
|
||||
const N_SAMPLES = kzg_abi.CELLS_PER_EXT_BLOB div 2
|
||||
|
||||
# Compute an extended matrix with a random
|
||||
# blob count for this test
|
||||
let
|
||||
blob_count = rng.rand(1..(NUMBER_OF_COLUMNS.int))
|
||||
blobs = createSampleKzgBlobs(blob_count, rng.rand(int))
|
||||
extended_matrix = compute_matrix(blobs)
|
||||
|
||||
# Construct a matrix with some entries missing
|
||||
var partial_matrix: seq[MatrixEntry]
|
||||
for blob_entries in chunks(extended_matrix.get, kzg_abi.CELLS_PER_EXT_BLOB):
|
||||
var blb_entry = blob_entries
|
||||
rng.shuffle(blb_entry)
|
||||
partial_matrix.add(blb_entry[0..N_SAMPLES-1])
|
||||
|
||||
# Given the partial matrix, recover the missing entries
|
||||
let recovered_matrix = recover_matrix(partial_matrix, blob_count)
|
||||
|
||||
# Ensure that the recovered matrix matches the original matrix
|
||||
doAssert recovered_matrix.get == extended_matrix.get, "Both matrices don't match!"
|
||||
testRecoverMatrix()
|
||||
|
||||
suite "EIP-7594 Sampling Tests":
|
||||
test "EIP7594: Extended Sample Count":
|
||||
proc testExtendedSampleCount() =
|
||||
|
|
Loading…
Reference in New Issue