def op_unpack(engine): items = PushData.pop_array(engine) l = len(items) for i in range(l - 1, -1, -1): PushData.push(engine, items[i]) PushData.push_data(engine, l) return VMState.NONE
def op_new_array(engine): count = PushData.pop_int(engine) items = list() for i in range(count): items.append(BoolItem(False)) PushData.push_data(engine, ArrayItem(items)) return VMState.NONE
def op_sub_str(engine): count = PushData.pop_int(engine) index = PushData.pop_int(engine) arr = PushData.pop_bytearray(engine) bs = arr[index:index + count] PushData.push_data(engine, bs) return VMState.NONE
def op_bigint_comp(engine): print(engine.evaluation_stack.e[0].value) print(engine.evaluation_stack.e[1].value) x2 = PushData.pop_int(engine) x1 = PushData.pop_int(engine) b = PushData.bigint_multi_comp(x1, x2, engine.op_code) PushData.push_data(engine, b) return VMState.NONE
def op_pack(engine): size = PushData.pop_int(engine) items = list() for i in range(size): x = PushData.pop_stack_item(engine) items.append(x) PushData.push_data(engine, items) return VMState.NONE
def execute_op(self): if ScriptOp.OP_PUSHBYTES1.value <= self.op_code_value <= ScriptOp.OP_PUSHBYTES75.value: PushData.push_data( self, self.context.op_reader.read_bytes(self.op_code_value)) return VMState.NONE if not self.op_exec.validator(self): return VMState.FAULT return self.op_exec.exec(self)
def runtime_check_witness(self, config: Config, engine: ExecutionEngine): data = PushData.pop_bytearray(engine) if len(data) == 20: address = Address(data) l = config.get_signature_addresses() if address.b58encode() in l: PushData.push_data(engine, BoolItem(True)) else: PushData.push_data(engine, BoolItem(False))
def op_array_size(engine): item = PushData.pop_stack_item(engine) if type(item) is ArrayItem: bys = item.get_array() PushData.push_data(engine, len(bys)) else: bys = item.get_bytearray() PushData.push_data(engine, len(bys)) return VMState.NONE
def op_pick_item(engine): index = PushData.pop_stack_item(engine) items = PushData.pop_stack_item(engine) if type(items) is ArrayItem: i = index.get_biginteger() print("i:", i) arr = items.get_array() PushData.push_data(engine, arr[i]) elif type(items) is MapItem: t = items.try_get_value(index) PushData.push_data(engine, t) return VMState.NONE
def storage_get(self, config: Config, engine: ExecutionEngine): if len(engine.evaluation_stack.e) < 2: raise RuntimeError("evaluation stack size less than 2") item = PushData.pop_interop_interface(engine) key = PushData.pop_bytearray(engine) storage_map = config.get_storage_map() value = bytearray() if len(storage_map) != 0: temp = storage_map.get(item.value.hex() + key.hex(), '') value = bytearray.fromhex(temp) if value is None or value == '': value = bytearray() PushData.push_data(engine, value)
def op_sign(engine): x = PushData.pop_int(engine) if x < 0: PushData.push_data(engine, -1) elif x > 0: PushData.push_data(engine, 1) else: PushData.push_data(engine, 0) return VMState.NONE
def op_depth(engine): PushData.push_data(engine, PushData.count(engine)) return VMState.NONE
def op_new_map(engine): PushData.push_data(engine, MapItem()) return VMState.NONE
def op_hash(engine): x = PushData.pop_bytearray(engine) PushData.push_data(engine, PushData.hash(x, engine)) return VMState.NONE
def op_right(engine): count = PushData.pop_int(engine) arr = PushData.pop_bytearray(engine) bs = arr[len(arr) - count:] PushData.push_data(engine, bs) return VMState.NONE
def op_left(engine): count = PushData.pop_int(engine) arr = PushData.pop_bytearray(engine) bs = arr[0:count] PushData.push_data(engine, bs) return VMState.NONE
def op_cat(engine): bs2 = PushData.pop_bytearray(engine) bs1 = PushData.pop_bytearray(engine) r = PushData.concat(bs1, bs2) PushData.push_data(engine, r) return VMState.NONE
def op_size(engine): arr = PushData.pop_bytearray(engine) PushData.push_data(engine, len(arr)) return VMState.NONE
def op_within(engine): b = PushData.pop_int(engine) a = PushData.pop_int(engine) c = PushData.pop_int(engine) PushData.push_data(engine, PushData.within_op(c, a, b)) return VMState.NONE
def storage_get_context(self, config: Config, engine: ExecutionEngine): PushData.push_data( engine, InteropItem(config.contract_address.encode('utf-8')))
def runtime_deserialize(self, config: Config, engine: ExecutionEngine): bys = PushData.pop_bytearray(engine) reader = VmReader(bys) items = self.__deserialize_stack_item(reader) PushData.push_data(engine, items)
def op_bool_zip(engine): x2 = PushData.pop_bool(engine) x1 = PushData.pop_bool(engine) b = PushData.bool_zip(x2, x1, engine.op_code) PushData.push_data(engine, b) return VMState.NONE
def op_nz(engine): x = PushData.pop_int(engine) PushData.push_data(engine, PushData.bigint_comp(x, engine.op_code)) return VMState.NONE
def op_not(engine): x = PushData.pop_bool(engine) PushData.push_data(engine, not x) return VMState.NONE
def runtime_serialize(self, config: Config, engine: ExecutionEngine): t = PushData.pop_stack_item(engine) stream = StreamManager.GetStream() writer = BinaryWriter(stream) self.__serialize_stack_item(t, writer) PushData.push_data(engine, stream.ToArray())
def op_invert(engine): i = PushData.pop_int() PushData.push_data(engine, i) return VMState.NONE
def op_equal(engine): b1 = PushData.pop_stack_item(engine) b2 = PushData.pop_stack_item(engine) PushData.push_data(engine, b1.equals(b2)) return VMState.NONE