github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/core/ledger/kvledger/txmgmt/pvtstatepurgemgmt/expiry_schedule_builder.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package pvtstatepurgemgmt 8 9 import ( 10 math "math" 11 12 "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/privacyenabledstate" 13 "github.com/osdi23p228/fabric/core/ledger/kvledger/txmgmt/statedb" 14 "github.com/osdi23p228/fabric/core/ledger/pvtdatapolicy" 15 "github.com/osdi23p228/fabric/core/ledger/util" 16 ) 17 18 type expiryScheduleBuilder struct { 19 btlPolicy pvtdatapolicy.BTLPolicy 20 scheduleEntries map[expiryInfoKey]*PvtdataKeys 21 } 22 23 func newExpiryScheduleBuilder(btlPolicy pvtdatapolicy.BTLPolicy) *expiryScheduleBuilder { 24 return &expiryScheduleBuilder{btlPolicy, make(map[expiryInfoKey]*PvtdataKeys)} 25 } 26 27 func (builder *expiryScheduleBuilder) add(ns, coll, key string, keyHash []byte, versionedValue *statedb.VersionedValue) error { 28 committingBlk := versionedValue.Version.BlockNum 29 expiryBlk, err := builder.btlPolicy.GetExpiringBlock(ns, coll, committingBlk) 30 if err != nil { 31 return err 32 } 33 if isDelete(versionedValue) || neverExpires(expiryBlk) { 34 return nil 35 } 36 expinfoKey := expiryInfoKey{committingBlk: committingBlk, expiryBlk: expiryBlk} 37 pvtdataKeys, ok := builder.scheduleEntries[expinfoKey] 38 if !ok { 39 pvtdataKeys = newPvtdataKeys() 40 builder.scheduleEntries[expinfoKey] = pvtdataKeys 41 } 42 pvtdataKeys.add(ns, coll, key, keyHash) 43 return nil 44 } 45 46 func (builder *expiryScheduleBuilder) getExpiryInfo() []*expiryInfo { 47 var listExpinfo []*expiryInfo 48 for expinfoKey, pvtdataKeys := range builder.scheduleEntries { 49 expinfoKeyCopy := expinfoKey 50 listExpinfo = append(listExpinfo, &expiryInfo{expiryInfoKey: &expinfoKeyCopy, pvtdataKeys: pvtdataKeys}) 51 } 52 return listExpinfo 53 } 54 55 func buildExpirySchedule( 56 btlPolicy pvtdatapolicy.BTLPolicy, 57 pvtUpdates *privacyenabledstate.PvtUpdateBatch, 58 hashedUpdates *privacyenabledstate.HashedUpdateBatch) ([]*expiryInfo, error) { 59 60 hashedUpdateKeys := hashedUpdates.ToCompositeKeyMap() 61 expiryScheduleBuilder := newExpiryScheduleBuilder(btlPolicy) 62 63 logger.Debugf("Building the expiry schedules based on the update batch") 64 65 // Iterate through the private data updates and for each key add into the expiry schedule 66 // i.e., when these private data key and it's hashed-keys are going to be expired 67 // Note that the 'hashedUpdateKeys' may be superset of the pvtUpdates. This is because, 68 // the peer may not receive all the private data either because the peer is not eligible for certain private data 69 // or because we allow proceeding with the missing private data data 70 for pvtUpdateKey, vv := range pvtUpdates.ToCompositeKeyMap() { 71 keyHash := util.ComputeStringHash(pvtUpdateKey.Key) 72 hashedCompisiteKey := privacyenabledstate.HashedCompositeKey{ 73 Namespace: pvtUpdateKey.Namespace, 74 CollectionName: pvtUpdateKey.CollectionName, 75 KeyHash: string(keyHash), 76 } 77 logger.Debugf("Adding expiry schedule for key and key hash [%s]", &hashedCompisiteKey) 78 if err := expiryScheduleBuilder.add(pvtUpdateKey.Namespace, pvtUpdateKey.CollectionName, pvtUpdateKey.Key, keyHash, vv); err != nil { 79 return nil, err 80 } 81 delete(hashedUpdateKeys, hashedCompisiteKey) 82 } 83 84 // Add entries for the leftover key hashes i.e., the hashes corresponding to which there is not private key is present 85 for hashedUpdateKey, vv := range hashedUpdateKeys { 86 logger.Debugf("Adding expiry schedule for key hash [%s]", &hashedUpdateKey) 87 if err := expiryScheduleBuilder.add(hashedUpdateKey.Namespace, hashedUpdateKey.CollectionName, "", []byte(hashedUpdateKey.KeyHash), vv); err != nil { 88 return nil, err 89 } 90 } 91 return expiryScheduleBuilder.getExpiryInfo(), nil 92 } 93 94 func isDelete(versionedValue *statedb.VersionedValue) bool { 95 return versionedValue.Value == nil 96 } 97 98 func neverExpires(expiryBlk uint64) bool { 99 return expiryBlk == math.MaxUint64 100 }