-
Notifications
You must be signed in to change notification settings - Fork 44
Language-agnostic protocol specification (PROTOCOL.md) so nodes can be built in any language #371
Copy link
Copy link
Closed as not planned
Closed as not planned
Copy link
Labels
kind:docsDocs and comments onlyDocs and comments onlysev:lowCosmetic, cleanup, or nice-to-haveCosmetic, cleanup, or nice-to-havesubsystem:apiNode REST API request/response surfaceNode REST API request/response surfacesubsystem:attestationCertificates, anchoring, per-ref attestationCertificates, anchoring, per-ref attestationsubsystem:encryptionEncrypted subtrees, recipient blinding, key zeroizationEncrypted subtrees, recipient blinding, key zeroizationsubsystem:identityDID/UCAN, http-sig auth, push authorizationDID/UCAN, http-sig auth, push authorizationsubsystem:storageBlob/object store, Arweave, IPFS, archivesBlob/object store, Arweave, IPFS, archives
Description
Activity
Metadata
Metadata
Assignees
Labels
kind:docsDocs and comments onlyDocs and comments onlysev:lowCosmetic, cleanup, or nice-to-haveCosmetic, cleanup, or nice-to-havesubsystem:apiNode REST API request/response surfaceNode REST API request/response surfacesubsystem:attestationCertificates, anchoring, per-ref attestationCertificates, anchoring, per-ref attestationsubsystem:encryptionEncrypted subtrees, recipient blinding, key zeroizationEncrypted subtrees, recipient blinding, key zeroizationsubsystem:identityDID/UCAN, http-sig auth, push authorizationDID/UCAN, http-sig auth, push authorizationsubsystem:storageBlob/object store, Arweave, IPFS, archivesBlob/object store, Arweave, IPFS, archives
Summary
There's no language-agnostic protocol specification, so a node can only be implemented by reading the Rust source. To let anyone build an interoperable node (or client) in another language, we need a
PROTOCOL.md(ordocs/PROTOCOL.md) that documents the wire contract independently of the reference implementation.Why
"Anyone can run a node" is only true if the protocol is specified separately from
gitlawb-node. Today the auth scheme, DID methods, ref-update certificate schema, HTTP API shapes, and IPFS/IPNS mapping all live implicitly in the Rust crates. A spec:Proposed scope
A first
PROTOCOL.mdcovering, sourced from the current code:did:key/did:web/did:gitlawb; key type (Ed25519); DID → verifying-key resolution.Signature-Inputcovered components (@method,@path,content-digest),keyid= signer DID,alg="ed25519",created, andContent-Digestconstruction. Which routes require signatures.403 icaptcha_proof_requiredflow,x-icaptcha-url/x-icaptcha-level/x-icaptcha-proofheaders, which writes are gated.gitlawb/ref-update/v1): body fields, canonical signing bytes, signature entries, threshold/countersignature semantics.RequireAllleniency)./api/v1/*resources (repos, refs, certs, agents, tasks, bounties, peers, resolve, stats) with request/response shapes and status/error conventions (incl. 404-shaped denials)./{owner}/{repo}/info/refs,git-upload-pack) and thegitlawb://remote-helper URL scheme./ipfs/{cid}retrieval. (Which parts are normative vs. optional.)Each section should mark normative (required for interop) vs. informational (reference-implementation behavior).
Approach
I've been in the node internals recently (storage docs #363, the attest/core verification fixes #365/#366) and am happy to draft the first pass. Opening this to agree on scope and structure before writing — in particular: preferred location (
PROTOCOL.mdvsdocs/PROTOCOL.md), and whether you want a formal normative/informational split from the start.