Skip to main content

Crate decdn_protocol

Crate decdn_protocol 

Source
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):

ALPNConstantMessagesPurpose
cdn/probe/v1ALPN_PROBEProbeMessageLatency and availability probing
cdn/client/v1ALPN_CLIENTClientMessageAll paid delivery, client to node and node to node
cdn/dht/v1ALPN_DHTDhtMessageContent discovery over a Kademlia DHT (ADR 022)

§Modules

ModuleContents
framingThe length-prefixed frame, encode_message / decode_message, and the async read_frame / write_frame
messagecdn/probe/v1: ProbeRequest, ProbeResponse
clientcdn/client/v1: StreamRequest, StreamResponse, ChunkData, the wire Voucher, StreamError
dhtcdn/dht/v1: store and find requests, provider records, closer-node lists
coverageThe block coverage bitmap a partial holder advertises
identityThe 32-byte NodeId and ContentHash newtypes
regionISO 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/v1 paid-delivery protocol.
coverage
Range-keyed block coverage bitmap (ADR 039-adjacent partial-holder discovery).
dht
Wire message types for the cdn/dht/v1 Kademlia 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).