Advertisement
skip420

BTC_Network

Sep 9th, 2022
1,119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.17 KB | None | 0 0
  1. python3 BTC_Network.py
  2.  
  3.  
  4.  
  5. import socket
  6. import time
  7. import random
  8. import struct
  9. import hashlib
  10. import binascii
  11.  
  12.  
  13. # Binary encode the sub-version
  14. def create_sub_version():
  15.     sub_version = "/Satoshi:0.7.2/"
  16.     return b'\x0F' + sub_version.encode()
  17.  
  18. # Binary encode the network addresses
  19. def create_network_address(ip_address, port):
  20.     network_address = struct.pack('>8s16sH', b'\x01',
  21.         bytearray.fromhex("00000000000000000000ffff") + socket.inet_aton(ip_address), port)
  22.     return(network_address)
  23.  
  24. # Create the TCP request object
  25. def create_message(magic, command, payload):
  26.     checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[0:4]
  27.     return(struct.pack('L12sL4s', magic, command.encode(), len(payload), checksum) + payload)
  28.  
  29. # Create the "version" request payload
  30. def create_payload_version(peer_ip_address):
  31.     version = 60002
  32.     services = 1
  33.     timestamp = int(time.time())
  34.     addr_local = create_network_address("127.0.0.1", 8333)
  35.     addr_peer = create_network_address(peer_ip_address, 8333)
  36.     nonce = random.getrandbits(64)
  37.     start_height = 0
  38.     payload = struct.pack('<LQQ26s26sQ16sL', version, services, timestamp, addr_peer,
  39.                           addr_local, nonce, create_sub_version(), start_height)
  40.     return(payload)
  41.  
  42. # Create the "verack" request message
  43. def create_message_verack():
  44.     return bytearray.fromhex("f9beb4d976657261636b000000000000000000005df6e0e2")
  45.  
  46. # Create the "getdata" request payload
  47. def create_payload_getdata(tx_id):
  48.     count = 1
  49.     type = 1
  50.     hash = bytearray.fromhex(tx_id)
  51.     payload = struct.pack('<bb32s', count, type, hash)
  52.     return(payload)
  53.  
  54. # Print request/response data
  55. def print_response(command, request_data, response_data):
  56.     print("")
  57.     print("Command: " + command)
  58.     print("Request:")
  59.     print(binascii.hexlify(request_data))
  60.     print("Response:")
  61.     print(binascii.hexlify(response_data))
  62.  
  63. if __name__ == '__main__':
  64.     # Set constants
  65.     magic_value = 0xd9b4bef9
  66.     tx_id = "fc57704eff327aecfadb2cf3774edc919ba69aba624b836461ce2be9c00a0c20"
  67.     peer_ip_address = '104.199.184.15'
  68.     peer_tcp_port = 8333
  69.     buffer_size = 1024
  70.  
  71.     # Create Request Objects
  72.     version_payload = create_payload_version(peer_ip_address)
  73.     version_message = create_message(magic_value, 'version', version_payload)
  74.     verack_message = create_message_verack()
  75.     getdata_payload = create_payload_getdata(tx_id)
  76.     getdata_message = create_message(magic_value, 'getdata', getdata_payload)
  77.  
  78.     # Establish TCP Connection
  79.     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  80.     s.connect((peer_ip_address, peer_tcp_port))
  81.  
  82.     # Send message "version"
  83.     s.send(version_message)
  84.     response_data = s.recv(buffer_size)
  85.     print_response("version", version_message, response_data)
  86.  
  87.     # Send message "verack"
  88.     s.send(verack_message)
  89.     response_data = s.recv(buffer_size)
  90.     print_response("verack", verack_message, response_data)
  91.  
  92.     # Send message "getdata"
  93.     s.send(getdata_message)
  94.     response_data = s.recv(buffer_size)
  95.     print_response("getdata", getdata_message, response_data)
  96.  
  97.     # Close the TCP connection
  98.     s.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement