Expand description
The deCDN wire protocol: the ALPN identifiers, the message types each ALPN carries, and the framing that puts them on a QUIC stream.
deCDN speaks three ALPNs (ADR 005):
| ALPN | Constant | Messages | Purpose |
|---|---|---|---|
cdn/probe/v1 | ALPN_PROBE | ProbeMessage | Latency and availability probing |
cdn/client/v1 | ALPN_CLIENT | ClientMessage | All paid delivery, client to node and node to node |
cdn/dht/v1 | ALPN_DHT | DhtMessage | Content discovery over a Kademlia DHT (ADR 022) |
§Modules
| Module | Contents |
|---|---|
framing | The length-prefixed frame, encode_message / decode_message, and the async read_frame / write_frame |
message | cdn/probe/v1: ProbeRequest, ProbeResponse |
client | cdn/client/v1: StreamRequest, StreamResponse, ChunkData, the wire Voucher, StreamError |
dht | cdn/dht/v1: store and find requests, provider records, closer-node lists |
coverage | The block coverage bitmap a partial holder advertises |
identity | The 32-byte NodeId and ContentHash newtypes |
region | ISO 3166-1 alpha-2 Region codes |
§Frames and extensions
Every message is a postcard encoding behind a varint length prefix, capped at
MAX_MESSAGE_SIZE (ADR 013 § Wire Framing). A signed message has a frozen
base: the fields its signature covers. Unsigned fields travel as trailing
bytes after the base. decode_message returns them as a remainder, and the
parse_*_ext functions read them (ADR 013 § Three Tiers of Evolution).
use decdn_protocol::{ProbeMessage, ProbeRequest, decode_message, encode_message};
let request = ProbeMessage::Request(ProbeRequest {
hash: [7; 32],
timestamp_us: 1_700_000_000_000_000,
});
let frame = encode_message(&request)?;
let (decoded, remainder) = decode_message::<ProbeMessage>(&frame)?;
assert_eq!(decoded, request);
assert!(remainder.is_empty());This crate holds no cryptography. The signatures carried in these messages
are made and checked by decdn-incentive. It has few dependencies, so
code that only speaks the protocol links no blob store, Ethereum client, or
cloud SDK.
Re-exports§
pub use client::BINDING_SIG_LEN;pub use client::CHUNK_BYTES;pub use client::ChunkData;pub use client::ChunkPreimage;pub use client::ClientBinding;pub use client::ClientMessage;pub use client::MAX_CHAIN_LENGTH;pub use client::MB_BYTES;pub use client::StreamError;pub use client::StreamRequest;pub use client::StreamRequestExt;pub use client::StreamResponse;pub use client::StreamResponseBody;pub use client::StreamResponseExt;pub use client::VOUCHER_SIG_LEN;pub use client::Voucher;pub use client::VoucherRejectReason;pub use client::encode_chunk_frame;pub use client::encode_stream_request;pub use client::encode_stream_response;pub use client::parse_stream_request_ext;pub use client::parse_stream_response_ext;pub use coverage::Coverage;pub use coverage::DISCOVERY_BLOCK_BYTES;pub use coverage::discovery_block_bytes;pub use coverage::num_blocks;pub use dht::BatchStoreAck;pub use dht::BatchStoreRequest;pub use dht::CloserNodes;pub use dht::CloserNodesError;pub use dht::DhtMessage;pub use dht::FindNodeRequest;pub use dht::FindNodeResponse;pub use dht::FindValueRequest;pub use dht::FindValueResponse;pub use dht::FindValueResponseExt;pub use dht::MAX_BATCH_STORE_HASHES;pub use dht::MAX_CLOSER_NODES;pub use dht::MAX_PROVIDERS_PER_HASH;pub use dht::StoreAck;pub use dht::StoreRequest;pub use dht::StoreRequestExt;pub use dht::encode_find_value_response;pub use dht::encode_store_request;pub use dht::parse_find_value_response_ext;pub use dht::parse_store_request_ext;pub use framing::FrameError;pub use framing::MAX_MESSAGE_SIZE;pub use framing::TopLevelEnum;pub use framing::decode_message;pub use framing::encode_message;pub use framing::is_unknown_variant;pub use framing::read_frame;pub use framing::write_frame;pub use identity::ContentHash;pub use identity::ID_LEN;pub use identity::NodeId;pub use message::MAX_RATE_PER_MB;pub use message::MessageValidationError;pub use message::ProbeMessage;pub use message::ProbeRequest;pub use message::ProbeResponse;pub use message::ProbeResponseBody;pub use message::ProbeResponseExt;pub use message::SLASH_SIG_LEN;pub use message::encode_probe_response;pub use message::parse_probe_response_ext;pub use region::InvalidRegion;pub use region::Region;pub use region::is_valid_region;
Modules§
- client
- Wire message payload types for the
cdn/client/v1paid-delivery protocol. - coverage
- Range-keyed block coverage bitmap (ADR 039-adjacent partial-holder discovery).
- dht
- Wire message types for the
cdn/dht/v1Kademlia content DHT (ADR 022). - framing
- Length-prefixed wire framing for deCDN ALPNs (ADR 013).
- identity
- Strongly-typed 32-byte identity newtypes for the deCDN wire protocol.
- message
- Wire message payload types for deCDN ALPN protocols.
- region
- ISO 3166-1 alpha-2 region-code validation.
Constants§
- ALPN_
CLIENT - ALPN protocol identifier for paid blob delivery (client-to-node and node-to-node).
- ALPN_
DHT - ALPN protocol identifier for Kademlia-based content discovery (ADR 022).
- ALPN_
PROBE - ALPN protocol identifier for latency and availability probing.
- APP_
ERR_ RATE_ LIMITED - Connection rejected by the per-source or global rate limiter (ADR 013 §0x10).