Log errors that occur when sending a udp packet
This commit is contained in:
29
node.py
29
node.py
@@ -23,6 +23,11 @@ class Node:
|
|||||||
self.peers = peers
|
self.peers = peers
|
||||||
self.incoming_heartbeats = []
|
self.incoming_heartbeats = []
|
||||||
self.partners = []
|
self.partners = []
|
||||||
|
def send(self, msg, address):
|
||||||
|
try:
|
||||||
|
self.node_socket.sendto(msg, address)
|
||||||
|
except Exception as e:
|
||||||
|
log(f"Failed to send a message to {address[0]} - {e}")
|
||||||
def add_heartbeat(self, address):
|
def add_heartbeat(self, address):
|
||||||
with self.lock:
|
with self.lock:
|
||||||
self.incoming_heartbeats.append(address)
|
self.incoming_heartbeats.append(address)
|
||||||
@@ -98,7 +103,7 @@ def send_heartbeat(node, peer, b):
|
|||||||
|
|
||||||
heartbeat_msg = protocol_version + capable_version + msg_type + \
|
heartbeat_msg = protocol_version + capable_version + msg_type + \
|
||||||
difficulty_sum + hash_value + partner_ipv6 + partner_port
|
difficulty_sum + hash_value + partner_ipv6 + partner_port
|
||||||
node.node_socket.sendto(heartbeat_msg, (peer.ipv6, peer.port))
|
node.send(heartbeat_msg, (peer.ipv6, peer.port))
|
||||||
|
|
||||||
def define_partnership(peers):
|
def define_partnership(peers):
|
||||||
for peer in peers:
|
for peer in peers:
|
||||||
@@ -171,7 +176,7 @@ class NoReponseException(Exception):
|
|||||||
|
|
||||||
def request_retry(node, addr, request, subscription, condition):
|
def request_retry(node, addr, request, subscription, condition):
|
||||||
for _ in range(10):
|
for _ in range(10):
|
||||||
node.node_socket.sendto(request, addr)
|
node.send(request, addr)
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
response = subscription.receive(1)
|
response = subscription.receive(1)
|
||||||
@@ -227,7 +232,7 @@ def get_associated_data(node, receive_observer, b, addr, associated_data_hash):
|
|||||||
if fragment is None:
|
if fragment is None:
|
||||||
request_bitfield |= (1 << i)
|
request_bitfield |= (1 << i)
|
||||||
request = b"\0\0\0\0\x0f" + bytes([request_bitfield]) + associated_data_hash
|
request = b"\0\0\0\0\x0f" + bytes([request_bitfield]) + associated_data_hash
|
||||||
node.node_socket.sendto(request, addr)
|
node.send(request, addr)
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
response = subscription.receive(1)
|
response = subscription.receive(1)
|
||||||
@@ -327,7 +332,7 @@ def receiver(node, b):
|
|||||||
continue
|
continue
|
||||||
block_raw = block_to_send.get_block_raw()
|
block_raw = block_to_send.get_block_raw()
|
||||||
response_msg = b"\0\0\0\0\x02" + block_raw
|
response_msg = b"\0\0\0\0\x02" + block_raw
|
||||||
node.node_socket.sendto(response_msg, addr)
|
node.send(response_msg, addr)
|
||||||
elif msg_type == 2:
|
elif msg_type == 2:
|
||||||
# block transfer
|
# block transfer
|
||||||
if msg_len != 298:
|
if msg_len != 298:
|
||||||
@@ -361,7 +366,7 @@ def receiver(node, b):
|
|||||||
continue
|
continue
|
||||||
list_hash = b.open_transactions.get_hash(list_position)
|
list_hash = b.open_transactions.get_hash(list_position)
|
||||||
response = b"\0\0\0\0\x04" + list_position.to_bytes(2, "big") + list_hash
|
response = b"\0\0\0\0\x04" + list_position.to_bytes(2, "big") + list_hash
|
||||||
node.node_socket.sendto(response, addr)
|
node.send(response, addr)
|
||||||
elif msg_type == 4:
|
elif msg_type == 4:
|
||||||
# open transaction list hash response
|
# open transaction list hash response
|
||||||
if msg_len != 39:
|
if msg_len != 39:
|
||||||
@@ -388,7 +393,7 @@ def receiver(node, b):
|
|||||||
else:
|
else:
|
||||||
transaction_raw = transaction.get_transaction_raw()
|
transaction_raw = transaction.get_transaction_raw()
|
||||||
response = b"\0\0\0\0\x06" + list_position.to_bytes(2, "big") + transaction_raw
|
response = b"\0\0\0\0\x06" + list_position.to_bytes(2, "big") + transaction_raw
|
||||||
node.node_socket.sendto(response, addr)
|
node.send(response, addr)
|
||||||
elif msg_type == 6:
|
elif msg_type == 6:
|
||||||
# open transaction response
|
# open transaction response
|
||||||
if msg_len != 156:
|
if msg_len != 156:
|
||||||
@@ -433,7 +438,7 @@ def receiver(node, b):
|
|||||||
timestamp_raw + \
|
timestamp_raw + \
|
||||||
difficulty_sum.to_bytes(32, "big") + \
|
difficulty_sum.to_bytes(32, "big") + \
|
||||||
threshold.to_bytes(32, "big")
|
threshold.to_bytes(32, "big")
|
||||||
node.node_socket.sendto(response, addr)
|
node.send(response, addr)
|
||||||
elif msg_type == 9:
|
elif msg_type == 9:
|
||||||
# transaction request
|
# transaction request
|
||||||
if msg_len != 154:
|
if msg_len != 154:
|
||||||
@@ -451,7 +456,7 @@ def receiver(node, b):
|
|||||||
return
|
return
|
||||||
b.cache_associated_data(parsed_transaction)
|
b.cache_associated_data(parsed_transaction)
|
||||||
b.open_transactions.add(parsed_transaction)
|
b.open_transactions.add(parsed_transaction)
|
||||||
node.node_socket.sendto(b"\0\0\0\0\x0a", addr)
|
node.send(b"\0\0\0\0\x0a", addr)
|
||||||
# Handle this in a thread because asynchronous back-requests might be required
|
# Handle this in a thread because asynchronous back-requests might be required
|
||||||
threading.Thread(target=handle_transaction_request, args=(msg, addr)).start()
|
threading.Thread(target=handle_transaction_request, args=(msg, addr)).start()
|
||||||
elif msg_type == 11:
|
elif msg_type == 11:
|
||||||
@@ -463,7 +468,7 @@ def receiver(node, b):
|
|||||||
latest_block = b.get_latest_block()
|
latest_block = b.get_latest_block()
|
||||||
if latest_block is not None and len(latest_block.pending_commitment_blocks) > 0:
|
if latest_block is not None and len(latest_block.pending_commitment_blocks) > 0:
|
||||||
next_reveal_hash = latest_block.pending_commitment_blocks[0][0]
|
next_reveal_hash = latest_block.pending_commitment_blocks[0][0]
|
||||||
node.node_socket.sendto(b"\0\0\0\0\x0c" + next_reveal_hash, addr)
|
node.send(b"\0\0\0\0\x0c" + next_reveal_hash, addr)
|
||||||
elif msg_type == 13:
|
elif msg_type == 13:
|
||||||
# Ping
|
# Ping
|
||||||
if msg_len != 28:
|
if msg_len != 28:
|
||||||
@@ -473,7 +478,7 @@ def receiver(node, b):
|
|||||||
# Wrong Ping question, ignore
|
# Wrong Ping question, ignore
|
||||||
continue
|
continue
|
||||||
nonce = msg[20:28]
|
nonce = msg[20:28]
|
||||||
node.node_socket.sendto(b"\0\0\0\0\x0e" + "I m carrotcoin!".encode() + nonce, addr)
|
node.send(b"\0\0\0\0\x0e" + "I m carrotcoin!".encode() + nonce, addr)
|
||||||
elif msg_type == 14:
|
elif msg_type == 14:
|
||||||
# Pong
|
# Pong
|
||||||
if msg_len != 28:
|
if msg_len != 28:
|
||||||
@@ -501,7 +506,7 @@ def receiver(node, b):
|
|||||||
subscription = receive_observer.listen((addr[0:2], "pong"))
|
subscription = receive_observer.listen((addr[0:2], "pong"))
|
||||||
nonce = secrets.randbits(64).to_bytes(8, "big")
|
nonce = secrets.randbits(64).to_bytes(8, "big")
|
||||||
ping = b"\0\0\0\0\x0dR u carrotcoin?" + nonce
|
ping = b"\0\0\0\0\x0dR u carrotcoin?" + nonce
|
||||||
node.node_socket.sendto(ping, addr[0:2])
|
node.send(ping, addr[0:2])
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
pong_nonce = subscription.receive(5)
|
pong_nonce = subscription.receive(5)
|
||||||
@@ -517,7 +522,7 @@ def receiver(node, b):
|
|||||||
bytes([part_number]) + \
|
bytes([part_number]) + \
|
||||||
associated_proof_hash + \
|
associated_proof_hash + \
|
||||||
proof[part_number*896:(part_number+1)*896]
|
proof[part_number*896:(part_number+1)*896]
|
||||||
node.node_socket.sendto(revealing_proof_response, addr[0:2])
|
node.send(revealing_proof_response, addr[0:2])
|
||||||
# Start a thread because of the asynchronous ping
|
# Start a thread because of the asynchronous ping
|
||||||
threading.Thread(target=handle_associated_relvealing_proof_request, args=(addr, parts_bitfield, associated_proof_hash, proof)).start()
|
threading.Thread(target=handle_associated_relvealing_proof_request, args=(addr, parts_bitfield, associated_proof_hash, proof)).start()
|
||||||
elif msg_type == 16:
|
elif msg_type == 16:
|
||||||
|
|||||||
Reference in New Issue
Block a user