Skip to main content

eth-hub - Ethereum Key Management Toolkit

CI/CD pre-commit

PyPI Version PyPI - Status PyPI - Downloads

Python Versions License

A secure abstraction layer for managing Ethereum keys across different storage backends.

Key Features

🔐 Secure Key Management

  • Unified interface for multiple key storage providers
  • Never exposes private keys outside secure environments
  • Will support both software and hardware security modules

📜 Complete Signing Capabilities

  • Transaction signing
  • Message signing (EIP-191 compatible)
  • Hash signing
  • Consistent signature output format

Core Architecture

from eth_hub import (
    BaseKeyStore,  # Abstract base class
    AwsKeyStore,  # AWS KMS implementation
    LocalKeyStore  # In-memory implementation
)

BaseKeyStore (ABC)

The abstract base class defining all key operations:

class BaseKeyStore(ABC):
    @abstractmethod
    def import_key(self, private_key: bytes) -> BaseKey: ...

    @abstractmethod
    def create_key(self) -> BaseKey: ...

    @abstractmethod
    def get_key(self, key_id: UUID) -> BaseKey: ...

    @abstractmethod
    def list_keys(self) -> Sequence[BaseKey]: ...

    @abstractmethod
    def remove_key(self, key_id: UUID) -> None: ...

    @abstractmethod
    def sign_hash(self, key_id: UUID, hash_: bytes) -> SignatureInfo: ...

    @abstractmethod
    def sign_message(self, key_id: UUID, message: SignableMessage) -> SignatureInfo: ...

    @abstractmethod
    def sign_transaction(self, key_id: UUID, transaction_data: dict[str, Any]) -> SignatureInfo: ...

Current Implementations

1. AWS KMS KeyStore

  • Keys never leave AWS KMS
  • All signing operations performed within KMS
  • Supports both imported and KMS-generated keys

2. LocalKeyStore (Memory)

  • In-memory key storage for development/testing
  • Simulates same interface as other stores
  • Useful for CI/CD pipelines and local testing

3. HashiCorp Vaul - WiP

Installation

pip install eth-hub

Aws usage case

If you want to use your own key material, you can import it into AWS KMS. Otherwise, create a new KMS key for Ethereum signing.

web3_rpc = "..."
web3 = Web3(Web3.HTTPProvider(web3_rpc))

key_storage = AwsKeyStore(boto3.client("kms"))

# import your private key to KMS
key = key_storage.import_key(private_key="...")

# or create new one by KMS:
key = key_storage.create_key()

Sign and send transaction:

web3_rpc = "..."
web3 = Web3(Web3.HTTPProvider(web3_rpc))

key_id = "..."
key_storage = AwsKeyStore(boto3.client("kms"))
key = key_storage.get_key(key_id)
user_address = Web3.to_checksum_address(key.address.hex())

abi = [...]
contract_address = Web3.to_checksum_address(contract_address)
contract = web3.eth.contract(address=contract_address, abi=abi)
nonce = web3.eth.get_transaction_count(user_address)
transaction_dict = contract.functions.foo.build_transaction({"nonce": nonce})

unsigned_transaction = TypedTransaction.from_dict(transaction_dict)
signature = key_storage.sign_hash(key_id, unsigned_transaction.hash())

signed_transaction = TypedTransaction.from_dict(
    {**transaction_dict, "v": signature.v, "r": signature.r, "s": signature.s}
)

tx_hash = web3.eth.send_raw_transaction(encoded_tx.encode())

The private key never leaves AWS KMS. Signing is performed inside KMS, and only the signature is returned to your application.

Planned Features:

  • Integration with HashiCorp Vault's

Download files

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

Source Distribution

eth_hub-1.1.0.tar.gz (8.7 kB view details)

Uploaded Source

Built Distribution

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

eth_hub-1.1.0-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

File details

Details for the file eth_hub-1.1.0.tar.gz.

File metadata

  • Download URL: eth_hub-1.1.0.tar.gz
  • Upload date:
  • Size: 8.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for eth_hub-1.1.0.tar.gz
Algorithm Hash digest
SHA256 ab15e8f78352b288c0705046ab77b7d63f739200b31116be32ba3e3f76e0da9b
MD5 775538b113b26db3d2b47dbaf8246fb7
BLAKE2b-256 3024772e7947abc3798d725cd65ac60deb3e17c3972c68509547bfea8dca3cb1

See more details on using hashes here.

File details

Details for the file eth_hub-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: eth_hub-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for eth_hub-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b73350ac56442c98c6b9213b87651bab1d555f11b046c2d5d3967b8835ac6e29
MD5 ed18ea8843620cb569b4cff789d84ede
BLAKE2b-256 2338f5b37779a4e247d19cea577cfe0d8b0c1ea9f8458ec8bacc72c53cef13a9

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 files

1.0.1

2 files

1.0.0

2 files

0.1.2

2 files

0.1.1

2 files

Supported by

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