Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #5
0
    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
Пример #7
0
    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
Пример #8
0
    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
Пример #9
0
    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