github.com/defanghe/fabric@v2.1.1+incompatible/core/ledger/pvtdatastorage/v11.go (about) 1 /* 2 Copyright IBM Corp. 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/hyperledger/fabric-protos-go/ledger/rwset" 12 "github.com/hyperledger/fabric/common/ledger/util/leveldbhelper" 13 "github.com/hyperledger/fabric/core/ledger" 14 "github.com/hyperledger/fabric/core/ledger/kvledger/txmgmt/version" 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 }