def sign(self, transaction: Any, use_tron: bool = True, multisig: bool = False): """Safe method for signing your transaction Warnings: method: online_sign() - Use only in extreme cases. Args: transaction (Any): transaction details use_tron (bool): is Tron header multisig (bool): multi sign """ if is_string(transaction): if not is_hex(transaction): raise TronError('Expected hex message input') # Determine which header to attach to the message # before encrypting or decrypting header = TRX_MESSAGE_HEADER if use_tron else ETH_MESSAGE_HEADER header += str(len(transaction)) message_hash = self.tron.sha3( text=header + transaction ) signed_message = Account.sign_hash( message_hash, self.tron.private_key ) return signed_message if not multisig and 'signature' in transaction: raise TronError('Transaction is already signed') try: if not multisig: address = self.tron.address.from_private_key(self.tron.private_key).hex.lower() owner_address = transaction['raw_data']['contract'][0]['parameter']['value']['owner_address'] if address != owner_address: raise ValueError('Private key does not match address in transaction') # This option deals with signing of transactions, and writing to the array signed_tx = Account.sign_hash( transaction['txID'], self.tron.private_key ) signature = signed_tx['signature'].hex()[2:] # support multi sign if 'signature' in transaction and is_list(transaction['signature']): if not transaction['signature'].index(signature): transaction['signature'].append(signature) else: transaction['signature'] = [signature] return transaction except ValueError as err: raise InvalidTronError(err)
def verify_message(self, message, signed_message=None, address=None, use_tron: bool = True): """ Get the address of the account that signed the message with the given hash. You must specify exactly one of: vrs or signature Args: message (str): The message in the format "hex" signed_message (AttributeDict): Signature address (str): is Address use_tron (bool): is Tron header """ if address is None: address = self.tron.default_address.base58 if not is_hex(message): raise TronError('Expected hex message input') # Determine which header to attach to the message # before encrypting or decrypting header = TRX_MESSAGE_HEADER if use_tron else ETH_MESSAGE_HEADER message_hash = self.tron.sha3(text=header + message) recovered = Account.recover_hash(message_hash, signed_message.signature) tron_address = '41' + recovered[2:] base58address = self.tron.address.from_hex(tron_address).decode() if base58address == address: return True raise ValueError('Signature does not match')
def create_account(self) -> PrivateKey: """Create account Warning: Please control risks when using this API. To ensure environmental security, please do not invoke APIs provided by other or invoke this very API on a public network. """ return Account.create()