-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgetnetworkinfo.py
executable file
·84 lines (69 loc) · 2.68 KB
/
getnetworkinfo.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
#!/usr/bin/env python3
import json
from collections import defaultdict
from pyln.client import Plugin
from statistics import median
plugin = Plugin()
# A copy of lnd's getnetworkinfo rpc command
@plugin.method("getnetworkinfo")
def getnetworkinfo(plugin):
"""Get statistical information about the current state of the network.
"""
nodes = plugin.rpc.listnodes()['nodes']
channels = plugin.rpc.listchannels()['channels']
if not nodes or not channels:
return "No nodes or channels in view, please first connect to a peer"
# Graph stats
capacity = 0
channel_ids = set()
graph = defaultdict(list)
for c in channels:
graph[c['source']].append(c['destination'])
if c['short_channel_id'] not in channel_ids:
channel_ids.add(c['short_channel_id'])
capacity += c['satoshis']
num_nodes = len(nodes)
num_channels = len(channel_ids)
channel_sat = [c['satoshis'] for c in channels]
base_fee_msat = [c['base_fee_millisatoshi'] for c in channels]
fee_rate = [c['fee_per_millionth'] for c in channels]
total_capacity = capacity
min_channel_size = min(channel_sat)
max_channel_size = max(channel_sat)
med_channel_size = median(channel_sat)
avg_channel_size = total_capacity / num_channels
min_base_fee = min(base_fee_msat)
max_base_fee = max(base_fee_msat)
med_base_fee = median(base_fee_msat)
avg_base_fee = sum(base_fee_msat) / len(base_fee_msat)
min_fee_rate = min(fee_rate)
max_fee_rate = max(fee_rate)
med_fee_rate = median(fee_rate)
avg_fee_rate = sum(fee_rate) / len(fee_rate)
channels_per_node = [len(v) for k, v in graph.items()]
max_chan = max(channels_per_node)
med_chan = median(channels_per_node)
avg_chan = sum(channels_per_node) / len(channels_per_node)
data = {
'num_nodes': num_nodes,
'num_channels': num_channels,
'total_network_capacity_btc': total_capacity / 10**8.0,
'avg_channels_per_node': avg_chan,
'med_channels_per_node': med_chan,
'max_channels_per_node': max_chan,
'min_channel_size_sat': min_channel_size,
'max_channel_size_sat': max_channel_size,
'median_channel_size_sat': med_channel_size,
'avg_channel_size_sat': avg_channel_size,
'min_base_fee_msat': min_base_fee,
'max_base_fee_msat': max_base_fee,
'median_base_fee_msat': med_base_fee,
'avg_base_fee_msat': avg_base_fee,
'min_fee_rate_msat': min_fee_rate,
'max_fee_rate_msat': max_fee_rate,
'median_fee_rate_msat': med_fee_rate,
'avg_fee_rate_msat': avg_fee_rate
}
plugin.log(json.dumps(data, indent=4))
return data
plugin.run()