-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheth_prestate_interface.py
More file actions
66 lines (54 loc) · 2.43 KB
/
Copy patheth_prestate_interface.py
File metadata and controls
66 lines (54 loc) · 2.43 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
from typing import Dict, Set
from interfaces.interface import Interface
import os
class EthPerstateInterface(Interface):
def __init__(self):
rpc_url = os.getenv("ETH_RPC_URL")
super().__init__(True, rpc_url)
def fetch(self, block_number: int):
diffFalse = self._fetch_block_trace(block_number, "prestateTracer", {"diffMode": False})
diffTrue = self._fetch_block_trace(block_number, "prestateTracer", {"diffMode": True})
return block_number, diffFalse, diffTrue
def _fetch_block_trace(self, block_number: str, tracer_name: str, tracer_config={}) -> dict:
if tracer_name not in ["callTracer", "prestateTracer"]:
raise Exception(f"unknown tracer type {tracer_name}")
if tracer_config not in [{}, {"diffMode": True}, {"diffMode": False}]:
raise Exception(f"unknown tracer config {tracer_config}")
payload = {
"jsonrpc": "2.0",
"method": "debug_traceBlockByNumber",
"params": [
hex(block_number),
{
"tracer": tracer_name,
"tracerConfig": tracer_config
}
],
"id": 1
}
return self._post_with_retry(payload)
def get_conflict_graph(self, block_trace):
block_trace_diffFalse, block_trace_diffTrue = block_trace
writes: Dict[str, Set[str]] = {}
reads: Dict[str, Set[str]] = {}
for entry in block_trace_diffTrue:
tx = entry["result"]
tx_hash = entry["txHash"]
tx_writes = set(tx['pre'])
tx_writes.update(set(tx['post']))
if len(tx_writes) > 0:
writes[tx_hash] = tx_writes
for entry in block_trace_diffFalse:
tx = entry["result"]
tx_hash = entry["txHash"]
tx_reads = set(tx).difference(writes.get(tx_hash, set()))
if len(tx_reads) > 0:
reads[tx_hash] = set(tx).difference(writes.get(tx_hash, set()))
txs = [tx_trace["txHash"] for tx_trace in block_trace_diffFalse]
return self._create_conflict_graph_from_readset_writeset(txs, reads, writes)
def get_additional_metrics(self, block_number, block_trace) -> Dict[str, float]:
block_trace_diffFalse, _ = block_trace
return {
"block_number": block_number,
"txs": len(block_trace_diffFalse)
}