Skip to main content

A unified Python SDK for P2P networking with integrated DHT and NAT capabilities

Project description

Lattica Python SDK

A unified Python SDK for P2P networking with integrated DHT and NAT capabilities, built on top of libp2p.

Features

  • Distributed Hash Table (DHT): Store and retrieve key-value pairs across the network
  • Remote Procedure Call (RPC): Execute remote functions with support for complex data types
  • Streaming RPC: Handle large data transfers with streaming capabilities
  • NAT Traversal: Automatic NAT traversal with UPnP support
  • Peer Discovery: mDNS and rendezvous-based peer discovery
  • High Performance: Built with Rust for optimal performance

Installation

You can install the released versions

pip install lattica

Or you can install from source using:

pip install git+https://github.com/GradientHQ/lattica.git#subdirectory=bindings/python

Quick Start

Basic Usage

from lattica import Lattica

# Create a Lattica instance
lattica = Lattica.builder().build()

# Get your peer ID
peer_id = lattica.peer_id()
print(f"My peer ID: {peer_id}")

Examples

1. DHT Operations

The DHT example demonstrates basic key-value storage and retrieval with subkey support.

from lattica import Lattica

# Create client1 as bootstrap node
lattica = Lattica.builder()
    .build()

# Create client2 with bootstrap nodes
lattica = Lattica.builder() \
    .with_bootstraps(["/ip4/127.0.0.1/tcp/54282/p2p/QmServerPeerId"]) \
    .build()

# Store a simple key-value pair with default expiration 10 minute
lattica.store("name", "alice")

# get the value
result = lattica.get("name")
if result:
    print(f"Value: {result.value}")
    print(f"Expires: {result.expiration_time}")


# Store values with subkeys (useful for voting, user data, etc.)
key = "peer_list"
peers = ["alice", "bob", "carol"]

# Each peer stores their vote with a subkey
lattica.store(key, "yes", expiration_time, subkey="alice")
lattica.store(key, "no", expiration_time, subkey="bob")
lattica.store(key, "maybe", expiration_time, subkey="carol")

# get all votes
votes_result = lattica.get(key)
if votes_result:
    for peer, vote_info in votes_result.value.items():
        print(f"{peer}: {vote_info.value}")

2. RPC Operations

The RPC example demonstrates remote procedure calls with support for complex data types and streaming.

from lattica import Lattica, rpc_method, rpc_stream, rpc_stream_iter, ConnectionHandler



class MyService(ConnectionHandler):
    @rpc_method
    def add(self, a: int, b: int) -> int:
        """Simple addition"""
        return a + b
    
    @rpc_stream
    def process_data(self, data: list) -> list:
        return data

    @rpc_stream_iter
    def stream_rpc_iter(self):
        while True:
            text = "hello world"
            yield text
            
# Create client1 as RPC server and bootstrap node
lattica = Lattica.builder()
    .build()
service = MyService(lattica)

# Create client2 with bootstrap nodes
lattica = Lattica.builder() \
    .with_bootstraps(["/ip4/127.0.0.1/tcp/54282/p2p/QmServerPeerId"]) \
    .build()
client_service = MyService(client_lattica)

# Make RPC calls
stub = client_service.get_stub(server_peer_id)
result = stub.add(10, 20)  # Returns 30

# Handle complex data types
num_floats = int(2 * 1024 * 1024 * 1024) // 8 #2GB
test_data = [random.random() for _ in range(num_floats)]
result = stub.process_data(test_data)

# stream iter call
for text in stub.stream_rpc_iter():
    print(f"recv: {text}")

Configuration

Builder Pattern

lattica = Lattica.builder() \
    .with_bootstraps([
        "/ip4/127.0.0.1/tcp/8080/p2p/QmBootstrap1",
        "/ip4/127.0.0.1/tcp/8081/p2p/QmBootstrap2"
    ]) \
    .with_listen_addrs(["/ip4/0.0.0.0/tcp/0", "/ip4/0.0.0.0/udp/0/quic-v1"])
    .with_external_addrs(["/ip4/0.0.0.0/tcp/0"])
    .with_mdns(True) \
    .with_upnp(True) \
    .build()

Configuration Options

  • with_bootstraps(nodes): Set bootstrap nodes for network discovery
  • with_listen_addrs(addrs): Set listening address
  • with_mdns(enabled): Enable/disable mDNS peer discovery
  • with_upnp(enabled): Enable/disable UPnP NAT traversal
  • with_relay_servers(servers): Set relay servers for network relay
  • with_autonat(enabled): Enable/disable AutoNAT detect[need relay servers]
  • with_dcutr(enabled): Enable/disable TCP/QUIC NAT travelsal[need relay servers]
  • with_external_addrs(addrs): Set external address
  • with_storage_path: Persistent storage path
  • with_dht_db_path: DHT Persistent db path
  • with_key_path: Set Keypair path

Development

Building from Source

# Install maturin
pip install maturin

# Build the package
cd bindings/python
pip install .

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

lattica_dev-1.0.3-cp38-abi3-win_amd64.whl (7.7 MB view details)

Uploaded CPython 3.8+Windows x86-64

lattica_dev-1.0.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.7 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ x86-64

lattica_dev-1.0.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (11.0 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

lattica_dev-1.0.3-cp38-abi3-macosx_11_0_arm64.whl (9.5 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

lattica_dev-1.0.3-cp38-abi3-macosx_10_12_x86_64.whl (9.7 MB view details)

Uploaded CPython 3.8+macOS 10.12+ x86-64

File details

Details for the file lattica_dev-1.0.3-cp38-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for lattica_dev-1.0.3-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 0d2c3d1a651e4614507e0ed541e3907b4318b543c816cce726c689b68adb7658
MD5 90621a1073582f17c170068e6ba0d423
BLAKE2b-256 435f98505eb4b7675356475ef45d8c400dc8d9bfe55c6778de71991760516dde

See more details on using hashes here.

File details

Details for the file lattica_dev-1.0.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lattica_dev-1.0.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e72d7cb6665a6cb3551614f51314fceb26db57120b9585a2b597f0576d0d0923
MD5 dcda318b9e8daeaddacdf374a3995df9
BLAKE2b-256 d4e6bf95bc080005ec47eaa51001661998ec650631414d1a11a21c5036f92318

See more details on using hashes here.

File details

Details for the file lattica_dev-1.0.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lattica_dev-1.0.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8fffb9db65255b7a5f1f06d5c01d529bf129b1ca9e611704dd5e61e162bbd314
MD5 bea11b8742e04c5e4870a284ca1fbb1e
BLAKE2b-256 c61fa3e978705e307e2cb7035ac4a13264ec6bae44e4e8ca7db835cf918f463a

See more details on using hashes here.

File details

Details for the file lattica_dev-1.0.3-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lattica_dev-1.0.3-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0a95b7a0f74b27c1a0bdb408b9c782708b270cfa50601f122fe436b35a13f0ce
MD5 28b620ab5d75b9c625b3a5cf4fdf92ca
BLAKE2b-256 210626c28ec8b21686b8d1e74a0ca5a15401cd079248e7e4b8bddb419df697cd

See more details on using hashes here.

File details

Details for the file lattica_dev-1.0.3-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for lattica_dev-1.0.3-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 78ca03b847a6e9a514e5ab5bae00432f61eef8c87bf1edec2d899f9a4cd00f13
MD5 61f24cb5df9f64b96783395556cca24d
BLAKE2b-256 282b6bc41333767de374cbb270d925d3c1ed6f62075cfe4a9970c1fdc23585ed

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