def handshake(address): # Create the socket sock = socket.socket() stream = sock.makefile('rb', None) # Initiate TCP connection sock.connect(address) # Send our "version" message payload = VersionMessage().serialize() envelope = NetworkEnvelope(command=b"version", payload=payload) sock.send(envelope.serialize()) # Receive peer's "version" message envelope = NetworkEnvelope.parse(stream) print(envelope.command) # Receive peer's "verack" message envelope = NetworkEnvelope.parse(stream) print(envelope.command) # Send our "verack" message envelope = NetworkEnvelope(command=b"verack", payload=b"") sock.send(envelope.serialize()) return sock, stream
def get_blocks(sock): index = len(data["blocks"]) items = [ InventoryItem(2, int_to_little_endian(hash_, 32)) for hash_ in data["headers"][index:index + 10] ] getdata = GetData(items=items) packet = NetworkEnvelope(getdata.command, getdata.serialize()) sock.send(packet.serialize())
async def receive(self): print("start receiving") while True: magic = await self.reader.read(4) if magic != NETWORK_MAGIC: raise RuntimeError('Network Magic not at beginning of stream') command = await self.reader.read(12) payload_length = little_endian_to_int(await self.reader.read(4)) checksum = await self.reader.read(4) payload = await self.reader.read(payload_length) # check the checksum if double_sha256(payload)[:4] != checksum: raise RuntimeError('Payload and Checksum do not match') await self.q.put(NetworkEnvelope(command, payload))
import socket from network import NetworkEnvelope, VersionMessage host = 'testnet.programmingbitcoin.com' port = 18333 socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) socket.connect((host, port)) stream = socket.makefile('rb', None) version = VersionMessage() envelope = NetworkEnvelope(version.command, version.serialize()) socket.sendall(envelope.serialize()) while True: new_message = NetworkEnvelope.parse(stream) print(new_message)
def send_getheaders(sock): locator = construct_block_locator() getheaders = GetHeaders(locator) msg = NetworkEnvelope(getheaders.command, getheaders.serialize()) sock.send(msg.serialize()) print("sent getheaders")
def handle_verack(self, packet): my_getaddr_packet = NetworkEnvelope(command=b"getaddr", payload=b"") self.socket.send(my_getaddr_packet.serialize())
def handle_version(self, packet): self.version_message = packet.payload # FIXME: payload should default to b"" my_verack_packet = NetworkEnvelope(command=b"verack", payload=b"") self.socket.send(my_verack_packet.serialize())