github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/encoding.go (about)

     1  package kv
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"reflect"
     7  
     8  	fastssz "github.com/ferranbt/fastssz"
     9  	"github.com/golang/snappy"
    10  	pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
    11  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
    12  	"go.opencensus.io/trace"
    13  	"google.golang.org/protobuf/proto"
    14  )
    15  
    16  func decode(ctx context.Context, data []byte, dst proto.Message) error {
    17  	ctx, span := trace.StartSpan(ctx, "BeaconDB.decode")
    18  	defer span.End()
    19  
    20  	data, err := snappy.Decode(nil, data)
    21  	if err != nil {
    22  		return err
    23  	}
    24  	if isSSZStorageFormat(dst) {
    25  		return dst.(fastssz.Unmarshaler).UnmarshalSSZ(data)
    26  	}
    27  	return proto.Unmarshal(data, dst)
    28  }
    29  
    30  func encode(ctx context.Context, msg proto.Message) ([]byte, error) {
    31  	ctx, span := trace.StartSpan(ctx, "BeaconDB.encode")
    32  	defer span.End()
    33  
    34  	if msg == nil || reflect.ValueOf(msg).IsNil() {
    35  		return nil, errors.New("cannot encode nil message")
    36  	}
    37  	var enc []byte
    38  	var err error
    39  	if isSSZStorageFormat(msg) {
    40  		enc, err = msg.(fastssz.Marshaler).MarshalSSZ()
    41  		if err != nil {
    42  			return nil, err
    43  		}
    44  	} else {
    45  		enc, err = proto.Marshal(msg)
    46  		if err != nil {
    47  			return nil, err
    48  		}
    49  	}
    50  	return snappy.Encode(nil, enc), nil
    51  }
    52  
    53  // isSSZStorageFormat returns true if the object type should be saved in SSZ encoded format.
    54  func isSSZStorageFormat(obj interface{}) bool {
    55  	switch obj.(type) {
    56  	case *pb.BeaconState:
    57  		return true
    58  	case *ethpb.SignedBeaconBlock:
    59  		return true
    60  	case *ethpb.SignedAggregateAttestationAndProof:
    61  		return true
    62  	case *ethpb.BeaconBlock:
    63  		return true
    64  	case *ethpb.Attestation:
    65  		return true
    66  	case *ethpb.Deposit:
    67  		return true
    68  	case *ethpb.AttesterSlashing:
    69  		return true
    70  	case *ethpb.ProposerSlashing:
    71  		return true
    72  	case *ethpb.VoluntaryExit:
    73  		return true
    74  	default:
    75  		return false
    76  	}
    77  }