diff --git a/beacon-chain/blockchain/kzg/kzg.go b/beacon-chain/blockchain/kzg/kzg.go index 6c98824826..f7831ea59d 100644 --- a/beacon-chain/blockchain/kzg/kzg.go +++ b/beacon-chain/blockchain/kzg/kzg.go @@ -109,6 +109,7 @@ func VerifyCellKZGProofBatch(commitmentsBytes []Bytes48, cellIndices []uint64, c } // RecoverCellsAndKZGProofs recovers the complete cells and KZG proofs from a given set of cell indices and partial cells. +// Note: `len(cellIndices)` must be equal to `len(partialCells)` and `cellIndices` must be sorted in ascending order. func RecoverCellsAndKZGProofs(cellIndices []uint64, partialCells []Cell) (CellsAndProofs, error) { // Convert `Cell` type to `ckzg4844.Cell` ckzgPartialCells := make([]ckzg4844.Cell, len(partialCells)) diff --git a/beacon-chain/core/peerdas/reconstruction.go b/beacon-chain/core/peerdas/reconstruction.go index 076aa1462e..b27247bc4c 100644 --- a/beacon-chain/core/peerdas/reconstruction.go +++ b/beacon-chain/core/peerdas/reconstruction.go @@ -1,6 +1,8 @@ package peerdas import ( + "sort" + "github.com/OffchainLabs/prysm/v6/beacon-chain/blockchain/kzg" fieldparams "github.com/OffchainLabs/prysm/v6/config/fieldparams" "github.com/OffchainLabs/prysm/v6/config/params" @@ -28,7 +30,8 @@ func MinimumColumnCountToReconstruct() uint64 { // ReconstructDataColumnSidecars reconstructs all the data column sidecars from the given input data column sidecars. // All input sidecars must be committed to the same block. -// `inVerifiedRoSidecars` should contain enough (unique) sidecars to reconstruct the missing columns. +// `inVerifiedRoSidecars` should contain enough sidecars to reconstruct the missing columns, and should not contain any duplicate. +// WARNING: This function sorts inplace `verifiedRoSidecars` by index. func ReconstructDataColumnSidecars(verifiedRoSidecars []blocks.VerifiedRODataColumn) ([]blocks.VerifiedRODataColumn, error) { // Check if there is at least one input sidecar. if len(verifiedRoSidecars) == 0 { @@ -51,18 +54,17 @@ func ReconstructDataColumnSidecars(verifiedRoSidecars []blocks.VerifiedRODataCol } } - // Deduplicate sidecars. - sidecarByIndex := make(map[uint64]blocks.VerifiedRODataColumn, len(verifiedRoSidecars)) - for _, inVerifiedRoSidecar := range verifiedRoSidecars { - sidecarByIndex[inVerifiedRoSidecar.Index] = inVerifiedRoSidecar - } - // Check if there is enough sidecars to reconstruct the missing columns. - sidecarCount := len(sidecarByIndex) + sidecarCount := len(verifiedRoSidecars) if uint64(sidecarCount) < MinimumColumnCountToReconstruct() { return nil, ErrNotEnoughDataColumnSidecars } + // Sort the input sidecars by index. + sort.Slice(verifiedRoSidecars, func(i, j int) bool { + return verifiedRoSidecars[i].Index < verifiedRoSidecars[j].Index + }) + // Recover cells and compute proofs in parallel. var wg errgroup.Group cellsAndProofs := make([]kzg.CellsAndProofs, blobCount) @@ -71,10 +73,10 @@ func ReconstructDataColumnSidecars(verifiedRoSidecars []blocks.VerifiedRODataCol cellsIndices := make([]uint64, 0, sidecarCount) cells := make([]kzg.Cell, 0, sidecarCount) - for columnIndex, sidecar := range sidecarByIndex { + for _, sidecar := range verifiedRoSidecars { cell := sidecar.Column[blobIndex] cells = append(cells, kzg.Cell(cell)) - cellsIndices = append(cellsIndices, columnIndex) + cellsIndices = append(cellsIndices, sidecar.Index) } // Recover the cells and proofs for the corresponding blob diff --git a/changelog/manu-peerdas-c-kzg-update.md b/changelog/manu-peerdas-c-kzg-update.md new file mode 100644 index 0000000000..d9dea64650 --- /dev/null +++ b/changelog/manu-peerdas-c-kzg-update.md @@ -0,0 +1,2 @@ +### Changed +- `c-kzg-4844`: Update from `v2.1.1` to `v2.1.5` diff --git a/deps.bzl b/deps.bzl index d4627d0462..64e6d1983a 100644 --- a/deps.bzl +++ b/deps.bzl @@ -776,8 +776,8 @@ def prysm_deps(): importpath = "github.com/ethereum/c-kzg-4844/v2", patch_args = ["-p1"], patches = ["//third_party:com_github_ethereum_c_kzg_4844.patch"], - sum = "h1:KhzBVjmURsfr1+S3k/VE35T02+AW2qU9t9gr4R6YpSo=", - version = "v2.1.1", + sum = "h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s=", + version = "v2.1.5", ) go_repository( name = "com_github_ethereum_go_ethereum", @@ -3318,8 +3318,8 @@ def prysm_deps(): importpath = "github.com/supranational/blst", patch_args = ["-p1"], patches = ["//third_party:com_github_supranational_blst.patch"], - sum = "h1:xNMoHRJOTwMn63ip6qoWJ2Ymgvj7E2b9jY2FAwY+qRo=", - version = "v0.3.14", + sum = "h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw=", + version = "v0.3.16-0.20250831170142-f48500c1fdbe", ) go_repository( name = "com_github_syndtr_goleveldb", diff --git a/go.mod b/go.mod index 8150a99647..32759e63b7 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/dgraph-io/ristretto/v2 v2.2.0 github.com/dustin/go-humanize v1.0.1 github.com/emicklei/dot v0.11.0 - github.com/ethereum/c-kzg-4844/v2 v2.1.1 + github.com/ethereum/c-kzg-4844/v2 v2.1.5 github.com/ethereum/go-ethereum v1.15.9 github.com/fsnotify/fsnotify v1.6.0 github.com/ghodss/yaml v1.0.0 @@ -70,7 +70,7 @@ require ( github.com/spf13/afero v1.10.0 github.com/status-im/keycard-go v0.2.0 github.com/stretchr/testify v1.10.0 - github.com/supranational/blst v0.3.14 + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b github.com/tyler-smith/go-bip39 v1.1.0 diff --git a/go.sum b/go.sum index 729c264e56..e5ba50cf80 100644 --- a/go.sum +++ b/go.sum @@ -234,8 +234,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/c-kzg-4844/v2 v2.1.1 h1:KhzBVjmURsfr1+S3k/VE35T02+AW2qU9t9gr4R6YpSo= -github.com/ethereum/c-kzg-4844/v2 v2.1.1/go.mod h1:TC48kOKjJKPbN7C++qIgt0TJzZ70QznYR7Ob+WXl57E= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= github.com/ethereum/go-ethereum v1.15.9 h1:bRra1zi+/q+qyXZ6fylZOrlaF8kDdnlTtzNTmNHfX+g= github.com/ethereum/go-ethereum v1.15.9/go.mod h1:+S9k+jFzlyVTNcYGvqFhzN/SFhI6vA+aOY4T5tLSPL0= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1021,8 +1021,8 @@ github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.14 h1:xNMoHRJOTwMn63ip6qoWJ2Ymgvj7E2b9jY2FAwY+qRo= -github.com/supranational/blst v0.3.14/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=