diff --git a/alphabet/alphabet_contract.go b/alphabet/alphabet_contract.go index 8b16e56..dbfe95e 100644 --- a/alphabet/alphabet_contract.go +++ b/alphabet/alphabet_contract.go @@ -22,12 +22,6 @@ const ( version = 1 ) -var ctx storage.Context - -func init() { - ctx = storage.GetContext() -} - // OnNEP17Payment is a callback for NEP-17 compatible native GAS and NEO contracts. func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) { caller := runtime.GetCallingScriptHash() @@ -37,6 +31,8 @@ func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) { } func Init(owner interop.Hash160, addrNetmap, addrProxy interop.Hash160, name string, index, total int) { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -56,6 +52,8 @@ func Init(owner interop.Hash160, addrNetmap, addrProxy interop.Hash160, name str } func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -75,29 +73,30 @@ func Neo() int { return neo.BalanceOf(runtime.GetExecutingScriptHash()) } -func irList() []common.IRNode { +func irList(ctx storage.Context) []common.IRNode { return common.InnerRingListViaStorage(ctx, netmapKey) } -func currentEpoch() int { +func currentEpoch(ctx storage.Context) int { netmapContractAddr := storage.Get(ctx, netmapKey).(interop.Hash160) return contract.Call(netmapContractAddr, "epoch", contract.ReadOnly).(int) } -func name() string { +func name(ctx storage.Context) string { return storage.Get(ctx, nameKey).(string) } -func index() int { +func index(ctx storage.Context) int { return storage.Get(ctx, indexKey).(int) } -func total() int { +func total(ctx storage.Context) int { return storage.Get(ctx, totalKey).(int) } func checkPermission(ir []common.IRNode) bool { - index := index() // read from contract memory + ctx := storage.GetReadOnlyContext() + index := index(ctx) // read from contract memory if len(ir) <= index { return false @@ -108,7 +107,9 @@ func checkPermission(ir []common.IRNode) bool { } func Emit() bool { - innerRingKeys := irList() + ctx := storage.GetReadOnlyContext() + + innerRingKeys := irList(ctx) if !checkPermission(innerRingKeys) { panic("invalid invoker") } @@ -144,15 +145,16 @@ func Emit() bool { } func Vote(epoch int, candidates []interop.PublicKey) { - index := index() - name := name() + ctx := storage.GetReadOnlyContext() + index := index(ctx) + name := name(ctx) multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapKey) if !runtime.CheckWitness(multiaddr) { panic("invalid invoker") } - curEpoch := currentEpoch() + curEpoch := currentEpoch(ctx) if epoch != curEpoch { panic("invalid epoch") } @@ -171,7 +173,8 @@ func Vote(epoch int, candidates []interop.PublicKey) { } func Name() string { - return name() + ctx := storage.GetReadOnlyContext() + return name(ctx) } func Version() int { diff --git a/audit/audit_contract.go b/audit/audit_contract.go index 1140ba1..c353f2e 100644 --- a/audit/audit_contract.go +++ b/audit/audit_contract.go @@ -40,13 +40,9 @@ const ( netmapContractKey = "netmapScriptHash" ) -var ctx storage.Context - -func init() { - ctx = storage.GetContext() -} - func Init(owner interop.Hash160, addrNetmap interop.Hash160) { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -62,6 +58,8 @@ func Init(owner interop.Hash160, addrNetmap interop.Hash160) { } func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -74,6 +72,7 @@ func Migrate(script []byte, manifest []byte) bool { } func Put(rawAuditResult []byte) bool { + ctx := storage.GetContext() innerRing := common.InnerRingListViaStorage(ctx, netmapContractKey) hdr := newAuditHeader(rawAuditResult) @@ -100,22 +99,27 @@ func Put(rawAuditResult []byte) bool { } func Get(id []byte) []byte { + ctx := storage.GetReadOnlyContext() return storage.Get(ctx, id).([]byte) } func List() [][]byte { + ctx := storage.GetReadOnlyContext() it := storage.Find(ctx, []byte{}, storage.KeysOnly) return list(it) } func ListByEpoch(epoch int) [][]byte { + ctx := storage.GetReadOnlyContext() it := storage.Find(ctx, epoch, storage.KeysOnly) return list(it) } func ListByCID(epoch int, cid []byte) [][]byte { + ctx := storage.GetReadOnlyContext() + var buf interface{} = epoch prefix := append(buf.([]byte), cid...) @@ -125,6 +129,7 @@ func ListByCID(epoch int, cid []byte) [][]byte { } func ListByNode(epoch int, cid []byte, key interop.PublicKey) [][]byte { + ctx := storage.GetReadOnlyContext() hdr := auditHeader{ epoch: epoch, cid: cid, diff --git a/balance/balance_contract.go b/balance/balance_contract.go index 50b0b77..47bd388 100644 --- a/balance/balance_contract.go +++ b/balance/balance_contract.go @@ -46,7 +46,6 @@ var ( lockTransferMsg = []byte("lock assets to withdraw") unlockTransferMsg = []byte("asset lock expired") - ctx storage.Context token Token ) @@ -60,11 +59,12 @@ func CreateToken() Token { } func init() { - ctx = storage.GetContext() token = CreateToken() } func Init(owner, addrNetmap, addrContainer interop.Hash160) { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -81,6 +81,8 @@ func Init(owner, addrNetmap, addrContainer interop.Hash160) { } func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -101,18 +103,23 @@ func Decimals() int { } func TotalSupply() int { + ctx := storage.GetReadOnlyContext() return token.getSupply(ctx) } func BalanceOf(account interop.Hash160) int { + ctx := storage.GetReadOnlyContext() return token.balanceOf(ctx, account) } func Transfer(from, to interop.Hash160, amount int, data interface{}) bool { + ctx := storage.GetContext() return token.transfer(ctx, from, to, amount, false, nil) } func TransferX(from, to interop.Hash160, amount int, details []byte) bool { + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("transferX: this method must be invoked from inner ring") @@ -130,6 +137,8 @@ func TransferX(from, to interop.Hash160, amount int, details []byte) bool { } func Lock(txID []byte, from, to interop.Hash160, amount, until int) bool { + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("lock: this method must be invoked from inner ring") @@ -155,6 +164,8 @@ func Lock(txID []byte, from, to interop.Hash160, amount, until int) bool { } func NewEpoch(epochNum int) bool { + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("epochNum: this method must be invoked from inner ring") @@ -182,6 +193,8 @@ func NewEpoch(epochNum int) bool { } func Mint(to interop.Hash160, amount int, details []byte) bool { + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("mint: this method must be invoked from inner ring") @@ -202,6 +215,8 @@ func Mint(to interop.Hash160, amount int, details []byte) bool { } func Burn(from interop.Hash160, amount int, details []byte) bool { + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("burn: this method must be invoked from inner ring") diff --git a/container/container_contract.go b/container/container_contract.go index 81d7d2b..428ff56 100644 --- a/container/container_contract.go +++ b/container/container_contract.go @@ -52,15 +52,11 @@ const ( var ( containerFeeTransferMsg = []byte("container creation fee") eACLPrefix = []byte("eACL") - - ctx storage.Context ) -func init() { - ctx = storage.GetContext() -} - func Init(owner, addrNetmap, addrBalance, addrID interop.Hash160) { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -78,6 +74,8 @@ func Init(owner, addrNetmap, addrBalance, addrID interop.Hash160) { } func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -90,6 +88,8 @@ func Migrate(script []byte, manifest []byte) bool { } func Put(container []byte, signature interop.Signature, publicKey interop.PublicKey) bool { + ctx := storage.GetContext() + offset := int(container[1]) offset = 2 + offset + 4 // version prefix + version size + owner prefix ownerID := container[offset : offset+25] // offset + size of owner @@ -144,6 +144,8 @@ func Put(container []byte, signature interop.Signature, publicKey interop.Public } func Delete(containerID, signature []byte) bool { + ctx := storage.GetContext() + ownerID := getOwnerByID(ctx, containerID) if len(ownerID) == 0 { panic("delete: container does not exist") @@ -170,14 +172,18 @@ func Delete(containerID, signature []byte) bool { } func Get(containerID []byte) []byte { + ctx := storage.GetReadOnlyContext() return storage.Get(ctx, containerID).([]byte) } func Owner(containerID []byte) []byte { + ctx := storage.GetReadOnlyContext() return getOwnerByID(ctx, containerID) } func List(owner []byte) [][]byte { + ctx := storage.GetReadOnlyContext() + if len(owner) == 0 { return getAllContainers(ctx) } @@ -203,6 +209,8 @@ func List(owner []byte) [][]byte { } func SetEACL(eACL, signature []byte) bool { + ctx := storage.GetContext() + // get container ID offset := int(eACL[1]) offset = 2 + offset + 4 @@ -234,6 +242,8 @@ func SetEACL(eACL, signature []byte) bool { } func EACL(containerID []byte) extendedACL { + ctx := storage.GetReadOnlyContext() + ownerID := getOwnerByID(ctx, containerID) if len(ownerID) == 0 { panic("getEACL: container does not exists") @@ -263,16 +273,18 @@ func EACL(containerID []byte) extendedACL { } func PutContainerSize(epoch int, cid []byte, usedSize int, pubKey interop.PublicKey) bool { + ctx := storage.GetContext() + if !runtime.CheckWitness(pubKey) { panic("container: invalid witness for size estimation") } - if !isStorageNode(pubKey) { + if !isStorageNode(ctx, pubKey) { panic("container: only storage nodes can save size estimations") } key := estimationKey(epoch, cid) - s := getContainerSizeEstimation(key, cid) + s := getContainerSizeEstimation(ctx, key, cid) // do not add estimation twice for i := range s.estimations { @@ -295,10 +307,13 @@ func PutContainerSize(epoch int, cid []byte, usedSize int, pubKey interop.Public } func GetContainerSize(id []byte) containerSizes { - return getContainerSizeEstimation(id, nil) + ctx := storage.GetReadOnlyContext() + return getContainerSizeEstimation(ctx, id, nil) } func ListContainerSizes(epoch int) [][]byte { + ctx := storage.GetReadOnlyContext() + var buf interface{} = epoch key := []byte(estimateKeyPrefix) @@ -317,18 +332,22 @@ func ListContainerSizes(epoch int) [][]byte { } func ProcessEpoch(epochNum int) { + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("processEpoch: this method must be invoked from inner ring") } - candidates := keysToDelete(epochNum) + candidates := keysToDelete(ctx, epochNum) for _, candidate := range candidates { storage.Delete(ctx, candidate) } } func StartContainerEstimation(epoch int) bool { + ctx := storage.GetReadOnlyContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("startEstimation: only inner ring nodes can invoke this") @@ -341,6 +360,8 @@ func StartContainerEstimation(epoch int) bool { } func StopContainerEstimation(epoch int) bool { + ctx := storage.GetReadOnlyContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("stopEstimation: only inner ring nodes can invoke this") @@ -493,7 +514,7 @@ func estimationKey(epoch int, cid []byte) []byte { return append(result, cid...) } -func getContainerSizeEstimation(key, cid []byte) containerSizes { +func getContainerSizeEstimation(ctx storage.Context, key, cid []byte) containerSizes { data := storage.Get(ctx, key) if data != nil { return binary.Deserialize(data.([]byte)).(containerSizes) @@ -507,7 +528,7 @@ func getContainerSizeEstimation(key, cid []byte) containerSizes { // isStorageNode looks into _previous_ epoch network map, because storage node // announce container size estimation of previous epoch. -func isStorageNode(key interop.PublicKey) bool { +func isStorageNode(ctx storage.Context, key interop.PublicKey) bool { netmapContractAddr := storage.Get(ctx, netmapContractKey).(interop.Hash160) snapshot := contract.Call(netmapContractAddr, "snapshot", contract.ReadOnly, 1).([]storageNode) @@ -523,7 +544,7 @@ func isStorageNode(key interop.PublicKey) bool { return false } -func keysToDelete(epoch int) [][]byte { +func keysToDelete(ctx storage.Context, epoch int) [][]byte { results := [][]byte{} it := storage.Find(ctx, []byte(estimateKeyPrefix), storage.KeysOnly) diff --git a/neofs/neofs_contract.go b/neofs/neofs_contract.go index 5def62b..757b5d4 100644 --- a/neofs/neofs_contract.go +++ b/neofs/neofs_contract.go @@ -76,16 +76,12 @@ const ( var ( configPrefix = []byte("config") - - ctx storage.Context ) -func init() { - ctx = storage.GetContext() -} - // Init set up initial inner ring node keys. func Init(owner interop.PublicKey, args []interop.PublicKey) bool { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -119,6 +115,8 @@ func Init(owner interop.PublicKey, args []interop.PublicKey) bool { // Migrate updates smart contract execution script and manifest. func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -132,16 +130,20 @@ func Migrate(script []byte, manifest []byte) bool { // InnerRingList returns array of inner ring node keys. func InnerRingList() []common.IRNode { + ctx := storage.GetReadOnlyContext() return getInnerRingNodes(ctx, innerRingKey) } // InnerRingCandidates returns array of inner ring candidate node keys. func InnerRingCandidates() []common.IRNode { + ctx := storage.GetReadOnlyContext() return getInnerRingNodes(ctx, candidatesKey) } // InnerRingCandidateRemove removes key from the list of inner ring candidates. func InnerRingCandidateRemove(key interop.PublicKey) bool { + ctx := storage.GetContext() + if !runtime.CheckWitness(key) { panic("irCandidateRemove: you should be the owner of the public key") } @@ -165,6 +167,8 @@ func InnerRingCandidateRemove(key interop.PublicKey) bool { // InnerRingCandidateAdd adds key to the list of inner ring candidates. func InnerRingCandidateAdd(key interop.PublicKey) bool { + ctx := storage.GetContext() + if !runtime.CheckWitness(key) { panic("irCandidateAdd: you should be the owner of the public key") } @@ -268,6 +272,7 @@ func Withdraw(user []byte, amount int) bool { // Cheque sends gas assets back to the user if they were successfully // locked in NeoFS balance contract. func Cheque(id []byte, user interop.Hash160, amount int, lockAcc []byte) bool { + ctx := storage.GetContext() irList := getInnerRingNodes(ctx, innerRingKey) threshold := len(irList)/3*2 + 1 @@ -345,6 +350,8 @@ func Unbind(user []byte, keys []interop.PublicKey) bool { // InnerRingUpdate updates list of inner ring nodes with provided list of // public keys. func InnerRingUpdate(chequeID []byte, args []interop.PublicKey) bool { + ctx := storage.GetContext() + if len(args) < minInnerRingSize { panic("irUpdate: bad arguments") } @@ -418,6 +425,8 @@ loop: // IsInnerRing returns 'true' if key is inside of inner ring list. func IsInnerRing(key []byte) bool { + ctx := storage.GetReadOnlyContext() + if len(key) != publicKeySize { panic("isInnerRing: incorrect public key") } @@ -436,11 +445,14 @@ func IsInnerRing(key []byte) bool { // Config returns value of NeoFS configuration with provided key. func Config(key []byte) interface{} { + ctx := storage.GetReadOnlyContext() return getConfig(ctx, key) } // SetConfig key-value pair as a NeoFS runtime configuration value. func SetConfig(id, key, val []byte) bool { + ctx := storage.GetContext() + // check if it is inner ring invocation irList := getInnerRingNodes(ctx, innerRingKey) threshold := len(irList)/3*2 + 1 @@ -478,6 +490,8 @@ func SetConfig(id, key, val []byte) bool { // ListConfig returns array of all key-value pairs of NeoFS configuration. func ListConfig() []record { + ctx := storage.GetReadOnlyContext() + var config []record it := storage.Find(ctx, configPrefix, storage.None) @@ -495,6 +509,8 @@ func ListConfig() []record { // InitConfig set up initial NeoFS key-value configuration. func InitConfig(args [][]byte) bool { + ctx := storage.GetContext() + if getConfig(ctx, candidateFeeConfigKey) != nil { panic("neofs: configuration already installed") } diff --git a/neofsid/neofsid_contract.go b/neofsid/neofsid_contract.go index 8e65750..ab5f5c2 100644 --- a/neofsid/neofsid_contract.go +++ b/neofsid/neofsid_contract.go @@ -23,13 +23,9 @@ const ( containerContractKey = "containerScriptHash" ) -var ctx storage.Context - -func init() { - ctx = storage.GetContext() -} - func Init(owner, addrNetmap, addrContainer interop.Hash160) { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -46,6 +42,8 @@ func Init(owner, addrNetmap, addrContainer interop.Hash160) { } func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -62,6 +60,8 @@ func AddKey(owner []byte, keys []interop.PublicKey) bool { panic("addKey: incorrect owner") } + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("addKey: invocation from non inner ring node") @@ -97,6 +97,8 @@ func RemoveKey(owner []byte, keys []interop.PublicKey) bool { panic("removeKey: incorrect owner") } + ctx := storage.GetContext() + multiaddr := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) if !runtime.CheckWitness(multiaddr) { panic("removeKey: invocation from non inner ring node") @@ -134,6 +136,8 @@ func Key(owner []byte) [][]byte { panic("key: incorrect owner") } + ctx := storage.GetReadOnlyContext() + info := getUserInfo(ctx, owner) return info.Keys @@ -162,6 +166,8 @@ func invokeIDKeys(owner []byte, keys [][]byte, prefix []byte) []byte { } func fromKnownContract(caller []byte) bool { + ctx := storage.GetReadOnlyContext() + containerContractAddr := storage.Get(ctx, containerContractKey).([]byte) if common.BytesEqual(caller, containerContractAddr) { return true @@ -171,5 +177,6 @@ func fromKnownContract(caller []byte) bool { } func irList() []common.IRNode { + ctx := storage.GetReadOnlyContext() return common.InnerRingListViaStorage(ctx, netmapContractKey) } diff --git a/netmap/netmap_contract.go b/netmap/netmap_contract.go index 1b0ea5a..c4fa5b5 100644 --- a/netmap/netmap_contract.go +++ b/netmap/netmap_contract.go @@ -49,17 +49,13 @@ const ( var ( configPrefix = []byte("config") - - ctx storage.Context ) -func init() { - ctx = storage.GetContext() -} - // Init function sets up initial list of inner ring public keys and should // be invoked once at neofs infrastructure setup. func Init(owner interop.Hash160, keys []interop.PublicKey) { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -87,6 +83,8 @@ func Init(owner interop.Hash160, keys []interop.PublicKey) { } func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -99,14 +97,18 @@ func Migrate(script []byte, manifest []byte) bool { } func InnerRingList() []common.IRNode { + ctx := storage.GetReadOnlyContext() return getIRNodes(ctx) } func Multiaddress() []byte { + ctx := storage.GetReadOnlyContext() return multiaddress(getIRNodes(ctx)) } func UpdateInnerRing(keys []interop.PublicKey) bool { + ctx := storage.GetContext() + multiaddr := Multiaddress() if !runtime.CheckWitness(multiaddr) { panic("updateInnerRing: this method must be invoked by inner ring nodes") @@ -126,6 +128,8 @@ func UpdateInnerRing(keys []interop.PublicKey) bool { } func AddPeer(nodeInfo []byte) bool { + ctx := storage.GetContext() + multiaddr := Multiaddress() if !runtime.CheckWitness(multiaddr) { publicKey := nodeInfo[2:35] // offset:2, len:33 @@ -157,6 +161,8 @@ func UpdateState(state int, publicKey interop.PublicKey) bool { panic("updateState: incorrect public key") } + ctx := storage.GetContext() + multiaddr := Multiaddress() if !runtime.CheckWitness(multiaddr) { if !runtime.CheckWitness(publicKey) { @@ -181,6 +187,8 @@ func UpdateState(state int, publicKey interop.PublicKey) bool { } func NewEpoch(epochNum int) bool { + ctx := storage.GetContext() + multiaddr := Multiaddress() if !runtime.CheckWitness(multiaddr) { panic("newEpoch: this method must be invoked by inner ring nodes") @@ -211,15 +219,18 @@ func NewEpoch(epochNum int) bool { } func Epoch() int { + ctx := storage.GetReadOnlyContext() return storage.Get(ctx, snapshotEpoch).(int) } func Netmap() []storageNode { + ctx := storage.GetReadOnlyContext() return getSnapshot(ctx, snapshot0Key) } func Snapshot(diff int) []storageNode { var key string + switch diff { case 0: key = snapshot0Key @@ -229,16 +240,19 @@ func Snapshot(diff int) []storageNode { panic("snapshot: incorrect diff") } + ctx := storage.GetReadOnlyContext() return getSnapshot(ctx, key) } func SnapshotByEpoch(epoch int) []storageNode { + ctx := storage.GetReadOnlyContext() currentEpoch := storage.Get(ctx, snapshotEpoch).(int) return Snapshot(currentEpoch - epoch) } func Config(key []byte) interface{} { + ctx := storage.GetReadOnlyContext() return getConfig(ctx, key) } @@ -248,6 +262,8 @@ func SetConfig(id, key, val []byte) bool { panic("setConfig: invoked by non inner ring node") } + ctx := storage.GetContext() + setConfig(ctx, key, val) runtime.Log("setConfig: configuration has been updated") @@ -256,6 +272,8 @@ func SetConfig(id, key, val []byte) bool { } func InitConfig(args [][]byte) bool { + ctx := storage.GetContext() + if storage.Get(ctx, configuredKey) != nil { panic("netmap: configuration already installed") } @@ -279,6 +297,8 @@ func InitConfig(args [][]byte) bool { } func ListConfig() []record { + ctx := storage.GetReadOnlyContext() + var config []record it := storage.Find(ctx, configPrefix, storage.None) diff --git a/proxy/proxy_contract.go b/proxy/proxy_contract.go index c7d4d79..a6d8695 100644 --- a/proxy/proxy_contract.go +++ b/proxy/proxy_contract.go @@ -15,12 +15,6 @@ const ( netmapContractKey = "netmapScriptHash" ) -var ctx storage.Context - -func init() { - ctx = storage.GetContext() -} - func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) { caller := runtime.GetCallingScriptHash() if !common.BytesEqual(caller, []byte(gas.Hash)) { @@ -29,6 +23,8 @@ func OnNEP17Payment(from interop.Hash160, amount int, data interface{}) { } func Init(owner, addrNetmap interop.Hash160) { + ctx := storage.GetContext() + if !common.HasUpdateAccess(ctx) { panic("only owner can reinitialize contract") } @@ -44,6 +40,8 @@ func Init(owner, addrNetmap interop.Hash160) { } func Migrate(script []byte, manifest []byte) bool { + ctx := storage.GetReadOnlyContext() + if !common.HasUpdateAccess(ctx) { runtime.Log("only owner can update contract") return false @@ -56,7 +54,9 @@ func Migrate(script []byte, manifest []byte) bool { } func Verify() bool { + ctx := storage.GetReadOnlyContext() sig := common.InnerRingMultiAddressViaStorage(ctx, netmapContractKey) + return runtime.CheckWitness(sig) }