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 GetChain(entity Kind, entityName, name string) []byte { ctx := storage.GetReadOnlyContext() key := storageKey(entity, entityName, name) data := storage.Get(ctx, key).([]byte) if data == nil { panic("not found") } return data } 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 } // ListChainsByPrefix list all chains for the provided kind and entity by prefix. func ListChainsByPrefix(entity Kind, entityName, prefix string) [][]byte { ctx := storage.GetReadOnlyContext() result := [][]byte{} keyPrefix := storageKey(entity, entityName, prefix) it := storage.Find(ctx, keyPrefix, storage.ValuesOnly) for iterator.Next(it) { result = append(result, iterator.Value(it).([]byte)) } return result }