ssz: Move stateutil.SliceRoot to ssz package (#14123)

This commit is contained in:
Preston Van Loon
2024-06-20 15:55:15 -05:00
committed by GitHub
parent df3a9f218d
commit 305d5850e7
8 changed files with 15 additions and 51 deletions

View File

@@ -16,7 +16,6 @@ go_library(
"pending_consolidations_root.go", "pending_consolidations_root.go",
"pending_partial_withdrawals_root.go", "pending_partial_withdrawals_root.go",
"reference.go", "reference.go",
"slice_root.go",
"sync_committee.root.go", "sync_committee.root.go",
"trie_helpers.go", "trie_helpers.go",
"unrealized_justification.go", "unrealized_justification.go",

View File

@@ -2,9 +2,10 @@ package stateutil
import ( import (
fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams"
"github.com/prysmaticlabs/prysm/v5/encoding/ssz"
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
) )
func HistoricalSummariesRoot(summaries []*ethpb.HistoricalSummary) ([32]byte, error) { func HistoricalSummariesRoot(summaries []*ethpb.HistoricalSummary) ([32]byte, error) {
return SliceRoot(summaries, fieldparams.HistoricalRootsLength) return ssz.SliceRoot(summaries, fieldparams.HistoricalRootsLength)
} }

View File

@@ -2,9 +2,10 @@ package stateutil
import ( import (
fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams"
"github.com/prysmaticlabs/prysm/v5/encoding/ssz"
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
) )
func PendingBalanceDepositsRoot(slice []*ethpb.PendingBalanceDeposit) ([32]byte, error) { func PendingBalanceDepositsRoot(slice []*ethpb.PendingBalanceDeposit) ([32]byte, error) {
return SliceRoot(slice, fieldparams.PendingBalanceDepositsLimit) return ssz.SliceRoot(slice, fieldparams.PendingBalanceDepositsLimit)
} }

View File

@@ -2,9 +2,10 @@ package stateutil
import ( import (
fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams"
"github.com/prysmaticlabs/prysm/v5/encoding/ssz"
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
) )
func PendingConsolidationsRoot(slice []*ethpb.PendingConsolidation) ([32]byte, error) { func PendingConsolidationsRoot(slice []*ethpb.PendingConsolidation) ([32]byte, error) {
return SliceRoot(slice, fieldparams.PendingConsolidationsLimit) return ssz.SliceRoot(slice, fieldparams.PendingConsolidationsLimit)
} }

View File

@@ -2,9 +2,10 @@ package stateutil
import ( import (
fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams" fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams"
"github.com/prysmaticlabs/prysm/v5/encoding/ssz"
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
) )
func PendingPartialWithdrawalsRoot(slice []*ethpb.PendingPartialWithdrawal) ([32]byte, error) { func PendingPartialWithdrawalsRoot(slice []*ethpb.PendingPartialWithdrawal) ([32]byte, error) {
return SliceRoot(slice, fieldparams.PendingPartialWithdrawalsLimit) return ssz.SliceRoot(slice, fieldparams.PendingPartialWithdrawalsLimit)
} }

View File

@@ -7,6 +7,7 @@ go_library(
"helpers.go", "helpers.go",
"htrutils.go", "htrutils.go",
"merkleize.go", "merkleize.go",
"slice_root.go",
], ],
importpath = "github.com/prysmaticlabs/prysm/v5/encoding/ssz", importpath = "github.com/prysmaticlabs/prysm/v5/encoding/ssz",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],

View File

