File size: 4,520 Bytes
7c740b1
 
 
 
 
 
 
3304383
7c740b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3304383
7c740b1
 
 
3304383
 
7c740b1
3304383
 
 
 
 
 
 
7c740b1
3304383
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7c740b1
 
 
 
 
 
3304383
 
 
7c740b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import pandas as pd
import streamlit as st
from meta_utils import run_subprocess, load_metagraphs
# from opendashboards.assets import io, inspect, metric, plot
from meta_plotting import plot_trace, plot_cabals
import asyncio
from functools import lru_cache

## TODO: Read blocks from a big parquet file instead of loading all the pickles -- this is slow

def get_or_create_eventloop():
    try:
        return asyncio.get_event_loop()
    except RuntimeError as ex:
        if "There is no current event loop in thread" in str(ex):
            loop = asyncio.new_event_loop()
            asyncio.set_event_loop(loop)
            return asyncio.get_event_loop()

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
import bittensor

datadir='data/metagraph/1/'
blockfiles = sorted(int(filename.split('.')[0]) for filename in os.listdir(datadir))
DEFAULT_SRC = 'miner'
DEFAULT_BLOCK_START = blockfiles[0]
DEFAULT_BLOCK_END = blockfiles[-1]
DEFAULT_BLOCK_STEP = 1000
DEFAULT_NTOP = 10
DEFAULT_UID_NTOP = 10

# Set app config
st.set_page_config(
    page_title='Validator Dashboard',
    menu_items={
        'Report a bug': "https://github.com/opentensor/dashboards/issues",
        'About': """
        This dashboard is part of the OpenTensor project. \n
        """
    },
    layout = "centered"
    )

st.title('Metagraph :red[Analysis] Dashboard :eyes:')
# add vertical space
st.markdown('#')
st.markdown('#')

netuid = 1
subtensor = bittensor.subtensor(network='finney')
current_block = subtensor.get_current_block()

@lru_cache(maxsize=1)
def _metagraph(block):
    
    print('rerunning cache')
    return ( 
            subtensor.metagraph(netuid, block=block), 
            subtensor.metagraph(netuid, block=block - 7200),
            subtensor.burn(netuid=netuid, block=block),
            subtensor.burn(netuid=netuid, block=block - 7200),
    )
    
current_metagraph, yesterday_metagraph, current_burn, yesterday_burn = _metagraph(10*current_block//10)

current_vcount = current_metagraph.validator_permit.sum().item()
current_mcount = (~current_metagraph.validator_permit).sum().item()
yesterday_vcount = yesterday_metagraph.validator_permit.sum().item()
yesterday_mcount = (~yesterday_metagraph.validator_permit).sum().item()

mcol1, mcol2, mcol3, mcol4 = st.columns(4)
mcol1.metric('Block', current_block, delta='+7200 [24hr]')
mcol2.metric('Register Cost', f'{current_burn.unit}{current_burn.tao:.3f}', delta=f'{current_burn.tao-yesterday_burn.tao:.3f}')
mcol3.metric('Validators', current_vcount, delta=current_vcount-yesterday_vcount)
mcol4.metric('Miners', current_mcount, delta=current_mcount-yesterday_mcount)


st.markdown('#')    
st.markdown('#')    

bcol1, bcol2, bcol3 = st.columns([0.6, 0.1, 0.2])    
block_start, block_end = bcol1.select_slider(
    'Select a **block range**',
    options=blockfiles,
    value=(DEFAULT_BLOCK_START, DEFAULT_BLOCK_END),
    format_func=lambda x: f'{x:,}'
)

with bcol3:
    st.markdown('#')    
    st.button('Refresh', on_click=run_subprocess)


with st.spinner(text=f'Loading data...'):
    # df = load_metagraphs(block_start=block_start, block_end=block_end, block_step=DEFAULT_BLOCK_STEP)
    df = pd.read_parquet('blocks_600100_807300_100')

blocks = df.block.unique()

df_sel = df.loc[df.block.between(block_start, block_end)]


# add vertical space
st.markdown('#')
st.markdown('#')

tab1, tab2, tab3, tab4 = st.tabs(["Overview", "Miners", "Validators", "Block"])

miner_choices = ['total_stake','ranks','incentive','emission','consensus','trust','validator_trust','dividends']
cabal_choices = ['hotkey','ip','coldkey']

### Overview  ###
with tab1:
    
    x_col = st.radio('X-axis', ['block','timestamp'], index=0, horizontal=True)
    
    acol1, acol2 = st.columns([0.3, 0.7])
    sel_ntop = acol1.slider('Number:', min_value=1, max_value=50, value=10, key='sel_ntop')    
    #horizontal list
    miner_choice = acol2.radio('Select:', miner_choices, horizontal=True, index=0)
    st.plotly_chart(
        plot_trace(df_sel, time_col=x_col,col=miner_choice, ntop=sel_ntop),
        use_container_width=True
    )

    col1, col2 = st.columns(2)
    count_col = col1.radio('Count', cabal_choices, index=0, horizontal=True)
    y_col = col2.radio('Agg on', cabal_choices, index=2, horizontal=True)

    st.plotly_chart(
        plot_cabals(df_sel, time_col=x_col, count_col=count_col, sel_col=y_col, ntop=sel_ntop), 
        use_container_width=True
    )

with tab2:
    
    # plot of miner weights versus time/block
    pass