예제 #1
0
 def _serialize(self, with_inputs: bool = True) -> bytes:
     stream = BCDataStream()
     stream.write_uint32(self.version)
     if with_inputs:
         stream.write_compact_size(len(self._inputs))
         for txin in self._inputs:
             txin.serialize_to(stream)
     stream.write_compact_size(len(self._outputs))
     for txout in self._outputs:
         txout.serialize_to(stream)
     stream.write_uint32(self.locktime)
     return stream.get_bytes()
예제 #2
0
 def _serialize_for_signature(self, signing_input: int) -> bytes:
     stream = BCDataStream()
     stream.write_uint32(self.version)
     stream.write_compact_size(len(self._inputs))
     for i, txin in enumerate(self._inputs):
         if signing_input == i:
             assert txin.txo_ref.txo is not None
             txin.serialize_to(stream, txin.txo_ref.txo.script.source)
         else:
             txin.serialize_to(stream, b'')
     stream.write_compact_size(len(self._outputs))
     for txout in self._outputs:
         txout.serialize_to(stream)
     stream.write_uint32(self.locktime)
     stream.write_uint32(self.signature_hash_type(1))  # signature hash type: SIGHASH_ALL
     return stream.get_bytes()
예제 #3
0
파일: basescript.py 프로젝트: shyba/torba
 def generate(self, values):
     source = BCDataStream()
     for opcode in self.opcodes:
         if isinstance(opcode, PUSH_SINGLE):
             data = values[opcode.name]
             source.write_many(push_data(data))
         elif isinstance(opcode, PUSH_INTEGER):
             data = values[opcode.name]
             source.write_many(push_data(
                 data.to_bytes((data.bit_length() + 7) // 8, byteorder='little')
             ))
         elif isinstance(opcode, PUSH_SUBSCRIPT):
             data = values[opcode.name]
             source.write_many(push_data(data.source))
         elif isinstance(opcode, PUSH_MANY):
             for data in values[opcode.name]:
                 source.write_many(push_data(data))
         elif isinstance(opcode, SMALL_INTEGER):
             data = values[opcode.name]
             source.write_many(push_small_integer(data))
         else:
             source.write_uint8(opcode)
     return source.get_bytes()
예제 #4
0
 def size(self) -> int:
     """ Size of this input / output in bytes. """
     stream = BCDataStream()
     self.serialize_to(stream)
     return len(stream.get_bytes())