-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathdaily_totals.py
142 lines (122 loc) · 4.43 KB
/
daily_totals.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
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
import csv
import time
from datetime import datetime, timedelta
import psycopg2, psycopg2.extras
from web3 import Web3
WEI_PER_ETH = int(1e18)
connection = psycopg2.connect(
host="127.0.0.1",
port=5433,
user="postgres",
password="password",
database="mev_inspect"
)
connection.autocommit = True
cursor = connection.cursor()
w3 = Web3(Web3.HTTPProvider("http://192.168.0.51:8545/"))
cursor.execute(
"SELECT MIN(block_number), MAX(block_number) FROM miner_payments"
)
first_blocknum, last_blocknum = [int(b) for b in cursor.fetchone()]
num_blocks = last_blocknum - first_blocknum + 1
first_timestamp = w3.eth.getBlock(first_blocknum)['timestamp']
last_timestamp = w3.eth.getBlock(last_blocknum)['timestamp']
first_date = datetime.utcfromtimestamp(first_timestamp).date()
last_date = datetime.utcfromtimestamp(last_timestamp).date()
num_days = (last_date - first_date).days + 1
def get_history_dict(num_days):
return {
'block_count': [0] * num_days,
'fee_revenue': [0] * num_days,
'transfer_revenue': [0] * num_days,
'basefee_cost': [0] * num_days,
'self_fees': [0] * num_days,
'self_transfers': [0] * num_days
}
history = {}
start_time = time.time()
last_update = 0
for block_number in range(first_blocknum, last_blocknum+1):
cursor.execute(
f"SELECT coinbase_transfer, base_fee_per_gas, gas_price, gas_used, "
f"miner_group, payer_group "
f"FROM miner_payments WHERE block_number = {block_number}"
)
result = cursor.fetchall()
if len(result) == 0:
continue
ts = w3.eth.getBlock(block_number)['timestamp']
day = (datetime.utcfromtimestamp(ts).date() - first_date).days
for coinbase, basefee, gasprice, gasused, miner, payer in result:
if miner not in history:
history[miner] = get_history_dict(num_days)
history[miner]['block_count'][day] += 1
history[miner]['basefee_cost'][day] += int(basefee * gasused)
if miner == payer:
history[miner]['self_fees'][day] += int(gasprice * gasused)
history[miner]['self_transfers'][day] += int(coinbase)
else:
history[miner]['fee_revenue'][day] += int(gasprice * gasused)
history[miner]['transfer_revenue'][day] += int(coinbase)
t = time.time()
if t - last_update > 0.1:
elapsed = timedelta(seconds = int(t - start_time))
perc = 100 * (block_number - first_blocknum + 1) / num_blocks
print(f"{elapsed} / {perc:.2f}% complete", end='\r')
last_update = t
print()
totals = get_history_dict(num_days)
for day in range(num_days):
for item in (
'block_count',
'basefee_cost',
'fee_revenue',
'transfer_revenue',
'self_fees',
'self_transfers'
):
totals[item][day] = sum(history[miner][item][day] for miner in history)
miner_order = sorted(
history.keys(), key=lambda k: sum(history[k]['block_count']), reverse=True
)
with open('daily_totals.csv', 'w') as f:
writer = csv.writer(f)
headers = [
'date',
'total_block_count',
'total_basefee_cost',
'total_fee_revenue',
'total_transfer_revenue',
'total_self_fees',
'total_self_transfers'
]
for miner in miner_order:
headers += [
'block_count_' + miner,
'basefee_cost_' + miner,
'fee_revenue_' + miner,
'transfer_revenue_' + miner,
'self_fees_' + miner,
'self_tranfers_' + miner
]
writer.writerow(headers)
for day in range(num_days):
row = [
str(first_date + timedelta(days=day)),
totals['block_count'][day],
totals['basefee_cost'][day] / WEI_PER_ETH,
totals['fee_revenue'][day] / WEI_PER_ETH,
totals['transfer_revenue'][day] / WEI_PER_ETH,
totals['self_fees'][day] / WEI_PER_ETH,
totals['self_transfers'][day] / WEI_PER_ETH
]
for miner in miner_order:
row += [
history[miner]['block_count'][day],
history[miner]['basefee_cost'][day] / WEI_PER_ETH,
history[miner]['fee_revenue'][day] / WEI_PER_ETH,
history[miner]['transfer_revenue'][day] / WEI_PER_ETH,
history[miner]['self_fees'][day] / WEI_PER_ETH,
history[miner]['self_transfers'][day] / WEI_PER_ETH,
]
writer.writerow(row)