This release expands the credit history API, adds authenticated IPFS CAR uploads and content-format filtering, optimizes Ethereum gas usage with EIP-1559, and lands a large stability pass focused on graceful shutdown, IPFS request-herd mitigation, and query performance.
New Features ✨
- Expanded Credit History API:
/credit_historygains time-range filtering, a direction (incoming/outgoing) filter, a resource-type filter (storage vs. compute spend), and a new summary endpoint. (PRs #1185, #1186, #1187, #1188) 💳 - Authenticated IPFS CAR Upload: New endpoint for authenticated CAR (Content Addressable aRchive) uploads. (PR #1134) 🔐
- Content Format Filter on Messages: Added a
contentFormatquery parameter to the messages list endpoint. (PR #1165) ✂️ - Filter Account Files by Hash: Account file listings can now be filtered by hash. (PR #1162) 🔍
- EIP-1559 Gas Optimization: Ethereum sync now uses EIP-1559 fee parameters to optimize gas costs. (PR #919) ⛽
- Larger Uploads: Bumped the maximum file upload size to 1 GiB. (PR #1166) 📦
Security Hardening 🛡️
- Balance Check on All Uploads: Enforce a balance check on every authenticated upload path. (PR #1149)
- Early Signature Rejection: Reject pending messages with a missing signature early in processing. (PR #1157)
- FORGET Authorization: Authorize FORGET via security-aggregate delegation. (PR #1156)
- Credit Grant Draining: Prevent a backdated expense from draining a future-dated grant. (PR #1124)
Graceful Shutdown & Stability 🛑
- SIGTERM Handling: Subprocess entry points now handle SIGTERM cleanly, unified on
asyncio.run, withAsyncExitStackshutdown scaffolding and child-process tracking/termination via theJobsRunner. (PRs #1138, #1139, #1140, #1146) - Clean Resource Teardown: Properly close the RabbitMQ channel/connection, dispose SQLAlchemy engines, close the P2P client and shared MQ connection, close cached aiohttp sessions, and close
NodeCacheandIpfsServiceon shutdown. (PRs #1141, #1142, #1143, #1144, #1145) - Quieter Shutdown Logs: Silenced shutdown noise from
MqWatcherand the Web3 provider. (PR #1154)
IPFS & Storage 🗄️
- Request-Herd Mitigation: Added a randomized delay before IPFS fetches and STORE file-fetch metrics to measure herd behavior. (PRs #1164, #1171)
- Faster Local Balance Pre-Check: Skip the IPFS size lookup in
pre_check_balancewhen the file is already local, and widen the timeout otherwise. (PRs #1169, #1170) - Storage Client Consolidation: Route all IPFS storage operations through the pinning client and expose a
storage_clientproperty. (PRs #1179, #1180)
Performance ⚡
- Denormalized Tags: Denormalized message and post tags into dedicated
TEXT[]columns backed by a single GIN index covering every message type, replacing the POST-only JSONB index. (PRs #1116, #1117) 🏷️ - Persisted Scoring Metrics: Persist node scoring metrics in dedicated partitioned tables. (PR #1150) 📊
- Faster
/posts/Listing: Sped up the v0/posts/listing for filtered queries with a composite partial index. (PR #1133) - Faster Unconfirmed Messages: Sped up
get_unconfirmed_messagesusing a denormalized column. (PR #1132) - Credit Balance Lot Cache: Eager-write lot cache for
credit_balances. (PR #1122)
Bug Fixes 🐞
- Duplicate WebSocket Fanout: Serialize MQ consumer start to stop duplicate message fanout. (PR #1173) 📡
- WebSocket Connection Counter Leak: Fixed an active-connection counter leak in
MessageBroadcaster. (PR #1118) 📊 - Page Param Validation: Validate the
pagepath parameter on the messages list endpoint. (PR #1174) - Retry Backoff Jitter: Apply full-jitter to message retry backoff. (PR #1172) 🔁
- Invalid PROGRAM Metadata: Auto-reject PROGRAM messages with non-dict metadata. (PR #1137)
- Auth Token Items: Unwrap configmanager
Itemsinrequire_auth_token. (PR #1136) 🔑
Maintenance & Dependency Updates ⬆️
- Removed the broken in-memory aggregates cache. (PR #1182)
- Dropped the direct
requestsdependency. (PR #1158) - Tightened typing: narrowed JSONB content fields and credit-handler signatures, and introduced a
SignableMessageprotocol for signature verifiers. (PRs #1148, #1155) - Excluded
.worktrees/from the Docker build context. (PR #1167) - Bumped
aleph-messageto 1.2.0 and the Aleph P2P service client to 0.2.0. (PRs #1147, #1177) - Library refresh:
pydantic,urllib3,psycopg2-binary,sentry-sdk,pytz,more-itertools,types-aiofiles.
Upgrade Guide
Make sure that your node is running v0.10.1 or later.
From v0.10.1, simply bump the version of these services:
- On the
docker-compose.ymlfile, thepyalephandpyaleph-apiservices must now usealephim/pyaleph-node:0.10.2.
Then run docker compose pull && docker compose up -d to restart the services.
messages (and posts) tables. Migration 0056 adds a tags TEXT[] column and runs a batched full-table backfill followed by a concurrent GIN index rebuild; this can take several hours on slower nodes. Migrations 0058 (concurrent index on posts) and 0059 (partitioned scoring-metrics tables with a 12-month backfill from messages) also run during this upgrade. Do not interrupt the process. The first startup may take significantly longer than usual while migrations 0056–0059 complete. Monitor the logs to confirm migration completion before considering the node fully operational.
Full Changelog: 0.10.1...0.10.2