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-1.0.14-cp38-abi3-win_amd64.whl (7.7 MB view details)

Uploaded CPython 3.8+Windows x86-64

lattica-1.0.14-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-1.0.14-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (11.0 MB view details)

Uploaded CPython 3.8+manylinux: glibc 2.17+ ARM64

lattica-1.0.14-cp38-abi3-macosx_11_0_arm64.whl (9.5 MB view details)

Uploaded CPython 3.8+macOS 11.0+ ARM64

lattica-1.0.14-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-1.0.14-cp38-abi3-win_amd64.whl.

File metadata

  • Download URL: lattica-1.0.14-cp38-abi3-win_amd64.whl
  • Upload date:
  • Size: 7.7 MB
  • Tags: CPython 3.8+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.10.2

File hashes

Hashes for lattica-1.0.14-cp38-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c3db08815ff278ca721dda8d333634acc0f20fbd9a17114a7d0b9b3943941f14
MD5 bda6852092256dac87866cd2ea776c9a
BLAKE2b-256 66c8a0b6ad3a685c6ab915fd97d5e653da3270cb37c8f47a48931c4639f84d3a

See more details on using hashes here.

File details

Details for the file lattica-1.0.14-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for lattica-1.0.14-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2dfe962a0af8c9941fb66e22d6131b1e0839cf89f3f03ceeafe06dd847067f87
MD5 702f565300df18d45e0b7cb5dd8e2c76
BLAKE2b-256 a727586de9d6b2017ff412da0084989ba31f76605ffd3bf75bcdf641a8f228bc

See more details on using hashes here.

File details

Details for the file lattica-1.0.14-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for lattica-1.0.14-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f6f699918adf82c5cacaa00ec4957087ce2693857d92cd6f8613246a0cb4b3f7
MD5 6b9a08b31a443ae3bbda200fa14a2743
BLAKE2b-256 e85a3f151e3c2a2c66e9279f6be5e88e120182ce4e42664a6d8a17ed2d8d4f04

See more details on using hashes here.

File details

Details for the file lattica-1.0.14-cp38-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lattica-1.0.14-cp38-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b3278b4f3dd05b8bcfa3ad39d4cc847698fd525fa7a86e4a4b261f2b795de5e9
MD5 f9c1f392d1983918342725b58bd370ca
BLAKE2b-256 0a8646363da79cf82cd84e5c95d71ff1d48f5053f34bec921c0e805acbe51c11

See more details on using hashes here.

File details

Details for the file lattica-1.0.14-cp38-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for lattica-1.0.14-cp38-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 68c59bcd92b4a3796f11d697cffdfb7dd673365c158835ae4129f59cc4878c47
MD5 c269a8617183f14db57f13a160b51202
BLAKE2b-256 3843d259147aa15eb902f0d52cfe77243d772b5e821e1fb48b7ba268f9aeb5ba

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