eth2.py

Eth2 API Python bindings

MIT License

Downloads
165
Stars
6
Committers
1

.. image:: https://raw.githubusercontent.com/protolambda/eth2.py/master/docs/_static/logo.png :width: 100 px

eth2

.. image:: https://img.shields.io/pypi/l/eth2.svg :target: https://pypi.python.org/pypi/eth2

.. image:: https://img.shields.io/pypi/pyversions/eth2.svg :target: https://pypi.python.org/pypi/eth2

.. image:: https://img.shields.io/pypi/status/eth2.svg :target: https://pypi.python.org/pypi/eth2

.. image:: https://img.shields.io/pypi/implementation/eth2.svg :target: https://pypi.python.org/pypi/eth2

.. image:: https://github.com/protolambda/eth2.py/workflows/Eth2%20API%20Python%20CI/badge.svg :target: https://github.com/protolambda/eth2.py/actions

Eth2.py: Python API interface to the Eth2.0 API <https://github.com/ethereum/eth2.0-apis>_.

If you are looking for the Eth2 spec, see eth2spec on PyPi <https://pypi.org/project/eth2spec/>_ and GitHub <https://github.com/ethereum/eth2.0-specs>_.

Features

  • Uses the excellent httpx <https://www.python-httpx.org/>_ library, with support <https://www.python-httpx.org/async/>_
    for Trio <https://github.com/python-trio/trio>_ and AsyncIO <https://docs.python.org/3/library/asyncio.html>_ async runtimes.
  • Full type annotations, type hints for every API method
  • Compatible with the eth2spec package types and remerkleable for SSZ.
  • Through the eth2spec package, Beacon types can be configured, to use the API for testnets or other Eth2 variants.
  • Extensive use of Python 3.8 Protocol typing (PEP 544 <https://www.python.org/dev/peps/pep-0544/>_).
    Testing has your code has never been easier, just mock the object, type-safe!.
  • Easy extension and definition of API routes. The API function signatures and object types are all you need.

Example

Getting started ^^^^^^^^^^^^^^^^^

.. code-block:: python

import trio
from eth2.models import lighthouse
from eth2.core import ContentType
from eth2.providers.http import Eth2HttpClient, Eth2HttpOptions

async def start():
    # Customize this to use your Beacon endpoint
    address = 'http://localhost:4000'
    # Optionally bring in your own HTTP client
    # async with httpx.AsyncClient() as client:
    #     prov = Eth2HttpProvider(client, options=Eth2HttpOptions(api_base_url=address))
    async with Eth2HttpClient(options=Eth2HttpOptions(
            api_base_url=address,
            default_req_type=ContentType.json,
            default_resp_type=ContentType.ssz)) as prov:
        # The provider can be extended with any API model.
        await fun(prov.extended_api(lighthouse.Eth2API))
    print("done!")

trio.run(start)

Using the API model ^^^^^^^^^^^^^^^^^^^^^

.. code-block:: python

from eth2.models.lighthouse import Eth2API

async def fun(api: Eth2API):
    print("fetching state!")
    data = await api.beacon.state(slot=spec.Slot(1))
    print(data.beacon_state.eth1_data)

    # Much faster than retrieving full state!
    head = await api.beacon.head()
    print(f"finalized: {head.finalized_block_root.hex()} {head.finalized_slot}")

    enr = await api.network.enr()
    print(enr)

    # Will error, the slashing is invalid, two equal headers (and no signatures ofc)
    await api.beacon.post_proposer_slashing(spec.ProposerSlashing())

Advanced API calls ^^^^^^^^^^^^^^^^^^^^

When you need to tweak individual API call settings

.. code-block:: python

from eth2.core import ContentType, APIEndpointFn
from eth2.models.lighthouse import Eth2API, APIState

async def advanced(api: Eth2API):
    # Make a copy of the callable function, to then change its settings
    fn = APIEndpointFn(api.beacon.state)
    fn.resp_type = ContentType.json  # Instead of default ssz, because why not

    # The most inefficient way to retrieve finalized checkpoint.
    # Full state, as json.
    # But hey, access any data, and process with the spec as you like.
    data: APIState = await fn(slot=spec.Slot(300))
    print(data.beacon_state.finalized_checkpoint)

Defining custom models ^^^^^^^^^^^^^^^^^^^^^^^^

The HTTP provider can "learn" how to use a model of routes, on the fly! No need to hardcode any API calls. Just define the model as a Pytho 3.8 Protocol. The Eth2 API provider will shadow this model with an implementation.

  • Any Protocol class with annotations can be interpreted as route model. Fields are sub-routes.
  • api() decorator to make function calls usable endpoints. Customize endpoint options if you need.
  • var_path() decorator to make function calls construct dynamic paths

Currently the Lighthouse API model is well supported, and the new standard-API is being experimented with, but incomplete.

Project Links

Contact

Author: @protolambda <https://github.com/protolambda>_

License

MIT, see LICENSE <./LICENSE>_ file.