github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/kvledger/txmgmt/statedb/stateleveldb/value_encoding.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package stateleveldb 8 9 import ( 10 proto "github.com/golang/protobuf/proto" 11 "github.com/hechain20/hechain/core/ledger/internal/version" 12 "github.com/hechain20/hechain/core/ledger/kvledger/txmgmt/statedb" 13 ) 14 15 // encodeValue encodes the value, version, and metadata 16 func encodeValue(v *statedb.VersionedValue) ([]byte, error) { 17 return proto.Marshal( 18 &DBValue{ 19 Version: v.Version.ToBytes(), 20 Value: v.Value, 21 Metadata: v.Metadata, 22 }, 23 ) 24 } 25 26 // decodeValue decodes the statedb value bytes 27 func decodeValue(encodedValue []byte) (*statedb.VersionedValue, error) { 28 dbValue := &DBValue{} 29 err := proto.Unmarshal(encodedValue, dbValue) 30 if err != nil { 31 return nil, err 32 } 33 ver, _, err := version.NewHeightFromBytes(dbValue.Version) 34 if err != nil { 35 return nil, err 36 } 37 val := dbValue.Value 38 metadata := dbValue.Metadata 39 // protobuf always makes an empty byte array as nil 40 if val == nil { 41 val = []byte{} 42 } 43 return &statedb.VersionedValue{Version: ver, Value: val, Metadata: metadata}, nil 44 }