Fetch all of the block from the DB if possible

This commit is contained in:
Luke Van Seters 2021-10-18 11:33:14 -04:00
parent a786b74f4a
commit 68232f4161
4 changed files with 76 additions and 32 deletions

2
cli.py
View File

@ -43,7 +43,6 @@ def inspect_block_command(block_number: int, rpc: str, cache: bool):
w3,
trace_classifier,
block_number,
should_cache=cache,
trace_db_session=trace_db_session,
)
@ -83,7 +82,6 @@ def inspect_many_blocks_command(
trace_classifier,
block_number,
should_write_classified_traces=False,
should_cache=cache,
trace_db_session=trace_db_session,
)

View File

@ -64,7 +64,6 @@ def run():
trace_classifier,
block_number,
should_write_classified_traces=False,
should_cache=False,
trace_db_session=trace_db_session,
)
update_latest_block(inspect_db_session, block_number)

View File

@ -20,42 +20,26 @@ def create_from_block_number(
base_provider,
w3: Web3,
block_number: int,
should_cache: bool,
trace_db_session: Optional[orm.Session],
) -> Block:
if not should_cache:
return fetch_block(w3, base_provider, block_number, trace_db_session)
block: Optional[Block] = None
cache_path = _get_cache_path(block_number)
if trace_db_session is not None:
block = _find_block(trace_db_session, block_number)
if cache_path.is_file():
print(f"Cache for block {block_number} exists, " "loading data from cache")
return Block.parse_file(cache_path)
if block is None:
return _fetch_block(w3, base_provider, block_number)
else:
print(f"Cache for block {block_number} did not exist, getting data")
block = fetch_block(w3, base_provider, block_number, trace_db_session)
cache_block(cache_path, block)
return block
def fetch_block(
def _fetch_block(
w3,
base_provider,
block_number: int,
trace_db_session: Optional[orm.Session],
) -> Block:
block_json = w3.eth.get_block(block_number)
receipts_json = base_provider.make_request("eth_getBlockReceipts", [block_number])
traces_json: Optional[List[dict]] = None
if trace_db_session is not None:
traces_json = find_traces(trace_db_session, block_number)
if traces_json is None:
traces_json = w3.parity.trace_block(block_number)
receipts: List[Receipt] = [
@ -73,10 +57,35 @@ def fetch_block(
)
def find_traces(
def _find_block(
trace_db_session: orm.Session,
block_number: int,
) -> Optional[List[dict]]:
) -> Optional[Block]:
traces = _find_traces(trace_db_session, block_number)
receipts = _find_receipts(trace_db_session, block_number)
base_fee_per_gas = _find_base_fee(trace_db_session, block_number)
if traces is None or receipts is None or base_fee_per_gas is None:
return None
miner_address = _get_miner_address_from_traces(traces)
if miner_address is None:
return None
return Block(
block_number=block_number,
miner=miner_address,
base_fee_per_gas=base_fee_per_gas,
traces=traces,
receipts=receipts,
)
def _find_traces(
trace_db_session: orm.Session,
block_number: int,
) -> Optional[List[Trace]]:
result = trace_db_session.execute(
"SELECT raw_traces FROM block_traces WHERE block_number = :block_number",
params={"block_number": block_number},
@ -85,8 +94,48 @@ def find_traces(
if result is None:
return None
else:
(raw_traces,) = result
return raw_traces
(traces_json,) = result
return [Trace(**trace_json) for trace_json in traces_json]
def _find_receipts(
trace_db_session: orm.Session,
block_number: int,
) -> Optional[List[Receipt]]:
result = trace_db_session.execute(
"SELECT raw_receipts FROM block_receipts WHERE block_number = :block_number",
params={"block_number": block_number},
).one_or_none()
if result is None:
return None
else:
(receipts_json,) = result
return [Receipt(**receipt) for receipt in receipts_json]
def _find_base_fee(
trace_db_session: orm.Session,
block_number: int,
) -> Optional[int]:
result = trace_db_session.execute(
"SELECT base_fee_in_wei FROM base_fee WHERE block_number = :block_number",
params={"block_number": block_number},
).one_or_none()
if result is None:
return None
else:
(base_fee,) = result
return base_fee
def _get_miner_address_from_traces(traces: List[Trace]) -> Optional[str]:
for trace in traces:
if trace.type == TraceType.reward:
return trace.action["author"]
return None
def get_transaction_hashes(calls: List[Trace]) -> List[str]:

View File

@ -41,7 +41,6 @@ def inspect_block(
w3: Web3,
trace_clasifier: TraceClassifier,
block_number: int,
should_cache: bool,
trace_db_session: Optional[orm.Session],
should_write_classified_traces: bool = True,
):
@ -49,7 +48,6 @@ def inspect_block(
base_provider,
w3,
block_number,
should_cache,
trace_db_session,
)