Exemple #1
0
    def Blockchain_GetHeader(self, engine):
        data = engine.EvaluationStack.Pop().GetByteArray()

        header = None

        if len(data) <= 5:

            height = BigInteger.FromBytes(data)

            if Blockchain.Default() is not None:

                header = Blockchain.Default().GetHeaderBy(
                    height_or_hash=height)

            elif height == 0:

                header = Blockchain.GenesisBlock().Header

        elif len(data) == 32:

            hash = UInt256(data=data)

            if Blockchain.Default() is not None:

                header = Blockchain.Default().GetHeaderBy(height_or_hash=hash)

            elif hash == Blockchain.GenesisBlock().Hash:

                header = Blockchain.GenesisBlock().Header

        engine.EvaluationStack.PushT(StackItem.FromInterface(header))
        return True
Exemple #2
0
    def Contract_Create(self, engine):

        script = engine.EvaluationStack.Pop().GetByteArray()

        if len(script) > 1024 * 1024:
            return False

        param_list = engine.EvaluationStack.Pop().GetByteArray()
        if len(param_list) > 252:
            return False

        return_type = int(engine.EvaluationStack.Pop().GetBigInteger())

        needs_storage = engine.EvaluationStack.Pop().GetBoolean()

        if len(engine.EvaluationStack.Peek().GetByteArray()) > 252:
            return False
        name = engine.EvaluationStack.Pop().GetByteArray()

        if len(engine.EvaluationStack.Peek().GetByteArray()) > 252:
            return False
        code_version = engine.EvaluationStack.Pop().GetByteArray()

        if len(engine.EvaluationStack.Peek().GetByteArray()) > 252:
            return False
        author = engine.EvaluationStack.Pop().GetByteArray()

        if len(engine.EvaluationStack.Peek().GetByteArray()) > 252:
            return False
        email = engine.EvaluationStack.Pop().GetByteArray()

        if len(engine.EvaluationStack.Peek().GetByteArray()) > 65536:
            return False

        description = engine.EvaluationStack.Pop().GetByteArray()

        hash = Crypto.ToScriptHash(script, unhex=False)

        contract = self._contracts.TryGet(hash.ToBytes())

        if contract is None:

            code = FunctionCode(script=script,
                                param_list=param_list,
                                return_type=return_type)

            contract = ContractState(code, needs_storage, name, code_version,
                                     author, email, description)

            self._contracts.GetAndChange(code.ScriptHash().ToBytes(), contract)

            self._contracts_created[hash.ToBytes()] = UInt160(
                data=engine.CurrentContext.ScriptHash())

        engine.EvaluationStack.PushT(StackItem.FromInterface(contract))

        #        print("*****************************************************")
        #        print("CREATED CONTRACT %s " % hash.ToBytes())
        #        print("*****************************************************")
        return True
Exemple #3
0
 def test_cant_serialize_iop_item(self, mocked_logger):
     genesis = Blockchain.GenesisBlock()
     self.econtext.EvaluationStack.PushT(StackItem.FromInterface(genesis))
     self.engine.InvocationStack.PushT(self.econtext)
     cant_do = self.state_reader.Runtime_Serialize(self.engine)
     self.assertEqual(cant_do, False)
     mocked_logger.assert_called_with(StringIn('Cannot serialize item IOp Interface: <neo.Core.Block.Block object'))
Exemple #4
0
    def Storage_GetReadOnlyContext(self, engine: ExecutionEngine):
        hash = UInt160(data=engine.CurrentContext.ScriptHash())
        context = StorageContext(script_hash=hash, read_only=True)

        engine.CurrentContext.EvaluationStack.PushT(StackItem.FromInterface(context))

        return True
Exemple #5
0
    def Blockchain_GetAccount(self, engine: ExecutionEngine):
        hash = UInt160(data=engine.CurrentContext.EvaluationStack.Pop().GetByteArray())
        address = Crypto.ToAddress(hash).encode('utf-8')

        account = self.Accounts.GetOrAdd(address, new_instance=AccountState(script_hash=hash))
        engine.CurrentContext.EvaluationStack.PushT(StackItem.FromInterface(account))
        return True
Exemple #6
0
    def Asset_Renew(self, engine):

        current_asset = engine.EvaluationStack.Pop().GetInterface()

        if current_asset is None:
            return False

        years = engine.EvaluationStack.Pop().GetBigInteger()

        asset = self._assets.GetAndChange(current_asset.AssetId.ToBytes())

        if asset.Expiration < Blockchain.Default().Height + 1:
            asset.Expiration = Blockchain.Default().Height + 1

        try:

            asset.Expiration = asset.Expiration + years * 2000000

        except Exception as e:
            logger.error("could not set expiration date %s " % e)

            asset.Expiration = sys.maxsize

        # tx = engine.ScriptContainer
        # print("*****************************************************")
        # print("Renewed ASSET %s " % tx.Hash.ToBytes())
        # print("*****************************************************")
        engine.EvaluationStack.PushT(StackItem.FromInterface(asset))

        engine.EvaluationStack.PushT(asset.Expiration)

        return True
