Skip to main content

Compressing read only eth_call

Project description

ethcompress

Calldata compression for eth_call. Build and execute compressed calls that return byte‑identical results, without changing your decode logic. Strategies supported:

  • JIT: Generate a temporary on‑chain decompressor that reconstructs calldata and forwards the call.
  • FLZ: FastLZ variant used by Solady (LZ77‑style) with a tiny forwarder.
  • CD: Calldata run‑length encoding (00/FF runs) with a tiny forwarder.

The library auto‑selects when helpful and safely falls back to vanilla.

Decompressor installs are done via eth_call state override at a fixed address: 0x00000000000000000000000000000000000000e0.

Quick Start

Compress a single call (raw calldata)

from web3 import Web3
from ethcompress import compress_eth_call

# Create a Web3 client
w3 = Web3(Web3.HTTPProvider("https://your.rpc.url"))

# to: destination contract; data_hex: 0x-prefixed calldata
cc = compress_eth_call(to, data_hex, alg="auto", min_size=800)
raw = cc.execute(w3)  # returns 0x-hex bytes

# Decode with your ABI
block_number, return_data = w3.codec.decode(["uint256", "bytes[]"], bytes.fromhex(raw[2:]))

Compress from a web3py ContractFunction

from ethcompress import compress_call_fn

cc = compress_call_fn(contract.functions.symbol(), alg="auto", min_size=800)
raw = cc.execute(w3) # raw output, will need to abi decode

Add middleware (Web3.py)

from ethcompress.middleware import CompressionMiddleware

w3.middleware_onion.add(CompressionMiddleware(
    alg="auto",        # "auto" | "jit" | "flz" | "cd"
    min_size=800,       # only compress above this many bytes
    allow_fallback=True # fall back to uncompressed on any error
))

# Existing w3.eth.call(...) keeps working; large calls get compressed

AsyncWeb3

from ethcompress.middleware import AsyncCompressionMiddleware

aw3.middleware_onion.add(AsyncCompressionMiddleware(alg="auto", min_size=800))

Performance Tips

  • For best performance with the middleware, use a dedicated Web3 instance with only CompressionMiddleware (clear the onion and keep only compression). You can keep using ContractFunction.call() or call eth_call on pre‑encoded data — both work.
from ethcompress.middleware import CompressionMiddleware

# Remove all middlewares
w3.middleware_onion.clear()

# Add only compression (tweak settings as needed)
w3.middleware_onion.add(CompressionMiddleware(alg="jit", min_size=0, allow_fallback=False))

Low‑level primitives

from ethcompress import cd_compress, flz_compress, jit_bytecode, flz_fwd_bytecode, rle_fwd_bytecode

cd = cd_compress(data_hex)
flz = flz_compress(data_hex)
jit_code = jit_bytecode(data_hex)
flz_fwd = flz_fwd_bytecode(target_address)
cd_fwd  = rle_fwd_bytecode(target_address)

Manual override call

from ethcompress import compress_call_data

to2, data2, override, meta = compress_call_data(data_hex, target_address, alg="auto", min_size=800)
if meta["algo"] != "vanilla":
    resp = w3.provider.make_request("eth_call", [{"to": to2, "data": data2}, "latest", override])
else:
    resp = w3.provider.make_request("eth_call", [{"to": target_address, "data": data_hex}, "latest"])

Strategy & Selection

  • Threshold: by default, skip compression if calldata < 800 bytes (min_size).
  • Auto (alg="auto"):
    • If original size ≥ 2096 bytes: prefer JIT (no FLZ/CD trials).
    • Else: compute FLZ and CD once, pick the smaller compressed stream.
    • Always validate benefit: if (code + compressed) ≥ original, use vanilla.

All strategies are transparent: the decompressor forwards to the real target and returns the same bytes as a vanilla call.

Middleware Behavior

  • Intercepts only eth_call and only when to/data are present.
  • Builds compressed call and state override; merges with any existing override map.
  • On failure, returns vanilla result when allow_fallback=True.

API Reference (condensed)

  • compress_eth_call(to, data, *, alg="auto", min_size=800, allow_fallback=True) -> CompressedCall
    • CompressedCall.execute(w3, block="latest") -> hex
  • compress_call_fn(fn, *, alg="auto", min_size=800, allow_fallback=True) -> CompressedCall
  • compress_call_data(data, target, *, alg="auto", min_size=800) -> (to, data, override, meta)
  • cd_compress(data) -> hex, flz_compress(data) -> hex
  • jit_bytecode(data) -> hex, flz_fwd_bytecode(address) -> hex, rle_fwd_bytecode(address) -> hex
  • Middleware: CompressionMiddleware(...), AsyncCompressionMiddleware(...)

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

ethcompress-0.1.0.tar.gz (23.9 kB view details)

Uploaded Source

Built Distribution

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

ethcompress-0.1.0-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file ethcompress-0.1.0.tar.gz.

File metadata

  • Download URL: ethcompress-0.1.0.tar.gz
  • Upload date:
  • Size: 23.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ethcompress-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6e3eb815d4f30bf39a92d846902ae0c2d91cd3e3e8acc5de629fe4d7bd275fa3
MD5 16ff5d10ad2c587db5f693fe5cfadebe
BLAKE2b-256 7249d587f82dcdddb3e5209713b79d787c2631733b200bebb8c692bc2169d3e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethcompress-0.1.0.tar.gz:

Publisher: release.yml on tadpole-labs/eth-compress-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ethcompress-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ethcompress-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ethcompress-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7ee96e93678a7de66fe38a8b2e54d3fe385260fc0551d275de1462eeb7be3cad
MD5 492a57545f8b867afdea5513b5e28705
BLAKE2b-256 e090125428a244c69fe8b87a81bb56935419d2c69aef50b0a2ed9501cf73442e

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethcompress-0.1.0-py3-none-any.whl:

Publisher: release.yml on tadpole-labs/eth-compress-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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