reth-db-py
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.