package policy import ( "git.frostfs.info/TrueCloudLab/frostfs-contract/common" "github.com/nspcc-dev/neo-go/pkg/interop/iterator" "github.com/nspcc-dev/neo-go/pkg/interop/storage" ) // Kind represents the object the chain is attached to. // Currently only namespace and container are supported. type Kind byte const ( Namespace = 'n' Container = 'c' IAM = 'i' ) // _deploy function sets up initial list of inner ring public keys. func _deploy(data any, isUpdate bool) { } func storageKey(prefix Kind, entityName, name string) []byte { ln := len(entityName) key := append([]byte{byte(prefix)}, byte(ln&0xFF), byte(ln>>8)) key = append(key, entityName...) return append(key, name...) } func AddChain(entity Kind, entityName, name string, chain []byte) { common.CheckAlphabetWitness() // TODO: Allow to work with chain directly for everyone? ctx := storage.GetContext() key := storageKey(entity, entityName, name) storage.Put(ctx, key, chain) } func RemoveChain(entity Kind, entityName string, name string) { common.CheckAlphabetWitness() ctx := storage.GetContext() key := storageKey(entity, entityName, name) storage.Delete(ctx, key) } func RemoveChainsByPrefix(entity Kind, entityName string, name string) { common.CheckAlphabetWitness() ctx := storage.GetContext() key := storageKey(entity, entityName, name) it := storage.Find(ctx, key, storage.KeysOnly) for iterator.Next(it) { storage.Delete(ctx, iterator.Value(it).([]byte)) } } // ListChains lists all chains for the namespace by prefix. // container may be empty. func ListChains(namespace, container, name string) [][]byte { ctx := storage.GetReadOnlyContext() var result [][]byte prefixNs := storageKey(Namespace, namespace, name) it := storage.Find(ctx, prefixNs, storage.ValuesOnly) for iterator.Next(it) { result = append(result, iterator.Value(it).([]byte)) } if container != "" { prefixCnr := storageKey(Container, container, name) it = storage.Find(ctx, prefixCnr, storage.ValuesOnly) for iterator.Next(it) { result = append(result, iterator.Value(it).([]byte)) } } return result }