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  }