go-ethereum/crypto/kzg4844/kzg4844_ckzg_nocgo.go
Csaba Kiraly 35a016346f
Some checks are pending
/ Linux Build (push) Waiting to run
/ Linux Build (arm) (push) Waiting to run
/ Keeper Build (push) Waiting to run
/ Windows Build (push) Waiting to run
/ Docker Image (push) Waiting to run
crypto/kzg4844: add RecoverCells with systematic fast path (#35529)
Add RecoverCells, which returns all CellsPerBlob cells per blob from a
sufficient subset.

RecoverBlobs only exposes recovered blobs; serving or persisting the
extension cells of a sparse-blobpool transaction needs the full 128-cell
set. Add RecoverCells, which returns all CellsPerBlob cells per blob
from a sufficient subset.

When the full data domain (cell indices 0..DataPerBlob-1) is present
(the common case for pooled transactions) the blobs are a free
concatenation of the data cells and every cell follows from a systematic
extension via ComputeCells (~2-6ms/blob), skipping the KZG erasure
solve. Otherwise it falls back to the erasure recovery path
(~15-20ms/blob), which now surfaces the library's full extended cell set
instead of discarding it down to blobs as RecoverBlobs does. Both paths
return byte-identical cells in canonical order.

Cells only; cell proofs are never recomputed (callers retain the proofs
shipped with the transaction). Tested on both the gokzg and ckzg
backends, fast and slow paths, against the original cells.

Note: the same fast-path optimization could also be pushed down to gokzg
and ckzg. There are both arguments for (the primitive becomes faster in
some cases, same for the rest of cases) and against (it is not the role
of the crypto lib to be intelligent here), so I went with the wrapper
for now.
2026-08-19 15:19:32 +02:00

91 lines
3.3 KiB
Go

// Copyright 2023 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
//go:build !ckzg || nacl || js || wasip1 || !cgo || gofuzz
package kzg4844
import "sync"
// ckzgAvailable signals whether the library was compiled into Geth.
const ckzgAvailable = false
// ckzgIniter ensures that we initialize the KZG library once before using it.
var ckzgIniter sync.Once
// ckzgInit initializes the KZG library with the provided trusted setup.
func ckzgInit() {
panic("unsupported platform")
}
// ckzgBlobToCommitment creates a small commitment out of a data blob.
func ckzgBlobToCommitment(blob *Blob) (Commitment, error) {
panic("unsupported platform")
}
// ckzgComputeProof computes the KZG proof at the given point for the polynomial
// represented by the blob.
func ckzgComputeProof(blob *Blob, point Point) (Proof, Claim, error) {
panic("unsupported platform")
}
// ckzgVerifyProof verifies the KZG proof that the polynomial represented by the blob
// evaluated at the given point is the claimed value.
func ckzgVerifyProof(commitment Commitment, point Point, claim Claim, proof Proof) error {
panic("unsupported platform")
}
// ckzgComputeBlobProof returns the KZG proof that is used to verify the blob against
// the commitment.
//
// This method does not verify that the commitment is correct with respect to blob.
func ckzgComputeBlobProof(blob *Blob, commitment Commitment) (Proof, error) {
panic("unsupported platform")
}
// ckzgVerifyBlobProof verifies that the blob data corresponds to the provided commitment.
func ckzgVerifyBlobProof(blob *Blob, commitment Commitment, proof Proof) error {
panic("unsupported platform")
}
// ckzgVerifyCellProofBatch verifies that the blob data corresponds to the provided commitment.
func ckzgVerifyCellProofBatch(blobs []Blob, commitments []Commitment, proof []Proof) error {
panic("unsupported platform")
}
// ckzgComputeCellProofs returns the KZG cell proofs that are used to verify the blob against
// the commitment.
//
// This method does not verify that the commitment is correct with respect to blob.
func ckzgComputeCellProofs(blob *Blob) ([]Proof, error) {
panic("unsupported platform")
}
func ckzgVerifyCells(cells []Cell, commitments []Commitment, cellProofs []Proof, cellIndices []uint64) error {
panic("unsupported platform")
}
func ckzgComputeCells(blobs []Blob) ([]Cell, error) {
panic("unsupported platform")
}
func ckzgRecoverBlobs(cells []Cell, cellIndices []uint64) ([]Blob, error) {
panic("unsupported platform")
}
func ckzgRecoverCells(cells []Cell, cellIndices []uint64) ([]Cell, error) {
panic("unsupported platform")
}