reth-db-py
                                
                                 reth-db-py copied to clipboard
                                
                                    reth-db-py copied to clipboard
                            
                            
                            
                        Python wrapper around reth db. Written in Rust.
reth-db-py
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.
Installation
This package has been published to PyPi and can be installed using pip:
pip install reth-db-py
Assets
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 number
- get_headers_by_block_number_range: get multiple headers by block number range
- get_transaction_by_id: get a single transaction by transaction id
- get_transactions_by_id_range: get multiple transactions by transaction id range
- get_transactions_by_block_number_range: get multiple transactions by block number range
- get_block_by_number: get a single block by block number
- get_uncles_by_block_number: get uncles by block number
- get_receipts_by_transaction_id: get receipts by transaction id
- get_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
Usage
Import reth-db-py assets:
from reth_db_py import PyDatabaseHandler
Create a PyDatabaseHandler instance:
handler = PyDatabaseHandler("/path/to/db/mdbx.dat")
Get the header by block number
header = handler.get_header_by_block_number(17_000_000)
Get the headers by block number range
headers = handler.get_headers_by_block_number_range(17_000_000, 17_000_005)
Get transaction by id
transaction = handler.get_transaction_by_id(1000)
Get transactions by id range
transactions = handler.get_transactions_by_id_range(1000, 1005)
Get transactions by block number range
transactions = handler.get_transactions_by_block_number_range(17_000_000, 17_000_005)
Get block by number
block = handler.get_block_by_number(17_000_000)
Get uncles by block number
uncles = handler.get_uncles_by_block_number(17_000_000)
Get receipts by transaction id
receipts = handler.get_receipts_by_transaction_id(1000)
Get receipts by block number
receipts = handler.get_receipts_by_block_number(17_000_000)
Tests
Coming soon.
Benchmarks
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.
