Skip to main content

Web3py provider that makes it easy to switch between different blockchain nodes to make sure application will be be online if main blockchain node will be unavailable.

Project description

Lido Web3 Multi Provider

Code style: black License: MIT

Provider that accepts multiple endpoints.

Install

$ pip install web3-multi-provider

or

$ poetry add web3-multi-provider

or with metrics:

$ poetry add web3-multi-provider[metrics]

Usage

from web3 import Web3
from web3_multi_provider import MultiProvider
from web3_multi_provider import FallbackProvider

w3 = Web3(MultiProvider([  # RPC endpoints list
    'http://127.0.0.1:8000/',
    'https://mainnet.infura.io/v3/...',
]))

# or

w3 = Web3(FallbackProvider([  # RPC endpoints list
    'http://127.0.0.1:8000/',
    'https://mainnet.infura.io/v3/...',
]))

last_block = w3.eth.get_block('latest')

MultiProvider

This provider keeps track of the current endpoint and switches to the next one if an error occurs. It fails if no endpoints are available.

FallbackProvider

This provider sends requests to the all endpoints in the sequence until response received or endpoints list exhausted.

AsyncMultiProvider and AsyncFallbackProvider

These providers are async versions of MultiProvider and FallbackProvider respectively. They may be used with instances of AsyncWeb3.

from web3 import AsyncWeb3
from web3_multi_provider import AsyncMultiProvider

w3 = AsyncWeb3(AsyncMultiProvider([  # RPC endpoints list
    'http://127.0.0.1:8000/',
    'https://mainnet.infura.io/v3/...',
]))

Metrics

The library has built-in Prometheus metrics. They are disabled by default — install the extra and call init_metrics() before creating any provider.

pip install web3-multi-provider[metrics]
from web3 import Web3
from web3_multi_provider import MultiProvider, init_metrics

init_metrics()  # must be called before creating a provider

w3 = Web3(MultiProvider([
    'http://127.0.0.1:8000/',
    'https://mainnet.infura.io/v3/...',
]))

init_metrics() registers the following metrics with the default Prometheus registry:

Metric Type Description
http_rpc_requests Counter Total HTTP requests by network, provider, response code, result
http_rpc_batch_size Histogram Distribution of batch sizes
http_rpc_response_seconds Histogram RPC response time
http_rpc_request_payload_bytes Histogram Request payload size
http_rpc_response_payload_bytes Histogram Response payload size
rpc_request Counter RPC calls by method and result

Custom configuration

Use MetricsConfig to set a namespace or override the chain ID → network name mapping:

from web3_multi_provider.metrics import MetricsConfig

init_metrics(MetricsConfig(
    namespace="myapp",
    chain_id_to_name={
        1: "ethereum",
        137: "polygon",
        # add any custom chains here
    },
))

Custom registry

Pass a custom Prometheus registry if you don't want to use the global one:

from prometheus_client import CollectorRegistry
from web3_multi_provider import init_metrics

registry = CollectorRegistry()
init_metrics(registry=registry)

For developers

This project requires a specific Poetry version, pinned in .poetry-version. To install it:

POETRY_VERSION=$(cat .poetry-version) curl -sSL https://install.python-poetry.org/ | python -

Requirements

Setup

devcontainer up --workspace-folder .
devcontainer exec --workspace-folder . bash

This installs all dependencies and pre-commit hooks automatically via postCreateCommand.

Alternatively, without Docker:

  1. poetry install - to install deps
  2. pre-commit install - to install pre-commit hooks

Tests

poetry run pytest tests

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

web3_multi_provider-2.2.8.tar.gz (15.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

web3_multi_provider-2.2.8-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file web3_multi_provider-2.2.8.tar.gz.

File metadata

  • Download URL: web3_multi_provider-2.2.8.tar.gz
  • Upload date:
  • Size: 15.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for web3_multi_provider-2.2.8.tar.gz
Algorithm Hash digest
SHA256 6c7bb63985d68e4aaa2ddf7a19baf1cd346e41a651cd82950b52f91c87910304
MD5 acdb392bfd5d74021559747276dff1df
BLAKE2b-256 c8b3e9f166d7776ac089f6db82c542356bb39dc0270dd1ac75a85f48c877162a

See more details on using hashes here.

File details

Details for the file web3_multi_provider-2.2.8-py3-none-any.whl.

File metadata

File hashes

Hashes for web3_multi_provider-2.2.8-py3-none-any.whl
Algorithm Hash digest
SHA256 2b9c2be59a11099bb9b95438ff87fe84053385279e551ecb10e3452c18154480
MD5 f75fd423cba85796ddc6a61336ce7f55
BLAKE2b-256 5bf27fba8fb8fbcf2dfbd36f1e051eb60306463fdafb7d7712f4ecae0f4d8976

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page