57 lines
1.8 KiB
Python
Executable File
57 lines
1.8 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
|
|
import base64, socket, sys
|
|
|
|
def get_transaction(s, i):
|
|
request = b"\0\0\0\0\x05" + i.to_bytes(2, "big")
|
|
for _ in range(10):
|
|
s.sendto(request, ("::1", 62039))
|
|
try:
|
|
while True:
|
|
msg, sender = s.recvfrom(4096)
|
|
if sender[0:2] == ("::1", 62039) and len(msg) == 156 and msg[0:5] == b"\0\0\0\0\x06" and msg[5:7] == i.to_bytes(2, "big"):
|
|
return msg[7:156]
|
|
except TimeoutError:
|
|
pass
|
|
return None
|
|
|
|
def format_addr(raw_addr):
|
|
return base64.b64encode(raw_addr).decode()
|
|
|
|
def format_amount(raw_amount):
|
|
int_amount = int.from_bytes(raw_amount, "big")
|
|
coins = int_amount // 100
|
|
cents = int_amount % 100
|
|
return f"{coins},{cents:02} cc"
|
|
|
|
def main():
|
|
s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
|
|
s.settimeout(1)
|
|
for i in range(1024):
|
|
transaction = get_transaction(s, i)
|
|
if transaction is None:
|
|
print("- no response from local node -", file=sys.stderr)
|
|
exit(1)
|
|
if transaction == 149 * b"\0":
|
|
return
|
|
if transaction[0] == 1:
|
|
sender = format_addr(transaction[5:37])
|
|
receiver = format_addr(transaction[37:69])
|
|
amount = format_amount(transaction[69:77])
|
|
fee = format_amount(transaction[77:85])
|
|
elif transaction[0] == 2:
|
|
sender = format_addr(transaction[5:37])
|
|
receiver = "(gambling)" + 33 * " "
|
|
amount = format_amount(transaction[37:45])
|
|
fee = format_amount(transaction[45:53])
|
|
elif transaction[0] == 3:
|
|
print("- reveal transaction -")
|
|
sender = None
|
|
else:
|
|
sender = None
|
|
if sender is not None:
|
|
print(f"{sender} {receiver} {amount:>13} {fee:>10}")
|
|
|
|
if __name__ == '__main__':
|
|
main()
|