示例#1
0
 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
示例#2
0
 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
示例#5
0
 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
示例#6
0
 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)
示例#7
0
 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))
示例#8
0
 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
示例#9
0
 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
示例#10
0
 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
示例#12
0
 def op_depth(engine):
     PushData.push_data(engine, PushData.count(engine))
     return VMState.NONE
示例#13
0
 def op_new_map(engine):
     PushData.push_data(engine, MapItem())
     return VMState.NONE
示例#14
0
 def op_hash(engine):
     x = PushData.pop_bytearray(engine)
     PushData.push_data(engine, PushData.hash(x, engine))
     return VMState.NONE
示例#15
0
 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
示例#16
0
 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
示例#17
0
 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
示例#18
0
 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
示例#20
0
 def storage_get_context(self, config: Config, engine: ExecutionEngine):
     PushData.push_data(
         engine, InteropItem(config.contract_address.encode('utf-8')))
示例#21
0
 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
示例#25
0
 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())
示例#26
0
 def op_invert(engine):
     i = PushData.pop_int()
     PushData.push_data(engine, i)
     return VMState.NONE
示例#27
0
 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