From d0a3ce25ffbc1bf144ebdb7181c49aaa1d14ca73 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Mon, 18 May 2020 18:13:45 +0300 Subject: [PATCH] compiler/storage: add read-only related interops --- pkg/compiler/syscall.go | 12 +++++++----- pkg/interop/storage/storage.go | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/pkg/compiler/syscall.go b/pkg/compiler/syscall.go index 2c990c87b..a470f34fb 100644 --- a/pkg/compiler/syscall.go +++ b/pkg/compiler/syscall.go @@ -18,11 +18,13 @@ var syscalls = map[string]map[string]string{ "Value": "Neo.Enumerator.Value", }, "storage": { - "GetContext": "Neo.Storage.GetContext", - "Put": "Neo.Storage.Put", - "Get": "Neo.Storage.Get", - "Delete": "Neo.Storage.Delete", - "Find": "Neo.Storage.Find", + "ConvertContextToReadOnly": "Neo.StorageContext.AsReadOnly", + "Delete": "Neo.Storage.Delete", + "Find": "Neo.Storage.Find", + "Get": "Neo.Storage.Get", + "GetContext": "Neo.Storage.GetContext", + "GetReadOnlyContext": "Neo.Storage.GetReadOnlyContext", + "Put": "Neo.Storage.Put", }, "runtime": { "GetTrigger": "Neo.Runtime.GetTrigger", diff --git a/pkg/interop/storage/storage.go b/pkg/interop/storage/storage.go index aade7e1e3..a047eebb1 100644 --- a/pkg/interop/storage/storage.go +++ b/pkg/interop/storage/storage.go @@ -10,13 +10,26 @@ import "github.com/nspcc-dev/neo-go/pkg/interop/iterator" // Context represents storage context that is mandatory for Put/Get/Delete // operations. It's an opaque type that can only be created properly by -// GetContext. It's similar to Neo .net framework's StorageContext class. +// GetContext, GetReadOnlyContext or ConvertContextToReadOnly. It's similar +// to Neo .net framework's StorageContext class. type Context struct{} +// ConvertContextToReadOnly returns new context from the given one, but with +// writing capability turned off, so that you could only invoke Get and Find +// using this new Context. If Context is already read-only this function is a +// no-op. It uses `Neo.StorageContext.AsReadOnly` syscall. +func ConvertContextToReadOnly(ctx Context) Context { return Context{} } + // GetContext returns current contract's (that invokes this function) storage // context. It uses `Neo.Storage.GetContext` syscall. func GetContext() Context { return Context{} } +// GetReadOnlyContext returns current contract's (that invokes this function) +// storage context in read-only mode, you can use this context for Get and Find +// functions, but using it for Put and Delete will fail. It uses +// `Neo.Storage.GetReadOnlyContext` syscall. +func GetReadOnlyContext() Context { return Context{} } + // Put saves given value with given key in the storage using given Context. // Even though it accepts interface{} for both, you can only pass simple types // there like string, []byte, int or bool (not structures or slices of more