def Storage_Put(self, engine): context = None try: context = engine.EvaluationStack.Pop().GetInterface( 'neo.SmartContract.StorageContext.StorageContext') except Exception as e: self.__log.debug("Storage Context Not found on stack") return False if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() if len(key) > 1024: return False value = engine.EvaluationStack.Pop().GetByteArray() new_item = StorageItem(value=value) storage_key = StorageKey(script_hash=context.ScriptHash, key=key) item = self._storages.GetAndChange(storage_key.GetHashCodeBytes(), new_instance=new_item) item.Value = value self.__log.debug("Put stored item %s %s " % (item, item.Value)) return True
def Storage_Delete(self, engine): context = engine.EvaluationStack.Pop().GetInterface() if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() storage_key = StorageKey(script_hash=context.ScriptHash, key=key) keystr = key if len(key) == 20: keystr = Crypto.ToAddress(UInt160(data=key)) dispatch_smart_contract_event(SmartContractEvent.STORAGE_DELETE, keystr, context.ScriptHash, Blockchain.Default().Height, engine.ScriptContainer.Hash, test_mode=engine.testMode) self._storages.Remove(storage_key.GetHashCodeBytes()) return True
def Storage_Delete(self, engine): context = engine.EvaluationStack.Pop().GetInterface('neo.SmartContract.StorageContext.StorageContext') if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() storage_key = StorageKey(script_hash=context.ScriptHash, key=key) self._storages.Delete(storage_key.GetHashCodeBytes()) return True
def Storage_Get(self, engine): context = None try: item = engine.EvaluationStack.Pop() context = item.GetInterface() except Exception as e: logger.error("could not get storage context %s " % e) return False if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() storage_key = StorageKey(script_hash=context.ScriptHash, key=key) item = self._storages.TryGet(storage_key.GetHashCodeBytes()) keystr = key valStr = bytearray(0) if item is not None: valStr = bytearray(item.Value) if len(key) == 20: keystr = Crypto.ToAddress(UInt160(data=key)) try: valStr = int.from_bytes(valStr, 'little') except Exception as e: pass if item is not None: engine.EvaluationStack.PushT(bytearray(item.Value)) else: engine.EvaluationStack.PushT(bytearray(0)) self.events_to_dispatch.append( SmartContractEvent(SmartContractEvent.STORAGE_GET, ['%s -> %s' % (keystr, valStr)], context.ScriptHash, Blockchain.Default().Height, engine.ScriptContainer.Hash if engine.ScriptContainer else None, test_mode=engine.testMode)) return True
def Storage_Get(self, engine): context = None try: item = engine.EvaluationStack.Pop() context = item.GetInterface( 'neo.SmartContract.StorageContext.StorageContext') shash = context.ScriptHash except Exception as e: print("could not get storage context %s " % e) return False if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() storage_key = StorageKey(script_hash=context.ScriptHash, key=key) item = self._storages.TryGet(storage_key.GetHashCodeBytes()) keystr = key valStr = bytearray(0) if item is not None: valStr = bytearray(item.Value) if len(key) == 20: keystr = Crypto.ToAddress(UInt160(data=key)) try: valStr = int.from_bytes(valStr, 'little') except Exception as e: print("couldnt convert %s to number: %s " % (valStr, e)) if item is not None: print("[Neo.Storage.Get] [Script:%s] [%s] -> %s " % (context.ScriptHash, keystr, valStr)) engine.EvaluationStack.PushT(bytearray(item.Value)) else: print("[Neo.Storage.Get] [Script:%s] [%s] -> 0 " % (context.ScriptHash, keystr)) engine.EvaluationStack.PushT(bytearray(0)) return True
def Storage_Put(self, engine): context = None try: context = engine.EvaluationStack.Pop().GetInterface() except Exception as e: logger.error("Storage Context Not found on stack") return False if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() if len(key) > 1024: return False value = engine.EvaluationStack.Pop().GetByteArray() new_item = StorageItem(value=value) storage_key = StorageKey(script_hash=context.ScriptHash, key=key) item = self._storages.GetOrAdd(storage_key.GetHashCodeBytes(), new_item) keystr = key valStr = bytearray(item.Value) if len(key) == 20: keystr = Crypto.ToAddress(UInt160(data=key)) try: valStr = int.from_bytes(valStr, 'little') except Exception as e: pass self.events_to_dispatch.append( SmartContractEvent(SmartContractEvent.STORAGE_PUT, ['%s -> %s' % (keystr, valStr)], context.ScriptHash, Blockchain.Default().Height, engine.ScriptContainer.Hash if engine.ScriptContainer else None, test_mode=engine.testMode)) return True
def Storage_Put(self, engine): context = None try: context = engine.EvaluationStack.Pop().GetInterface( 'neo.SmartContract.StorageContext.StorageContext') except Exception as e: self.__log.debug("Storage Context Not found on stack") return False if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() if len(key) > 1024: return False value = engine.EvaluationStack.Pop().GetByteArray() new_item = StorageItem(value=value) storage_key = StorageKey(script_hash=context.ScriptHash, key=key) item = self._storages.GetOrAdd(storage_key.GetHashCodeBytes(), new_item) keystr = key valStr = bytearray(item.Value) if len(key) == 20: keystr = Crypto.ToAddress(UInt160(data=key)) try: valStr = int.from_bytes(valStr, 'little') except Exception as e: pass print("[Neo.Storage.Put] [Script: %s] [%s] -> %s" % (context.ScriptHash, keystr, valStr)) return True
def Storage_Get(self, engine): context = None try: context = engine.EvaluationStack.Pop().GetInterface( 'neo.SmartContract.StorageContext.StorageContext') except Exception as e: self.__log.debug("Storage Context not found") return False if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() storage_key = StorageKey(script_hash=context.ScriptHash, key=key) item = self._storages.TryGet(storage_key.GetHashCodeBytes()) if item is not None: engine.EvaluationStack.PushT(item.Value) else: engine.EvaluationStack.PushT(bytearray(0)) return True
def Storage_Delete(self, engine): context = engine.EvaluationStack.Pop().GetInterface( 'neo.SmartContract.StorageContext.StorageContext') if not self.CheckStorageContext(context): return False key = engine.EvaluationStack.Pop().GetByteArray() storage_key = StorageKey(script_hash=context.ScriptHash, key=key) keystr = key if len(key) == 20: keystr = Crypto.ToAddress(UInt160(data=key)) print("[Neo.Storage.Delete] [Script %s] Delete %s " % (context.ScriptHash, keystr)) self._storages.Remove(storage_key.GetHashCodeBytes()) return True