Exemple #7
0
 def Enumerator_Create(self, engine):
     item = engine.EvaluationStack.Pop()
     if isinstance(item, Array):
         enumerator = ArrayWrapper(item)
         engine.EvaluationStack.PushT(StackItem.FromInterface(enumerator))
         return True
     return False
Exemple #8
0
 def Iterator_Keys(self, engine: ExecutionEngine):
     iterator = engine.CurrentContext.EvaluationStack.Pop().GetInterface()
     if iterator is None:
         return False
     wrapper = StackItem.FromInterface(KeysWrapper(iterator))
     engine.CurrentContext.EvaluationStack.PushT(wrapper)
     return True
Exemple #9
0
 def Iterator_Create(self, engine: ExecutionEngine):
     item = engine.CurrentContext.EvaluationStack.Pop()
     if isinstance(item, Map):
         iterator = MapWrapper(item)
         engine.CurrentContext.EvaluationStack.PushT(StackItem.FromInterface(iterator))
         return True
     return False
Exemple #10
0
    def Blockchain_GetBlock(self, engine):
        data = engine.EvaluationStack.Pop()

        if data:
            data = data.GetByteArray()
        else:
            return False

        block = None

        if len(data) <= 5:
            height = BigInteger.FromBytes(data)

            if Blockchain.Default() is not None:

                block = Blockchain.Default().GetBlockByHeight(height)

            elif height == 0:

                block = Blockchain.GenesisBlock()

        elif len(data) == 32:

            hash = UInt256(data=data).ToBytes()

            if Blockchain.Default() is not None:

                block = Blockchain.Default().GetBlockByHash(hash=hash)

            elif hash == Blockchain.GenesisBlock().Hash:

                block = Blockchain.GenesisBlock().Header

        engine.EvaluationStack.PushT(StackItem.FromInterface(block))
        return True
Exemple #11
0
 def Blockchain_GetContract(self, engine: ExecutionEngine):
     hash = UInt160(data=engine.CurrentContext.EvaluationStack.Pop().GetByteArray())
     contract = self.Contracts.TryGet(hash.ToBytes())
     if contract is None:
         engine.CurrentContext.EvaluationStack.PushT(bytearray(0))
     else:
         engine.CurrentContext.EvaluationStack.PushT(StackItem.FromInterface(contract))
     return True
Exemple #12
0
    def Storage_GetContext(self, engine):

        hash = UInt160(data=engine.CurrentContext.ScriptHash())
        context = StorageContext(script_hash=hash)

        engine.EvaluationStack.PushT(StackItem.FromInterface(context))

        return True
Exemple #13
0
    def Account_GetVotes(self, engine: ExecutionEngine):
        account = engine.CurrentContext.EvaluationStack.Pop().GetInterface()
        if account is None:
            return False

        votes = [StackItem.FromInterface(v.EncodePoint(True)) for v in account.Votes]
        engine.CurrentContext.EvaluationStack.PushT(votes)
        return True
Exemple #14
0
    def Iterator_Values(self, engine):
        iterator = engine.EvaluationStack.Pop().GetInterface()
        if iterator is None:
            return False

        wrapper = StackItem.FromInterface(ValuesWrapper(iterator))
        engine.EvaluationStack.PushT(wrapper)
        return True
Exemple #15
0
    def Blockchain_GetContract(self, engine):
        hash = UInt160(data = engine.EvaluationStack.Pop().GetByteArray())
        contract = None

        if Blockchain.Default() is not None:
            contract = Blockchain.Default().GetContract(hash)

        engine.EvaluationStack.PushT(StackItem.FromInterface(contract))
        return True
Exemple #16
0
    def Blockchain_GetAsset(self, engine):
        data = engine.EvaluationStack.Pop().GetByteArray()
        asset = None

        if Blockchain.Default() is not None:
            asset = Blockchain.Default().GetAssetState(UInt256(data=data))

        engine.EvaluationStack.PushT(StackItem.FromInterface(asset))
        return True
Exemple #17
0
    def Blockchain_GetAccount(self, engine):
        hash = UInt160(data=engine.EvaluationStack.Pop().GetByteArray())
        address = Crypto.ToAddress(hash).encode('utf-8')
        account = self._accounts.TryGet(address)
        if account:
            engine.EvaluationStack.PushT(StackItem.FromInterface(account))
            return True

        return False
