Package: xpring
The Xpring SDK for Python.Installpipinstallxpring[py]APIWalletConstructYou can construct aWalletfrom its seed.
If you do not have your own wallet yet, you cangenerate one with some free
XRP on the testnet.importxpringseed='sEdSKaCy2JT7JaM7v95H9SxkhP9wS2r'wallet=xpring.Wallet.from_seed(seed)print(wallet.private_key.hex())# b4c4e046826bd26190d09715fc31f4e6a728204eadd112905b08b14b7f15c4f3print(wallet.public_key.hex())# ed01fa53fa5a7e77798f882ece20b1abc00bb358a9e55a202d0d0676bd0ce37a63print(wallet.account_id.hex())# d28b177e48d9a8d057e70f7e464b498367281b98print(wallet.address)# rLUEXYuLiQptky37CqLcm9USQpPiz5rkpDSign / VerifyAWalletcan sign and verify arbitrary bytes, but you’ll generally
want to leave these low-level responsibilities to theClient.message=bytes.fromhex('DEADBEEF')signature=wallet.sign(message)wallet.verify(message,signature)# TrueClientClientis the gateway to the XRP Ledger.
It is constructed with the URL of the gRPC service of arippledserver.
If you are running the server yourself,
you need to configure the[port_grpc]stanza in your configuration file.
In theexampleconfiguration file, it iscommentedout.# url = 'main.xrp.xpring.io:50051' # Mainneturl='test.xrp.xpring.io:50051'# Testnetclient=xpring.Client.from_url(url)Account>>>client.get_account(wallet.address)account_data{account{value{address:"rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY"}}balance{value{xrp_amount{drops:999999820}}}sequence:{value:10}flags{}owner_count{}previous_transaction_id{value:b"..."}previous_transaction_ledger_sequence{value:4845872}}ledger_index:4869818Fee>>>client.get_fee()current_ledger_size:6fee{base_fee{drops:10}median_fee{drops:5000}minimum_fee{drops:10}open_ledger_fee{drops:10}}expected_ledger_size:25ledger_current_index:4869844levels{median_level:128000minimum_level:256open_ledger_level:256reference_level:256}max_queue_size:2000Submit>>>unsigned_transaction={...'Account':'rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY',...'Amount':'10',...'Destination':'rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz',...'Fee':'10',...'Flags':0x80000000,...'Sequence':9,...'TransactionType':'Payment'...}>>>signed_transaction=wallet.sign_transaction(unsigned_transaction)>>>client.submit(signed_transaction)engine_result{result_type:RESULT_TYPE_TESresult:"tesSUCCESS"}engine_result_message:"The transaction was applied. Only final in a validated ledger."hash:b"...">>>client.submit(signed_transaction)engine_result{result_type:RESULT_TYPE_TEFresult:"tefPAST_SEQ"}engine_result_code:-190engine_result_message:"This sequence number has already passed."hash:b"..."Transaction>>>txid=bytes.fromhex(signed_transaction['hash'])>>>client.get_transaction(txid)transaction{account{value{address:"rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY"}}fee{drops:10}sequence{value:10}payment{amount{value{xrp_amount{drops:10}}}destination{value{address:"rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz"}}}signing_public_key{value:b"..."}transaction_signature{value:b"..."}flags{value:2147483648}}ledger_index:5124377hash:b"..."validated:truemeta{transaction_index:1transaction_result{result_type:RESULT_TYPE_TESresult:"tesSUCCESS"}affected_nodes{ledger_entry_type:LEDGER_ENTRY_TYPE_ACCOUNT_ROOTledger_index:b"..."modified_node{final_fields{account_root{account{value{address:"rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz"}}balance{value{xrp_amount{drops:1000000100}}}sequence{value:1}flags{}owner_count{}}}previous_fields{account_root{balance{value{xrp_amount{drops:1000000090}}}}}previous_transaction_id{value:b"..."}previous_transaction_ledger_sequence{value:4845872}}}affected_nodes{ledger_entry_type:LEDGER_ENTRY_TYPE_ACCOUNT_ROOTledger_index:b"..."modified_node{final_fields{account_root{account{value{address:"rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY"}}balance{value{xrp_amount{drops:999999800}}}sequence{value:11}flags{}owner_count{}}}previous_fields{account_root{balance{value{xrp_amount{drops:999999820}}}sequence{value:10}}}previous_transaction_id{value:b"..."}previous_transaction_ledger_sequence{value:4845872}}}delivered_amount{value{xrp_amount{drops:10}}}}date{value:636581642}