2019-10-11 11:08:21 +00:00
|
|
|
package core
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/CityOfZion/neo-go/pkg/core/storage"
|
|
|
|
"github.com/CityOfZion/neo-go/pkg/io"
|
|
|
|
"github.com/CityOfZion/neo-go/pkg/util"
|
|
|
|
)
|
|
|
|
|
|
|
|
// StorageItem is the value to be stored with read-only flag.
|
|
|
|
type StorageItem struct {
|
|
|
|
Value []byte
|
|
|
|
IsConst bool
|
|
|
|
}
|
|
|
|
|
|
|
|
// makeStorageItemKey returns a key used to store StorageItem in the DB.
|
|
|
|
func makeStorageItemKey(scripthash util.Uint160, key []byte) []byte {
|
|
|
|
return storage.AppendPrefix(storage.STStorage, append(scripthash.BytesReverse(), key...))
|
|
|
|
}
|
|
|
|
|
|
|
|
// getStorageItemFromStore returns StorageItem if it exists in the given Store.
|
|
|
|
func getStorageItemFromStore(s storage.Store, scripthash util.Uint160, key []byte) *StorageItem {
|
|
|
|
b, err := s.Get(makeStorageItemKey(scripthash, key))
|
|
|
|
if err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
r := io.NewBinReaderFromBuf(b)
|
|
|
|
|
|
|
|
si := &StorageItem{}
|
|
|
|
si.DecodeBinary(r)
|
|
|
|
if r.Err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return si
|
|
|
|
}
|
|
|
|
|
|
|
|
// putStorageItemIntoStore puts given StorageItem for given script with given
|
|
|
|
// key into the given Store.
|
|
|
|
func putStorageItemIntoStore(s storage.Store, scripthash util.Uint160, key []byte, si *StorageItem) error {
|
|
|
|
buf := io.NewBufBinWriter()
|
|
|
|
si.EncodeBinary(buf.BinWriter)
|
|
|
|
if buf.Err != nil {
|
|
|
|
return buf.Err
|
|
|
|
}
|
|
|
|
return s.Put(makeStorageItemKey(scripthash, key), buf.Bytes())
|
|
|
|
}
|
|
|
|
|
|
|
|
// deleteStorageItemInStore drops storage item for the given script with the
|
|
|
|
// given key from the Store.
|
|
|
|
func deleteStorageItemInStore(s storage.Store, scripthash util.Uint160, key []byte) error {
|
|
|
|
return s.Delete(makeStorageItemKey(scripthash, key))
|
|
|
|
}
|
|
|
|
|
|
|
|
// EncodeBinary implements Serializable interface.
|
|
|
|
func (si *StorageItem) EncodeBinary(w *io.BinWriter) {
|
2019-11-22 10:34:06 +00:00
|
|
|
w.WriteVarBytes(si.Value)
|
2019-10-11 11:08:21 +00:00
|
|
|
w.WriteLE(si.IsConst)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DecodeBinary implements Serializable interface.
|
|
|
|
func (si *StorageItem) DecodeBinary(r *io.BinReader) {
|
|
|
|
si.Value = r.ReadBytes()
|
|
|
|
r.ReadLE(&si.IsConst)
|
|
|
|
}
|