wallet.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/env python3
  2. """
  3. The wallet allows a user to query account balance, send money, and get status information about a
  4. miner.
  5. """
  6. __all__ = []
  7. import argparse
  8. import requests
  9. from src.blockchain import Blockchain
  10. from src.block import Block
  11. from src.transaction import Transaction
  12. from src.crypto import Signing
  13. def send_transaction(sess, url, transaction):
  14. resp = sess.put(url + 'new-transaction', data=transaction.to_json_compatible())
  15. resp.raise_for_status()
  16. def network_info(sess, url):
  17. resp = sess.get(url + 'network-info')
  18. resp.raise_for_status()
  19. return resp.json()
  20. def get_transactions(sess, url, pubkey):
  21. resp = sess.post(url + 'transactions', data=pubkey.as_bytes())
  22. resp.raise_for_status()
  23. return [Transaction.from_json_compatible(t) for t in resp.json()]
  24. def main():
  25. parser = argparse.ArgumentParser(description="Wallet.")
  26. parser.add_argument("--miner-port", default=40203, type=int,
  27. help="The RPC port of the miner to connect to.")
  28. parser.add_argument("--show-transactions", type=argparse.FileType("rb"), default=[],
  29. action="append", help="Shows all transactions involving the public key "
  30. "stored in the specified file.")
  31. parser.add_argument("--show-network", action="store_true", default=False,
  32. help="Prints networking information about the miner.")
  33. args = parser.parse_args()
  34. url = "http://localhost:{}/".format(args.miner_port)
  35. s = requests.session()
  36. for key in args.show_transactions:
  37. for trans in get_transactions(s, url, Signing(key.read())):
  38. print(trans.to_json_compatible())
  39. key.close()
  40. if args.show_network:
  41. for [k, v] in network_info(s, url):
  42. print("{}\t{}".format(k, v))
  43. if __name__ == '__main__':
  44. main()