-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathpeering.py
More file actions
91 lines (73 loc) · 3.14 KB
/
peering.py
File metadata and controls
91 lines (73 loc) · 3.14 KB
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
import requests
from itertools import combinations
class NodePeering:
def __init__(self, node_urls, geth_urls):
self.node_urls = node_urls
self.geth_urls = geth_urls
def _json_rpc_request(self, url, method, params=None):
payload = {
"jsonrpc": "2.0",
"id": 1,
"method": method,
"params": params or []
}
response = requests.post(url, json=payload)
response.raise_for_status()
return response.json().get('result')
def node_opp2p_self(self, op_node_url):
return self._json_rpc_request(op_node_url, 'opp2p_self')
def node_opp2p_connect_peer(self, op_node_url, multiaddr):
return self._json_rpc_request(op_node_url, 'opp2p_connectPeer', [multiaddr])
def geth_node_info(self, geth_node_url):
return self._json_rpc_request(geth_node_url, 'admin_nodeInfo')
def geth_add_peer(self, geth_node_url, enode):
return self._json_rpc_request(geth_node_url, 'admin_addPeer', [enode])
def p2p_setup(self):
print("Starting P2P setup...")
multi_addresses = {}
for url in self.node_urls:
self_info = self.node_opp2p_self(url)
node_addresses = self_info.get('addresses', [])
multi_addresses[url] = node_addresses
print(f"Node at {url} has addresses: {node_addresses}")
for (url1, addrs1), (url2, addrs2) in combinations(multi_addresses.items(), 2):
if addrs1:
print(f"Connecting Node at {url2} to Node at {url1} ({addrs1[0]})")
self.node_opp2p_connect_peer(url2, addrs1[0])
else:
print(f"Could not get multiaddress for Node at {url1}.")
if addrs2:
print(f"Connecting Node at {url1} to Node at {url2} ({addrs2[0]})")
self.node_opp2p_connect_peer(url1, addrs2[0])
else:
print(f"Could not get multiaddress for Node at {url2}.")
enodes = {}
for url in self.geth_urls:
node_info = self.geth_node_info(url)
enode = node_info.get('enode')
enodes[url] = enode
print(f"Geth Node at {url} has enode: {enode}")
for (url1, enode1), (url2, enode2) in combinations(enodes.items(), 2):
if enode1:
print(f"Adding Geth Node at {url1} to Node at {url2}")
self.geth_add_peer(url2, enode1)
else:
print(f"Could not get enode for Geth Node at {url1}.")
if enode2:
print(f"Adding Geth Node at {url2} to Node at {url1}")
self.geth_add_peer(url1, enode2)
else:
print(f"Could not get enode for Geth Node at {url2}.")
if __name__ == "__main__":
node_urls = [
"http://0.0.0.0:9545", # main node
# "http://0.0.0.0:19545", # main node 2
"http://0.0.0.0:8547" # follower node
]
geth_urls = [
"http://0.0.0.0:8545", # Geth node
# "http://0.0.0.0:9545", # Geth node 2
"http://0.0.0.0:8645" # Geth follower node
]
p2p = NodePeering(node_urls, geth_urls)
p2p.p2p_setup()