@@ -144,51 +144,13 @@ func WithdrawalSliceRoot(withdrawals []*enginev1.Withdrawal, limit uint64) ([32]
// DepositRequestsSliceRoot computes the HTR of a slice of deposit receipts. // DepositRequestsSliceRoot computes the HTR of a slice of deposit receipts.
// The limit parameter is used as input to the bitwise merkleization algorithm. // The limit parameter is used as input to the bitwise merkleization algorithm.
func DepositRequestsSliceRoot(depositRequests []*enginev1.DepositRequest, limit uint64) ([32]byte, error) { func DepositRequestsSliceRoot(depositRequests []*enginev1.DepositRequest, limit uint64) ([32]byte, error) {
roots := make([][32]byte, len(depositRequests)) return SliceRoot(depositRequests, limit)
for i := 0; i < len(depositRequests); i++ {
r, err := depositRequests[i].HashTreeRoot()
if err != nil {
return [32]byte{}, err
}
roots[i] = r
}
bytesRoot, err := BitwiseMerkleize(roots, uint64(len(roots)), limit)
if err != nil {
return [32]byte{}, errors.Wrap(err, "could not compute merkleization")
}
bytesRootBuf := new(bytes.Buffer)
if err := binary.Write(bytesRootBuf, binary.LittleEndian, uint64(len(depositRequests))); err != nil {
return [32]byte{}, errors.Wrap(err, "could not marshal length")
}
bytesRootBufRoot := make([]byte, 32)
copy(bytesRootBufRoot, bytesRootBuf.Bytes())
return MixInLength(bytesRoot, bytesRootBufRoot), nil
} }
// WithdrawalRequestsSliceRoot computes the HTR of a slice of withdrawal requests from the EL. // WithdrawalRequestsSliceRoot computes the HTR of a slice of withdrawal requests from the EL.
// The limit parameter is used as input to the bitwise merkleization algorithm. // The limit parameter is used as input to the bitwise merkleization algorithm.
func WithdrawalRequestsSliceRoot(withdrawalRequests []*enginev1.WithdrawalRequest, limit uint64) ([32]byte, error) { func WithdrawalRequestsSliceRoot(withdrawalRequests []*enginev1.WithdrawalRequest, limit uint64) ([32]byte, error) {
roots := make([][32]byte, len(withdrawalRequests)) return SliceRoot(withdrawalRequests, limit)
for i := 0; i < len(withdrawalRequests); i++ {
r, err := withdrawalRequests[i].HashTreeRoot()
if err != nil {
return [32]byte{}, err
}
roots[i] = r
}
bytesRoot, err := BitwiseMerkleize(roots, uint64(len(roots)), limit)
if err != nil {
return [32]byte{}, errors.Wrap(err, "could not compute merkleization")
}
bytesRootBuf := new(bytes.Buffer)
if err := binary.Write(bytesRootBuf, binary.LittleEndian, uint64(len(withdrawalRequests))); err != nil {
return [32]byte{}, errors.Wrap(err, "could not marshal length")
}
bytesRootBufRoot := make([]byte, 32)
copy(bytesRootBufRoot, bytesRootBuf.Bytes())
return MixInLength(bytesRoot, bytesRootBufRoot), nil
} }
// ByteSliceRoot is a helper func to merkleize an arbitrary List[Byte, N] // ByteSliceRoot is a helper func to merkleize an arbitrary List[Byte, N]

View File

@@ -1,4 +1,4 @@
package stateutil package ssz
import ( import (
"bytes" "bytes"
@@ -6,11 +6,10 @@ import (
"fmt" "fmt"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v5/encoding/ssz"
) )
// SliceRoot computes the root of a slice of hashable objects. // SliceRoot computes the root of a slice of hashable objects.
func SliceRoot[T ssz.Hashable](slice []T, limit uint64) ([32]byte, error) { func SliceRoot[T Hashable](slice []T, limit uint64) ([32]byte, error) {
max := limit max := limit
if uint64(len(slice)) > max { if uint64(len(slice)) > max {
return [32]byte{}, fmt.Errorf("slice exceeds max length %d", max) return [32]byte{}, fmt.Errorf("slice exceeds max length %d", max)
@@ -25,7 +24,7 @@ func SliceRoot[T ssz.Hashable](slice []T, limit uint64) ([32]byte, error) {
roots[i] = r roots[i] = r
} }
sliceRoot, err := ssz.BitwiseMerkleize(roots, uint64(len(roots)), limit) sliceRoot, err := BitwiseMerkleize(roots, uint64(len(roots)), limit)
if err != nil { if err != nil {
return [32]byte{}, errors.Wrap(err, "could not slice merkleization") return [32]byte{}, errors.Wrap(err, "could not slice merkleization")
} }
@@ -36,6 +35,5 @@ func SliceRoot[T ssz.Hashable](slice []T, limit uint64) ([32]byte, error) {
// We need to mix in the length of the slice. // We need to mix in the length of the slice.
sliceLenRoot := make([]byte, 32) sliceLenRoot := make([]byte, 32)
copy(sliceLenRoot, sliceLenBuf.Bytes()) copy(sliceLenRoot, sliceLenBuf.Bytes())
res := ssz.MixInLength(sliceRoot, sliceLenRoot) return MixInLength(sliceRoot, sliceLenRoot), nil
return res, nil
} }