def single_sign_transaction(keystore: KeyStore, tx: Transaction): data = tx.serialize_unsigned() signature = keytool.ecdsa_sign(keystore.private_key, data) r = b"" r = serialize.write_var_bytes(r, signature) tx.programs[0].parameter = r tx.hash() return tx
def single_sign_transaction(input_private_key: str, tx: Transaction): data = tx.serialize_unsigned() signature = keytool.ecdsa_sign(bytes.fromhex(input_private_key), data) r = b"" r = serialize.write_var_bytes(r, signature) tx.programs[0].parameter = r tx.hash() return tx
def handle_tx_result(self, tx: Transaction, port=rpc.DEFAULT_PORT): r = tx.serialize() response = rpc.send_raw_transaction(r.hex(), port) if isinstance(response, dict): Logger.error("{} rpc response: {}".format(self.tag, response)) Logger.error("rpc send raw transaction failed") return False tx_hash = util.bytes_reverse(bytes.fromhex(tx.hash())).hex() Logger.debug("{} tx hash : {}".format(self.tag, tx_hash)) Logger.debug("{} response: {}".format(self.tag, response)) return tx_hash
def create_abnormal_transaction(input_private_key: str, output_addresses: list, amount: int, rpc_port: int, attributes=None): account = Account(input_private_key) # check output if output_addresses is None or len(output_addresses) == 0: Logger.error("Invalid output addresses") return None # create outputs outputs, total_amount = create_normal_outputs( output_addresses=output_addresses, amount=amount, fee=util.TX_FEE, output_lock=0 ) # create inputs inputs, change_outputs = create_normal_inputs(account.address(), total_amount, rpc_port) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = bytes.fromhex(account.redeem_script()) program = Program(code=redeem_script, params=None) programs.append(program) # create attributes if attributes is None: attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.TRANSFER_ASSET tx.payload = Payload(Payload.DEFAULT_VERSION) tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_vote_transaction(input_private_key: str, candidates_list: list, amount: int, rpc_port: int, vote_content): # check output if candidates_list is None or len(candidates_list) == 0: Logger.error("Invalid output addresses") return None # candidates_bytes_list = list() # # for candidate in candidates_list: # candidates_bytes_list.append(bytes.fromhex(candidate)) # create outputs account = Account(input_private_key) outputs = create_vote_output(account.address(), amount, vote_content) # create inputs total_amount = amount + util.TX_FEE inputs, change_outputs = create_normal_inputs(account.address(), total_amount, rpc_port) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = bytes.fromhex(account.redeem_script()) program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.TRANSFER_ASSET tx.payload = Payload(Payload.DEFAULT_VERSION) tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_activate_producer(keystore: KeyStore): pub_key = keystore.public_key pri_key = keystore.private_key activate_producer = ProcessProducer(pub_key, pri_key) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.ACTIVATE_PRODUCER tx.payload = activate_producer tx.attributes = [] tx.inputs = [] tx.outputs = [] tx.programs = list() tx.lock_time = 0 return tx
def create_active_transaction(node_private_key: str, node_public_key: str): pub_key = bytes.fromhex(node_public_key) pri_key = bytes.fromhex(node_private_key) activate_producer = ProcessProducer(pub_key, pri_key) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.ACTIVATE_PRODUCER tx.payload = activate_producer tx.attributes = [] tx.inputs = [] tx.outputs = [] tx.programs = list() tx.lock_time = 0 return tx
def create_transaction(keystore: KeyStore, output_addresses: list, amount: int, fee=10000, output_lock=0): # check output if output_addresses is None or len(output_addresses) == 0: Logger.error("Invalid output addresses") return None # create outputs outputs, total_amount = create_normal_outputs( output_addresses=output_addresses, amount=amount, fee=fee, output_lock=output_lock ) # create inputs inputs, change_outputs = create_normal_inputs(keystore.address, total_amount) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = keystore.sign_script program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.TRANSFER_ASSET tx.payload = Payload(Payload.DEFAULT_VERSION) tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def handle_tx_result(self, tx: Transaction, port=rpc.DEFAULT_PORT): # Logger.debug("{} {}".format(self.tag, tx)) r = tx.serialize() response = rpc.send_raw_transaction(r.hex(), port) if isinstance(response, dict): Logger.error("{} rpc response: {}".format(self.tag, response)) Logger.error("rpc send raw transaction failed") return False # response return on success, response is tx hash, but we should reverse it at first reverse_res = util.bytes_reverse(bytes.fromhex(response)).hex() Logger.debug("{} tx hash : {}".format(self.tag, tx.hash())) Logger.debug("{} response: {}".format(self.tag, reverse_res)) return tx.hash() == reverse_res
def create_cancel_transaction(owner_keystore: KeyStore): # create inputs fee = 10000 inputs, change_outputs = create_normal_inputs(owner_keystore.address, fee) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None # create outputs outputs = list() outputs.extend(change_outputs) # create program programs = list() redeem_script = owner_keystore.sign_script program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) payload = ProcessProducer(owner_keystore.public_key, owner_keystore.private_key) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.CANCEL_PRODUCER tx.payload_version = 0 tx.payload = payload tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_cr_redeem_transaction(payload: CRInfo, output_address: str, amount: int, rpc_port: int): # create outputs outputs, total_amount = create_normal_outputs( output_addresses=[output_address], amount=amount, fee=util.TX_FEE, output_lock=0 ) # create inputs deposit_address = payload.get_deposit_address() inputs, change_outputs = create_normal_inputs(deposit_address, total_amount, rpc_port) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = bytes.fromhex(payload.account.redeem_script()) program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.RETURN_CR_DEPOSIT_COIN tx.payload_version = 0 tx.payload = Payload(Payload.DEFAULT_VERSION) tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_cr_cancel_transaction(input_private_key: str, payload: UnRegisterCR, rpc_port: int): # create inputs account = Account(input_private_key) inputs, change_outputs = create_normal_inputs(account.address(), util.TX_FEE, rpc_port) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None # create outputs outputs = list() outputs.extend(change_outputs) # create program programs = list() redeem_script = bytes.fromhex(account.redeem_script()) program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.UN_REGISTER_CR tx.payload_version = 0 tx.payload = payload tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_crc_proposal_transaction(input_private_key: str, amount: int, payload: CRCProposal, rpc_port: int): # create outputs account = Account(input_private_key) outputs, total_amount = create_normal_outputs( output_addresses=[account.address()], amount=amount, fee=util.TX_FEE, output_lock=0 ) # create inputs inputs, change_outputs = create_normal_inputs(account.address(), total_amount, rpc_port) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = bytes.fromhex(account.redeem_script()) program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.CRC_PROPOSAL tx.payload_version = 0 tx.payload = payload tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_crc_proposal_withdraw_transaction(input_address: str, amount: int, payload: CRCProposalWithdraw, rpc_port: int, output_address: str): # create outputs outputs, total_amount = create_normal_outputs( output_addresses=[output_address], amount=amount, fee=util.TX_FEE, output_lock=0 ) # create inputs inputs, change_outputs = create_normal_inputs(input_address, total_amount, rpc_port) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.CRC_PROPOSAL_WITHDRAW tx.payload_version = 0 tx.payload = payload tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_cross_chain_transaction_by_utxo(input_private_key: str, lock_address: str, cross_chain_address: str, amount: int, recharge: bool, utxos: list): if lock_address is None or lock_address is "": Logger.error("Invalid lock address") return None if cross_chain_address is None or cross_chain_address is "": Logger.error("Invalid cross chain address") return None account = Account(input_private_key) # create outputs: outputs, total_amount = create_normal_outputs( output_addresses=[lock_address], amount=amount, fee=util.TX_FEE, output_lock=0 ) # create inputs: inputs, change_outputs = create_normal_inputs_by_utxo( account.address(), total_amount, utxos) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = bytes.fromhex(account.redeem_script()) program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) cross_chain_asset = TransferCrossChainAsset() cross_chain_asset.cross_chain_addresses = [cross_chain_address] cross_chain_asset.output_indexes = [0] cross_chain_asset.cross_chain_amounts = [amount - 10000] tx = Transaction() if recharge: tx.version = Transaction.TX_VERSION_09 else: tx.version = Transaction.TX_VERSION_DEFAULT # Logger.debug("transaction version {}".format(tx.version)) tx.tx_type = Transaction.TRANSFER_CROSS_CHAIN_ASSET tx.payload = cross_chain_asset tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_redeem_transaction(keystore: KeyStore, amount: int): # create outputs outputs, total_amount = create_normal_outputs( output_addresses=[keystore.address], amount=amount, fee=10000, output_lock=0 ) # create inputs deposit_address = keytool.gen_deposit_address(keystore.program_hash) inputs, change_outputs = create_normal_inputs(deposit_address, total_amount) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = keystore.sign_script program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) tx = Transaction() tx.version = Transaction.TX_VERSION_09 tx.tx_type = Transaction.RETURN_DEPOSIT_CHAIN tx.payload_version = 0 tx.payload = Payload(Payload.DEFAULT_VERSION) tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx
def create_cross_chain_asset(keystore: KeyStore, lock_address: str, cross_chain_address: str, amount: int, port: int): if lock_address is None or lock_address is "": Logger.error("Invalid lock address") return None if cross_chain_address is None or cross_chain_address is "": Logger.error("Invalid cross chain address") return None # create outputs: outputs, total_amount = create_normal_outputs( output_addresses=[lock_address], amount=amount, fee=10000, output_lock=0 ) # create inputs: inputs, change_outputs = create_normal_inputs(keystore.address(), total_amount, port) if inputs is None or change_outputs is None: Logger.error("Create normal inputs failed") return None outputs.extend(change_outputs) # create program programs = list() redeem_script = keystore.sign_script program = Program(code=redeem_script, params=None) programs.append(program) # create attributes attributes = list() attribute = Attribute( usage=Attribute.NONCE, data=bytes("attributes".encode()) ) attributes.append(attribute) cross_chain_asset = TransferCrossChainAsset() cross_chain_asset.cross_chain_addresses = [cross_chain_address] cross_chain_asset.output_indexes = [0] cross_chain_asset.cross_chain_amounts = [amount - 10000] tx = Transaction() if port == rpc.DEFAULT_PORT: tx.version = Transaction.TX_VERSION_09 else: tx.version = Transaction.TX_VERSION_DEFAULT Logger.debug("transaction version {}".format(tx.version)) tx.tx_type = Transaction.TRANSFER_CROSS_CHAIN_ASSET tx.payload = cross_chain_asset tx.attributes = attributes tx.inputs = inputs tx.outputs = outputs tx.lock_time = 0 tx.programs = programs return tx