def __serialize_stack_item(self, item: StackItems, writer: BinaryWriter): if type(item) == ByteArrayItem: writer.write_byte(BuildParams.Type.bytearraytype.value) bys = item.get_bytearray() writer.write_var_bytes(bys) elif type(item) == IntegerItem: writer.write_byte(BuildParams.Type.integertype.value) bys = item.get_bytearray() writer.write_var_bytes(bys) elif type(item) == BoolItem: writer.write_byte(BuildParams.Type.booltype.value) bys = item.get_bytearray() writer.write_var_bytes(bys) elif type(item) == ArrayItem: writer.write_byte(BuildParams.Type.arraytype.value) arr = item.get_array() writer.write_var_int(len(arr)) for i in range(len(arr)): self.__serialize_stack_item(item, writer) elif type(item) == StructItem: pass elif type(item) == MapItem: writer.write_byte(BuildParams.Type.maptype.value) map = item.get_map() writer.write_var_int(len(map)) for key, value in map.items(): self.__serialize_stack_item(key, writer) self.__serialize_stack_item(value, writer) else: pass
def test_read_var_int(self): value = 123 writer_stream = StreamManager.get_stream() writer = BinaryWriter(writer_stream) writer.write_var_int(value) reader_stream = StreamManager.get_stream(writer_stream.getbuffer()) reader = BinaryReader(reader_stream) self.assertEqual(reader.read_var_int(), value)
def serialize(self, is_hex: bool = False) -> bytes: ms = StreamManager.GetStream() writer = BinaryWriter(ms) writer.write_bytes(self.serialize_unsigned()) writer.write_var_int(len(self.sigs)) for sig in self.sigs: writer.write_bytes(sig.serialize()) ms.flush() temp = ms.ToArray() StreamManager.ReleaseStream(ms) if is_hex: return temp else: return a2b_hex(temp)
def serialize(self, is_hex: bool = False) -> bytes or str: ms = StreamManager.get_stream() writer = BinaryWriter(ms) writer.write_bytes(self.serialize_unsigned(is_str=False)) writer.write_var_int(len(self.sig_list)) for sig in self.sig_list: writer.write_bytes(sig.serialize()) ms.flush() bytes_tx = ms.to_bytes() StreamManager.release_stream(ms) if is_hex: return bytes_tx.hex() else: return bytes_tx
def serialize_unsigned(self) -> bytes: ms = StreamManager.GetStream() writer = BinaryWriter(ms) writer.write_uint8(self.version) writer.write_uint8(self.tx_type) writer.write_uint32(self.nonce) writer.write_uint64(self.gas_price) writer.write_uint64(self.gas_limit) writer.write_bytes(bytes(self.payer)) self.serialize_exclusive_data(writer) if hasattr(self, "payload"): writer.write_var_bytes(bytes(self.payload)) writer.write_var_int(len(self.attributes)) ms.flush() res = ms.ToArray() StreamManager.ReleaseStream(ms) return res
def serialize_unsigned(self) -> bytes or str: ms = StreamManager.get_stream() writer = BinaryWriter(ms) writer.write_uint8(self.version) writer.write_uint8(self.tx_type) writer.write_uint32(self.nonce) writer.write_uint64(self.gas_price) writer.write_uint64(self.gas_limit) writer.write_bytes(self.payer) self.serialize_exclusive_data(writer) if self.payload is not None and len(self.payload) != 0: writer.write_var_bytes(bytes(self.payload)) writer.write_var_int(len(self.attributes)) ms.flush() hex_bytes = ms.to_bytes() StreamManager.release_stream(ms) return hex_bytes