main.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!/usr/bin/env python3
  2. # Import dependencies
  3. import socket
  4. import time
  5. import random
  6. import struct
  7. import hashlib
  8. import binascii
  9. print('\n Hush Your Money Daemon is starting...\n')
  10. # Binary encode the sub-version
  11. def create_sub_version():
  12. sub_version = "/Satoshi:0.7.2/"
  13. return b'\x0F' + sub_version.encode()
  14. # Binary encode the network addresses
  15. def create_network_address(ip_address, port):
  16. network_address = struct.pack('>8s16sH', b'\x01',
  17. bytearray.fromhex("00000000000000000000ffff") + socket.inet_aton(ip_address), port)
  18. return(network_address)
  19. # Create the TCP request object
  20. def create_message(magic, command, payload):
  21. checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[0:4]
  22. return(struct.pack('L12sL4s', magic, command.encode(), len(payload), checksum) + payload)
  23. # Create the "version" request payload
  24. def create_payload_version(peer_ip_address):
  25. version = 60002
  26. services = 1
  27. timestamp = int(time.time())
  28. addr_local = create_network_address("127.0.0.1", 8333)
  29. addr_peer = create_network_address(peer_ip_address, 8333)
  30. nonce = random.getrandbits(64)
  31. start_height = 0
  32. payload = struct.pack('<LQQ26s26sQ16sL', version, services, timestamp, addr_peer,
  33. addr_local, nonce, create_sub_version(), start_height)
  34. return(payload)
  35. # Create the "verack" request message
  36. def create_message_verack():
  37. return bytearray.fromhex("f9beb4d976657261636b000000000000000000005df6e0e2")
  38. # Create the "getdata" request payload
  39. def create_payload_getdata(tx_id):
  40. count = 1
  41. type = 1
  42. hash = bytearray.fromhex(tx_id)
  43. payload = struct.pack('<bb32s', count, type, hash)
  44. return(payload)
  45. # Print request/response data
  46. def print_response(command, request_data, response_data):
  47. print("")
  48. print("Command: " + command)
  49. print("Request:")
  50. print(binascii.hexlify(request_data))
  51. print("Response:")
  52. print(binascii.hexlify(response_data))
  53. if __name__ == '__main__':
  54. # Set constants
  55. magic_value = 0xd9b4bef9
  56. tx_id = "fc57704eff327aecfadb2cf3774edc919ba69aba624b836461ce2be9c00a0c20"
  57. peer_ip_address = '104.199.184.15'
  58. peer_tcp_port = 8333
  59. buffer_size = 1024
  60. # Create Request Objects
  61. version_payload = create_payload_version(peer_ip_address)
  62. version_message = create_message(magic_value, 'version', version_payload)
  63. verack_message = create_message_verack()
  64. getdata_payload = create_payload_getdata(tx_id)
  65. getdata_message = create_message(magic_value, 'getdata', getdata_payload)
  66. # Establish TCP Connection
  67. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  68. s.connect((peer_ip_address, peer_tcp_port))
  69. # Send message "version"
  70. s.send(version_message)
  71. response_data = s.recv(buffer_size)
  72. print_response("version", version_message, response_data)
  73. # Send message "verack"
  74. s.send(verack_message)
  75. response_data = s.recv(buffer_size)
  76. print_response("verack", verack_message, response_data)
  77. # Send message "getdata"
  78. s.send(getdata_message)
  79. response_data = s.recv(buffer_size)
  80. print_response("getdata", getdata_message, response_data)
  81. # Close the TCP connection
  82. s.close()