forked from luxfi/node
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauto_discovery_setup.sh
More file actions
239 lines (201 loc) · 7.26 KB
/
auto_discovery_setup.sh
File metadata and controls
239 lines (201 loc) · 7.26 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
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#!/bin/bash
set -e
echo "============================================"
echo " LUX AUTO-DISCOVERY NETWORK SETUP"
echo "============================================"
echo ""
echo "Setting up nodes with NATS-based auto-discovery"
echo ""
# Configuration
NATS_URL="nats://127.0.0.1:4222"
NETWORK_ID=96369
BASE_HTTP_PORT=9630
BASE_STAKING_PORT=9651
# Kill any existing processes
pkill -f luxd 2>/dev/null || true
pkill -f nats-server 2>/dev/null || true
sleep 1
# Check if NATS is installed
if ! command -v nats-server &> /dev/null; then
echo "Installing NATS server..."
curl -L https://github.com/nats-io/nats-server/releases/download/v2.10.12/nats-server-v2.10.12-linux-amd64.tar.gz -o /tmp/nats.tar.gz
tar -xzf /tmp/nats.tar.gz -C /tmp/
sudo cp /tmp/nats-server-v2.10.12-linux-amd64/nats-server /usr/local/bin/
fi
# Start NATS server for node discovery
echo "Starting NATS server for auto-discovery..."
nats-server -p 4222 > /tmp/nats.log 2>&1 &
NATS_PID=$!
echo "NATS PID: $NATS_PID"
sleep 2
# Create discovery wrapper script
cat > /tmp/luxd_with_discovery.sh << 'EOF'
#!/bin/bash
# Wrapper script to publish node info to NATS and discover peers
NODE_ID=$1
HTTP_PORT=$2
STAKING_PORT=$3
INSTANCE=$4
# Function to publish node info to NATS
publish_node_info() {
while true; do
# Get current node ID if not set
if [ -z "$NODE_ID" ] || [ "$NODE_ID" = "pending" ]; then
NODE_ID=$(curl -s http://127.0.0.1:$HTTP_PORT/ext/info -X POST \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"info.getNodeID","params":{}}' \
2>/dev/null | jq -r '.result.nodeID')
fi
if [ ! -z "$NODE_ID" ] && [ "$NODE_ID" != "null" ]; then
# Publish node info to NATS
echo "{\"nodeID\":\"$NODE_ID\",\"ip\":\"127.0.0.1\",\"stakingPort\":$STAKING_PORT,\"httpPort\":$HTTP_PORT}" | \
nats pub lux.nodes.announce --server=nats://127.0.0.1:4222 2>/dev/null || true
fi
sleep 5
done
}
# Function to discover peers from NATS
discover_peers() {
while true; do
sleep 10
# Subscribe to node announcements and update peer list
# This would normally integrate with luxd's peer management
echo "[$INSTANCE] Checking for peers on NATS..."
done
}
# Run discovery in background
publish_node_info &
discover_peers &
EOF
chmod +x /tmp/luxd_with_discovery.sh
# Start primary validator/bootstrapper node
echo ""
echo "Starting primary validator/bootstrapper (Node 1)..."
DB_DIR_1="/home/z/.node/db/auto-discovery-1"
rm -rf "$DB_DIR_1" && mkdir -p "$DB_DIR_1"
/home/z/work/lux/build/luxd \
--network-id=$NETWORK_ID \
--public-ip=127.0.0.1 \
--http-host=0.0.0.0 \
--http-port=$BASE_HTTP_PORT \
--staking-port=$BASE_STAKING_PORT \
--consensus-sample-size=1 \
--consensus-quorum-size=1 \
--chain-data-dir=/home/z/.luxd/chainData \
--db-dir="$DB_DIR_1" \
--skip-bootstrap \
--log-level=info > /tmp/auto-node1.log 2>&1 &
NODE1_PID=$!
echo "Node 1 PID: $NODE1_PID"
# Start discovery for node 1
/tmp/luxd_with_discovery.sh pending $BASE_HTTP_PORT $BASE_STAKING_PORT node1 &
DISCOVERY1_PID=$!
sleep 3
# Get Node 1 ID
NODE1_ID=$(curl -s http://127.0.0.1:$BASE_HTTP_PORT/ext/info -X POST \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"info.getNodeID","params":{}}' | jq -r '.result.nodeID')
echo "Node 1 ID: $NODE1_ID"
# Start additional nodes that auto-discover
echo ""
echo "Starting auto-discovering nodes..."
for i in 2 3; do
HTTP_PORT=$((BASE_HTTP_PORT + (i-1)*10))
STAKING_PORT=$((BASE_STAKING_PORT + (i-1)*10))
DB_DIR="/home/z/.node/db/auto-discovery-$i"
rm -rf "$DB_DIR" && mkdir -p "$DB_DIR"
echo ""
echo "Starting Node $i..."
echo " HTTP: $HTTP_PORT, Staking: $STAKING_PORT"
# Start with connection to first node, but could discover more via NATS
/home/z/work/lux/build/luxd \
--network-id=$NETWORK_ID \
--public-ip=127.0.0.1 \
--http-host=0.0.0.0 \
--http-port=$HTTP_PORT \
--staking-port=$STAKING_PORT \
--bootstrap-ips=127.0.0.1:$BASE_STAKING_PORT \
--bootstrap-ids=$NODE1_ID \
--consensus-sample-size=1 \
--consensus-quorum-size=1 \
--chain-data-dir=/home/z/.luxd/chainData \
--db-dir="$DB_DIR" \
--skip-bootstrap \
--log-level=info > /tmp/auto-node$i.log 2>&1 &
eval NODE${i}_PID=$!
echo "Node $i PID: $(eval echo \$NODE${i}_PID)"
# Start discovery for this node
/tmp/luxd_with_discovery.sh pending $HTTP_PORT $STAKING_PORT node$i &
eval DISCOVERY${i}_PID=$!
done
# Wait for nodes to initialize
sleep 5
echo ""
echo "================================"
echo " AUTO-DISCOVERY NETWORK STATUS"
echo "================================"
# Check all nodes
for i in 1 2 3; do
HTTP_PORT=$((BASE_HTTP_PORT + (i-1)*10))
echo ""
echo "Node $i (http://127.0.0.1:$HTTP_PORT):"
# Get node ID
NODE_ID=$(curl -s http://127.0.0.1:$HTTP_PORT/ext/info -X POST \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"info.getNodeID","params":{}}' 2>/dev/null | jq -r '.result.nodeID')
# Check bootstrap status
BOOTSTRAP=$(curl -s -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"info.isBootstrapped","params":{"chain":"C"}}' \
http://127.0.0.1:$HTTP_PORT/ext/info 2>/dev/null | jq -r '.result.isBootstrapped')
# Get peer count
PEERS=$(curl -s -X POST --data '{
"jsonrpc":"2.0",
"id":1,
"method":"info.peers"
}' -H 'content-type:application/json;' http://127.0.0.1:$HTTP_PORT/ext/info 2>/dev/null | jq '.result.numPeers' || echo "0")
echo " ID: $NODE_ID"
echo " Bootstrapped: $BOOTSTRAP"
echo " Peers: $PEERS"
done
# Show NATS topics for monitoring
echo ""
echo "================================"
echo " NATS AUTO-DISCOVERY"
echo "================================"
echo "NATS server running on: nats://127.0.0.1:4222"
echo ""
echo "Monitor node announcements:"
echo " nats sub lux.nodes.announce --server=nats://127.0.0.1:4222"
echo ""
echo "Publish custom node info:"
echo " echo '{\"nodeID\":\"...\",\"ip\":\"...\",\"stakingPort\":...}' | nats pub lux.nodes.announce"
echo ""
echo "================================"
echo " NETWORK READY"
echo "================================"
echo "✓ 3 nodes running with auto-discovery capability"
echo "✓ NATS server providing discovery service"
echo "✓ Nodes publishing their info every 5 seconds"
echo "✓ Ready for additional nodes to join"
echo ""
echo "Add more nodes by running:"
echo " ./build/luxd --network-id=$NETWORK_ID --bootstrap-ips=<any-node-ip>:<staking-port>"
echo ""
echo "PIDs:"
echo " NATS: $NATS_PID"
echo " Node1: $NODE1_PID (discovery: $DISCOVERY1_PID)"
echo " Node2: $NODE2_PID (discovery: $DISCOVERY2_PID)"
echo " Node3: $NODE3_PID (discovery: $DISCOVERY3_PID)"
echo ""
echo "Press Ctrl+C to stop all services"
# Cleanup function
cleanup() {
echo ""
echo "Stopping all services..."
kill $NODE1_PID $NODE2_PID $NODE3_PID 2>/dev/null || true
kill $DISCOVERY1_PID $DISCOVERY2_PID $DISCOVERY3_PID 2>/dev/null || true
kill $NATS_PID 2>/dev/null || true
exit
}
trap cleanup INT
wait