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 }