Python package allowing you to interact with the Reth DB via Python. Written with Rust and Pyo3.
This python wrapper can access node data 3x-5x faster than local web3.py calls. Using this package, a block can be retrieved in ~10ms on a local reth DB.
This package has been published to PyPi and can be installed using pip:
pip install reth-db-py
This package only has a single python class made available: PyDatabaseHandler
.
PyDatabaseHandler
is a class used to interact with the Reth DB. It's a wrapper around the Rust DatabaseHandler
struct.
It has a few methods which all return json strings:
get_header_by_block_number
: get a single header by block numberget_headers_by_block_number_range
: get multiple headers by block number rangeget_transaction_by_id
: get a single transaction by transaction idget_transactions_by_id_range
: get multiple transactions by transaction id rangeget_transactions_by_block_number_range
: get multiple transactions by block number rangeget_block_by_number
: get a single block by block numberget_uncles_by_block_number
: get uncles by block numberget_receipts_by_transaction_id
: get receipts by transaction idget_receipts_by_block_number
: get receipts by block number
impl PyDatabaseHandler {
pub fn get_header_by_block_number(&self, number: u64) -> PyResult<String>
pub fn get_headers_by_block_number_range(&self, start: u64, end: u64) -> PyResult<String>
pub fn get_transaction_by_id(&self, id: u64) -> PyResult<String>
pub fn get_transactions_by_id_range(&self, start: u64, end: u64) -> PyResult<String>
pub fn get_transactions_by_block_number_range(&self, start: u64, end: u64) -> PyResult<String>
pub fn get_block_by_number(&self, number: u64) -> PyResult<String>
pub fn get_uncles_by_block_number(&self, number: u64) -> PyResult<String>
pub fn get_receipts_by_transaction_id(&self, id: u64) -> PyResult<String>
pub fn get_receipts_by_block_number(&self, number: u64) -> PyResult<String>
}
class PyDatabaseHandler:
def get_header_by_block_number(self, number: int) -> str
def get_headers_by_block_number_range(self, start: int, end: int) -> str
def get_transaction_by_id(self, id: int) -> str
def get_transactions_by_id_range(self, start: int, end: int) -> str
def get_transactions_by_block_number_range(self, start: int, end: int) -> str
def get_block_by_number(self, number: int) -> str
def get_uncles_by_block_number(self, number: int) -> str
def get_receipts_by_transaction_id(self, id: int) -> str
def get_receipts_by_block_number(self, number: int) -> str
from reth_db_py import PyDatabaseHandler
handler = PyDatabaseHandler("/path/to/db/mdbx.dat")
header = handler.get_header_by_block_number(17_000_000)
headers = handler.get_headers_by_block_number_range(17_000_000, 17_000_005)
transaction = handler.get_transaction_by_id(1000)
transactions = handler.get_transactions_by_id_range(1000, 1005)
transactions = handler.get_transactions_by_block_number_range(17_000_000, 17_000_005)
block = handler.get_block_by_number(17_000_000)
uncles = handler.get_uncles_by_block_number(17_000_000)
receipts = handler.get_receipts_by_transaction_id(1000)
receipts = handler.get_receipts_by_block_number(17_000_000)
Coming soon.
Speed tests were conducted by retrieving 1,000 block bodies (including transactions) using:
- reth-db-py (local reth db)
- web3.py (local reth JSON RPC)
- http requests (remote alchemy API)
See benchmark tests here.