-
Notifications
You must be signed in to change notification settings - Fork 118
/
Copy pathclient_states.py
executable file
·70 lines (49 loc) · 2.45 KB
/
client_states.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
#!/usr/bin/env python
from http import client
import sys
import json
import subprocess
from dateutil.parser import parse
page = 1
clients = []
while True:
output = subprocess.check_output(['sifnoded', 'q', 'ibc', 'client', 'states', '--output', 'json', '--node', sys.argv[1], '--page', str(page)])
data = json.loads(output.decode('utf-8'))
clients.extend(data['client_states'])
if not data['pagination']['next_key']:
break
page += 1
# get the block time
output = subprocess.check_output(["sifnoded", "q", "ibc", "connection", "connections", "--output", "json", "--node", sys.argv[1]])
connection = json.loads(output.decode('utf-8'))
current_block_number = connection['height']['revision_height']
output = subprocess.check_output(["sifnoded", "q", "block", current_block_number, "--node", sys.argv[1]])
current_block = json.loads(output.decode('utf-8'))
current_block_time = parse(current_block['block']['header']['time'])
print(f"Current block time {str(current_block_time)} and number {current_block_number}")
print("")
for client_data in clients:
print(client_data['client_id'])
client_id = client_data['client_id']
revision_height = client_data['client_state']['latest_height']['revision_height']
revision_number = client_data['client_state']['latest_height']['revision_number']
trusting_period = client_data['client_state']['trusting_period']
# now get the time from the block at the revision height
# and compare to the time at the current block
print("client_id: " + client_id)
print("chain_id: " + client_data['client_state']['chain_id'])
print("revison: " + revision_number)
print("revison height: " + revision_height)
print('trusting period: ' + trusting_period)
output = subprocess.check_output(['sifnoded', 'q', 'ibc', 'client', 'consensus-state', client_id, f'{revision_number}-{revision_height}', '--node', sys.argv[1], '--output', 'json'])
block = json.loads(output.decode('utf-8'))
block_time = parse(block['consensus_state']['timestamp'])
print("RPC endpoint block time: " + str(current_block_time))
print("consensus block time: " + str(block_time))
difference = (current_block_time - block_time).total_seconds()
trust_period_int = int("".join(filter(str.isdigit, trusting_period)))
if difference > int(trust_period_int):
print(f"ERROR: Trusting period {trust_period_int} exceeded at {difference} seconds")
else:
print(f"{client_id} within trusting period {trust_period_int} with {difference}")
print("")