-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaether.py
executable file
·143 lines (113 loc) · 3.54 KB
/
aether.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/python3
# Simplicity and Readability is our concern.
import subprocess
import json
import time
import mongo
Peers = []
Logs = []
DB = "mongodb://localhost:27017/"
DB_NAME = "monate"
DB_NODES_COLLECTION = "nodes"
DB_PUBLIC_NODES_COLLECTION = "public_nodes"
DB_LOGS_COLLECTION = "logs"
DEFAULT_PEERS = ["127.0.0.1"]
RPC_ADMIN_PEERS = "admin_peers"
RPC_NET_VERSION = "net_version"
CONNECTION_TIMEOUT = 1 # seconds
UPDATE_CONNECTED_PEERS = 6 * 60
RUN_CODE_TIMES = 1 # code runs value * RUN_CODE_TIMES_MULTIPLY
RUN_CODE_TIMES_MULTIPLY = 10
def get_cmd(node_url, port, call):
return [
"curl",
"-s",
"--connect-timeout",
str(CONNECTION_TIMEOUT),
"-H",
"Content-Type: application/json",
"-X",
"POST",
"--data",
'{"jsonrpc":"2.0","method":"' + call + '","params":[],"id":67}',
node_url + ":" + port,
]
def node_call(url, port, call):
global Logs
cmd = get_cmd(url, port, call)
results = json.loads(subprocess.check_output(cmd).decode())
Logs.append(results)
return results # {"jsonrpc":"<int>","id":<int>, "results": [ {} ] }
def get_peers(node, port="8545"):
peers = node_call(node, port, RPC_ADMIN_PEERS)["result"]
return (
peers,
[peer["network"]["remoteAddress"].split(":")[0] for peer in peers],
) # [ip]
def check_rpc(peers=[], port="8545"):
public_nodes = []
for peer in peers:
cmd = get_cmd(peer, port, RPC_NET_VERSION)
try:
int(subprocess.check_output(cmd)["result"])
public_nodes.append(peer)
except:
pass
return public_nodes # [ip]
def has_rpc(peer, port="8545"):
cmd = get_cmd(peer, port, RPC_NET_VERSION)
try:
int(json.loads(subprocess.check_output(cmd))["result"])
return True
except:
return False
def store_peers(peers=[]): # write to db
pass
def read_peers(): # read db
pass
def get_public_peers(nodes):
peers = []
for node in nodes:
if has_rpc(node):
peers.append(node)
return peers
def add_peers(peers): # return new peers || IGNORE
new_peers = []
for peer in peers:
if peer not in Peers:
new_peers.append(peer)
return new_peers
def main():
global Peers
global Logs
monate = mongo.Monate(
DB, DB_NAME, DB_NODES_COLLECTION, DB_PUBLIC_NODES_COLLECTION, DB_LOGS_COLLECTION
)
connected_peers = DEFAULT_PEERS
time_start = time.time()
for x in range(RUN_CODE_TIMES):
print("===============================================")
print("Connected Peers:", connected_peers)
for i in range(RUN_CODE_TIMES_MULTIPLY):
print(f"[{(i+1)+(x*10)}] - Scanning..", end=".\r")
new_peers = []
for peer in connected_peers:
(_, tmp) = get_peers(peer)
new_peers += tmp
new_peers = list(dict.fromkeys(new_peers))
connected_peers = list(
dict.fromkeys(connected_peers + check_rpc(new_peers))
)
Peers += new_peers
time.sleep(0.5)
if time.time() >= time_start + (UPDATE_CONNECTED_PEERS):
connected_peers = check_rpc(connected_peers)
print()
print("New Peers:", Peers)
monate.insert_peers(list(map(lambda x: {"node": x}, Peers)))
monate.insert_logs(Logs)
monate.insert_public_peers(list(map(lambda x: {"": x}, connected_peers)))
Peers = []
Logs = []
if __name__ == "__main__":
main()