Python SDK for HealChain — self-healing decentralized storage via Reed-Solomon erasure coding
Project description
healchain-sdk
Python SDK for HealChain — self-healing decentralized storage using Reed-Solomon erasure coding on Ethereum and Arbitrum.
Zero dependencies. Works with Python 3.8+.
Install
pip install healchain-sdk
Quick Start
from healchain import HealChain
hc = HealChain(api_url="https://api.healchain.org")
# Store data — blocks until oracle fulfills
result = hc.store("Hello World", label="my first record")
print(f"Stored as record #{result['record_id']} on chain {result['chain_id']}")
# Retrieve — auto-discovers chain from GlobalRegistry
record = hc.retrieve(result["record_id"])
print(record["text"]) # Hello World
API
HealChain(api_url, **options)
| Parameter | Type | Default | Description |
|---|---|---|---|
api_url |
str | https://api.healchain.org |
API base URL |
api_key |
str | None |
Optional API key |
network |
str | 'sepolia' |
Default network: 'sepolia' or 'arbitrum' |
poll_interval |
float | 4.0 |
Seconds between oracle fulfillment polls |
poll_timeout |
float | 120.0 |
Max seconds to wait for fulfillment |
data_shards |
int | 10 |
Default RS data shards |
parity_shards |
int | 4 |
Default RS parity shards |
timeout |
float | 30.0 |
HTTP request timeout in seconds |
hc.store(data, *, label, network, on_pending, on_fulfilled)
Store data on-chain. Blocks until the oracle fulfills the request.
Parameters:
data—strorbyteslabel— record label (default:'sdk upload')network— override network:'sepolia'or'arbitrum'on_pending(info)— callback when tx is submittedon_fulfilled(result)— callback when oracle fulfills
Returns:
{
"record_id": str, # on-chain record ID
"request_id": str, # oracle request ID
"tx": str, # submission transaction hash
"chain_id": str, # chain where data is stored
"original_size": str, # original size in bytes
"encoded_size": str, # encoded shard size in bytes
}
Example with progress callbacks:
def on_pending(info):
print(f"Submitted! request_id={info['request_id']}")
def on_fulfilled(result):
print(f"Fulfilled! record_id={result['record_id']}")
result = hc.store(
"important data",
label="archive",
network="arbitrum", # ~75x cheaper than Sepolia
on_pending=on_pending,
on_fulfilled=on_fulfilled,
)
Storing bytes:
with open("document.pdf", "rb") as f:
result = hc.store(f.read(), label="my document")
hc.retrieve(record_id)
Retrieve a record by ID. Automatically queries the GlobalRegistry to find which chain holds the data.
Returns:
{
"record_id": str,
"data": str, # hex-encoded original data (0x...)
"text": str, # UTF-8 decoded text
"bytes": int, # original data size
"chain_id": str, # '11155111' (Sepolia) or '421614' (Arbitrum)
}
hc.get_metadata(record_id)
Fetch record metadata without retrieving the full data.
Returns: dict with label, owner, original_size, encoded_size, data_shards, parity_shards, timestamp, data_hash
hc.list(page=0, limit=10)
List records with pagination.
Returns:
{
"records": list, # record summaries
"total": int, # total record count
"pages": int, # total page count
"page": int, # current page
"limit": int, # records per page
}
hc.health()
Check service health.
Returns: dict with status, version, geth, lastBlock
Error Handling
from healchain import HealChain, HealChainError
hc = HealChain()
try:
record = hc.retrieve(999999)
except HealChainError as e:
print(e) # human-readable message
print(e.status) # HTTP status code (int or None)
print(e.code) # 'NETWORK_ERROR' | 'FULFILLMENT_TIMEOUT' | None
print(e.response) # raw response body (dict or None)
Networks
| Network | Chain ID | Notes |
|---|---|---|
sepolia |
11155111 | Ethereum Sepolia testnet |
arbitrum |
421614 | Arbitrum Sepolia testnet — ~75x cheaper gas |
Retrieve works automatically regardless of which chain the data is on.
Async Usage
The SDK is synchronous by default. For async contexts use a thread executor:
import asyncio
from concurrent.futures import ThreadPoolExecutor
from healchain import HealChain
hc = HealChain()
executor = ThreadPoolExecutor()
async def store_async(data, label):
loop = asyncio.get_event_loop()
return await loop.run_in_executor(executor, lambda: hc.store(data, label=label))
result = asyncio.run(store_async("Hello", label="async test"))
Async Usage (v0.2+)
Import AsyncHealChain for full async/await support:
import asyncio
from healchain import AsyncHealChain
async def main():
async with AsyncHealChain(api_url="https://api.healchain.org") as hc:
result = await hc.store("Hello World", label="my record")
record = await hc.retrieve(result["record_id"])
print(record["text"])
asyncio.run(main())
Concurrent operations
async with AsyncHealChain() as hc:
# Store multiple records concurrently
results = await hc.store_many([
("Hello", "record 1"),
("World", "record 2"),
], concurrency=3)
# Retrieve multiple records concurrently
records = await hc.retrieve_many([0, 1, 2, 3, 4], concurrency=5)
FastAPI integration
from fastapi import FastAPI
from healchain import AsyncHealChain
app = FastAPI()
hc = AsyncHealChain(api_url="https://api.healchain.org")
@app.get("/retrieve/{record_id}")
async def retrieve(record_id: int):
return await hc.retrieve(record_id)
Roadmap
- v0.1 — REST API client ✅
- v0.2 — Async support + concurrent store_many/retrieve_many ✅
- v0.3 — Streaming large file support
- v1.0 — Mainnet support
License
MIT
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file healchain_sdk-0.4.0.tar.gz.
File metadata
- Download URL: healchain_sdk-0.4.0.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81f3761f330fd85add668589536101a63fd88440a7079f26863bd4b88fa9a83b
|
|
| MD5 |
a721d49ded9651277f4a0baba51cf87e
|
|
| BLAKE2b-256 |
86e206125e230d4143cf31a93223d0dcc37a349c60b7a252a3d8e424847f0c9b
|
File details
Details for the file healchain_sdk-0.4.0-py3-none-any.whl.
File metadata
- Download URL: healchain_sdk-0.4.0-py3-none-any.whl
- Upload date:
- Size: 13.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88ace5aa2b6413ea92316db3735a12414d49daf3e6ccfa1d0d78d2a131b7b4ad
|
|
| MD5 |
18bcd3bfd8608d828e269264dc5d7dc8
|
|
| BLAKE2b-256 |
74d23341dd5dad56abcd0c7441d8b7962cf1caf51118a251620b93481f9111ca
|