Exemple #18
0
    def Transaction_GetUnspentCoins(self, engine):
        tx = engine.EvaluationStack.Pop().GetInterface()

        if tx is None:
            return False

        refs = [StackItem.FromInterface(unspent) for unspent in Blockchain.Default().GetAllUnspent(tx.Hash)]
        engine.EvaluationStack.PushT(refs)
        return True
Exemple #19
0
    def Blockchain_GetTransaction(self, engine: ExecutionEngine):
        data = engine.CurrentContext.EvaluationStack.Pop().GetByteArray()
        tx = None

        if Blockchain.Default() is not None:
            tx, height = Blockchain.Default().GetTransaction(UInt256(data=data))

        engine.CurrentContext.EvaluationStack.PushT(StackItem.FromInterface(tx))
        return True
Exemple #20
0
    def Account_GetVotes(self, engine):

        account = engine.EvaluationStack.Pop().GetInterface('neo.Core.State.AccountState.AccountState')
        if account is None:
            return False

        votes = [StackItem.FromInterface(v.EncodePoint(True)) for v in account.Votes]
        engine.EvaluationStack.PushT(votes)
        return True
Exemple #21
0
    def Blockchain_GetContract(self, engine):
        hash = UInt160(data=engine.EvaluationStack.Pop().GetByteArray())

        contract = self._contracts.TryGet(hash.ToBytes())

        if contract:
            engine.EvaluationStack.PushT(StackItem.FromInterface(contract))
            return True
        return False
Exemple #22
0
    def Blockchain_GetAsset(self, engine):

        hash = UInt256(data=engine.EvaluationStack.Pop().GetByteArray())

        asset = self._assets.TryGet(hash.ToBytes())
        if asset:
            engine.EvaluationStack.PushT(StackItem.FromInterface(asset))
            return True
        return False
Exemple #23
0
    def Transaction_GetInputs(self, engine):

        tx = engine.EvaluationStack.Pop().GetInterface()
        if tx is None:
            return False

        inputs = [StackItem.FromInterface(input) for input in tx.inputs]
        engine.EvaluationStack.PushT(inputs)
        return True
Exemple #24
0
    def Transaction_GetAttributes(self, engine):

        tx = engine.EvaluationStack.Pop().GetInterface()
        if tx is None:
            return False

        attr = [StackItem.FromInterface(attr) for attr in tx.Attributes]
        engine.EvaluationStack.PushT(attr)
        return True
Exemple #25
0
    def Block_GetTransactions(self, engine):

        block = engine.EvaluationStack.Pop().GetInterface()
        if block is None:
            return False

        txlist = [StackItem.FromInterface(tx) for tx in block.FullTransactions]
        engine.EvaluationStack.PushT(txlist)
        return True
Exemple #26
0
    def Transaction_GetOutputs(self, engine):

        tx = engine.EvaluationStack.Pop().GetInterface(
            'neo.Core.TX.Transaction.Transaction')
        if tx is None:
            return False

        outputs = [StackItem.FromInterface(output) for output in tx.outputs]
        engine.EvaluationStack.PushT(outputs)
        return True
Exemple #27
0
    def Blockchain_GetAsset(self, engine: ExecutionEngine):
        data = engine.CurrentContext.EvaluationStack.Pop().GetByteArray()
        asset = None

        if Blockchain.Default() is not None:
            asset = self.Assets.TryGet(UInt256(data=data))
        if asset is None:
            return False
        engine.CurrentContext.EvaluationStack.PushT(StackItem.FromInterface(asset))
        return True
Exemple #28
0
    def Block_GetTransaction(self, engine: ExecutionEngine):
        block = engine.CurrentContext.EvaluationStack.Pop().GetInterface()
        index = engine.CurrentContext.EvaluationStack.Pop().GetBigInteger()

        if block is None or index < 0 or index > len(block.Transactions):
            return False

        tx = StackItem.FromInterface(block.FullTransactions[index])
        engine.CurrentContext.EvaluationStack.PushT(tx)
        return True
Exemple #29
0
    def Transaction_GetReferences(self, engine):

        tx = engine.EvaluationStack.Pop().GetInterface(
            'neo.Core.TX.Transaction.Transaction')
        if tx is None:
            return False

        refs = [StackItem.FromInterface(ref) for ref in tx.References]
        engine.EvaluationStack.PushT(refs)
        return True
Exemple #30
0
    def Transaction_GetReferences(self, engine):

        tx = engine.EvaluationStack.Pop().GetInterface()

        if tx is None:
            return False

        refs = [StackItem.FromInterface(tx.References[input]) for input in tx.inputs]

        engine.EvaluationStack.PushT(refs)
        return True