github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/ledger/pvtdatastorage/v11.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package pvtdatastorage
     8  
     9  import (
    10  	"github.com/golang/protobuf/proto"
    11  	"github.com/hechain20/hechain/common/ledger/util/leveldbhelper"
    12  	"github.com/hechain20/hechain/core/ledger"
    13  	"github.com/hechain20/hechain/core/ledger/internal/version"
    14  	"github.com/hyperledger/fabric-protos-go/ledger/rwset"
    15  )
    16  
    17  func v11Format(datakeyBytes []byte) (bool, error) {
    18  	_, n, err := version.NewHeightFromBytes(datakeyBytes[1:])
    19  	if err != nil {
    20  		return false, err
    21  	}
    22  	remainingBytes := datakeyBytes[n+1:]
    23  	return len(remainingBytes) == 0, err
    24  }
    25  
    26  // v11DecodePK returns block number, tx number, and error.
    27  func v11DecodePK(key blkTranNumKey) (uint64, uint64, error) {
    28  	height, _, err := version.NewHeightFromBytes(key[1:])
    29  	if err != nil {
    30  		return 0, 0, err
    31  	}
    32  	return height.BlockNum, height.TxNum, nil
    33  }
    34  
    35  func v11DecodePvtRwSet(encodedBytes []byte) (*rwset.TxPvtReadWriteSet, error) {
    36  	writeset := &rwset.TxPvtReadWriteSet{}
    37  	return writeset, proto.Unmarshal(encodedBytes, writeset)
    38  }
    39  
    40  func v11RetrievePvtdata(itr *leveldbhelper.Iterator, filter ledger.PvtNsCollFilter) ([]*ledger.TxPvtData, error) {
    41  	var blkPvtData []*ledger.TxPvtData
    42  	txPvtData, err := v11DecodeKV(itr.Key(), itr.Value(), filter)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  	blkPvtData = append(blkPvtData, txPvtData)
    47  	for itr.Next() {
    48  		pvtDatum, err := v11DecodeKV(itr.Key(), itr.Value(), filter)
    49  		if err != nil {
    50  			return nil, err
    51  		}
    52  		blkPvtData = append(blkPvtData, pvtDatum)
    53  	}
    54  	return blkPvtData, nil
    55  }
    56  
    57  func v11DecodeKV(k, v []byte, filter ledger.PvtNsCollFilter) (*ledger.TxPvtData, error) {
    58  	bNum, tNum, err := v11DecodePK(k)
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  	var pvtWSet *rwset.TxPvtReadWriteSet
    63  	if pvtWSet, err = v11DecodePvtRwSet(v); err != nil {
    64  		return nil, err
    65  	}
    66  	logger.Debugf("Retrieved V11 private data write set for block [%d] tran [%d]", bNum, tNum)
    67  	filteredWSet := v11TrimPvtWSet(pvtWSet, filter)
    68  	return &ledger.TxPvtData{SeqInBlock: tNum, WriteSet: filteredWSet}, nil
    69  }
    70  
    71  func v11TrimPvtWSet(pvtWSet *rwset.TxPvtReadWriteSet, filter ledger.PvtNsCollFilter) *rwset.TxPvtReadWriteSet {
    72  	if filter == nil {
    73  		return pvtWSet
    74  	}
    75  
    76  	var filteredNsRwSet []*rwset.NsPvtReadWriteSet
    77  	for _, ns := range pvtWSet.NsPvtRwset {
    78  		var filteredCollRwSet []*rwset.CollectionPvtReadWriteSet
    79  		for _, coll := range ns.CollectionPvtRwset {
    80  			if filter.Has(ns.Namespace, coll.CollectionName) {
    81  				filteredCollRwSet = append(filteredCollRwSet, coll)
    82  			}
    83  		}
    84  		if filteredCollRwSet != nil {
    85  			filteredNsRwSet = append(filteredNsRwSet,
    86  				&rwset.NsPvtReadWriteSet{
    87  					Namespace:          ns.Namespace,
    88  					CollectionPvtRwset: filteredCollRwSet,
    89  				},
    90  			)
    91  		}
    92  	}
    93  	var filteredTxPvtRwSet *rwset.TxPvtReadWriteSet
    94  	if filteredNsRwSet != nil {
    95  		filteredTxPvtRwSet = &rwset.TxPvtReadWriteSet{
    96  			DataModel:  pvtWSet.GetDataModel(),
    97  			NsPvtRwset: filteredNsRwSet,
    98  		}
    99  	}
   100  	return filteredTxPvtRwSet
   101  }