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
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
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'))
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
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
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
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
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
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
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
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
def Storage_GetContext(self, engine): hash = UInt160(data=engine.CurrentContext.ScriptHash()) context = StorageContext(script_hash=hash) engine.EvaluationStack.PushT(StackItem.FromInterface(context)) return True
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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