commits
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
uses decodeMstNode + in-walk key height verification instead of generic
CBOR decode + full MST rebuild. MST step: 218ms → 39ms on pfrazee.com.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix Jacquard link (tangled.sh, not github). Add context for rsky
(Rudy Fraser / BlackSky) and Jacquard (@nonbinary.computer). Clarify
that rust-verify uses same low-level crates as rsky internally.
Explain Go's MST performance advantage (decode-once-and-cache).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
add `just verify` and `just chart` — full AT Protocol trust chain
verification with timing across all three SDKs. includes O(1) block
lookup fix (HashMap vs linear scan), SVG chart generation, and
results in README.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
adds rust benchmarks using the same crate stack as blacksky's rsky-relay:
ciborium + serde_ipld_dagcbor + rs-car-sync (with CID verification) for
decode, RustCrypto k256/p256 for sig-verify. three-way comparison now
covers zig, rust, and go across both decode and signature verification.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
add signature verification benchmark infrastructure:
- zig: capture_sigs corpus builder, three-tier bench (full/crypto/preparsed)
- go: equivalent three-tier bench using dcrd/secp256k1
- justfile: capture-sigs, bench-sigs commands
update README: reframe as relay infrastructure benchmarks covering
both decode and verify. update sig-verify numbers (zig and go now
roughly even). add synthesis in "when this matters" section.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
direct base table mul + projective-table GLV
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
isolates pure ECDSA math from SEC1 key decompression.
reveals Go's key parsing is ~17% of crypto-only time,
making the pure math gap 1.7x (not 1.5x).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
sig-verify: zig 9,845 v/s (k256 v0.0.2 Fe26), go 15,128 v/s
decode: zig 235k fps (verified), go 15.6k fps
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
switch k256 from path dep to tagged URL dep.
sig-verify: 2,436 → 9,796 verifies/sec (~4x), gap to Go narrowed from 6x to 1.5x.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
zat now enforces the same size limits as indigo (2MB blocks, 10k max
blocks). there are no remaining correctness differences between the
two decode paths.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
traced indigo's full decode path to verify no correctness work is
skipped. added "correctness parity" and "where the ~20x comes from"
sections decomposing the gap into implementation factors.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- go-raw: fxamacker/cbor + hand-rolled CAR parser (~41k fps, 3.5x faster
than indigo)
- zig bench: add decode+verify mode using zat v0.2.1's CID hash
verification (~311k fps with SHA-256 per block)
- README: split results into production-correct (with CID verification)
and decode-only tables. only zat and indigo verify CID hashes.
- add CID verification comparison table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
zero-copy CBOR via minicbor, bump arena allocation, hand-rolled
sync CAR parser. narrows the zig gap from ~10x to ~2.5x, showing
the difference is SDK architecture (jacquard: 48k fps) vs language
(raw: 244k fps vs zat: 628k fps).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- rust/python/go: decode_full never propagates errors — catches
frame-level failures and counts them, matching zig's pattern
- go: distinguish io.EOF from real errors in CAR block iteration
- blocks/frame precision bumped from .1 to .2 (9.98 not 10.0)
- README: disclose zat CBOR decoder used in capture filter,
acknowledge 30-40% run-to-run variance in methodology
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
the "jacquard-style" bench was a bad reimplementation using the same
crates — actual jacquard via decode_framed + parse_car_bytes is ~2x
faster. rust is now ahead of python again.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- capture.zig: replace zat.firehose.decodeFrame with minimal CBOR
header peek — removes SDK bias from corpus generation
- bench.zig: decode header → payload → CAR → every block (was only
decoding op-linked blocks)
- bench.py: count blocks from CAR.from_bytes() (libipld already
decodes them internally)
- main.go: track error counts instead of swallowing, count blocks
- main.rs: add block/error counting to existing full-block decode
- all SDKs: report blocks/frame, error count, variance (min/median/max)
- README: honest fairness notes, explain python > rust result
verified: all four SDKs report identical block counts on same corpus.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
capture ~10s of live firehose traffic into length-prefixed binary corpus,
then decode with zig (zat), rust (jacquard-style), go (indigo), and
python (atproto SDK). each SDK calls its real consumer API — no synthetic
shortcuts. reports frames/sec and MB/s.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix Jacquard link (tangled.sh, not github). Add context for rsky
(Rudy Fraser / BlackSky) and Jacquard (@nonbinary.computer). Clarify
that rust-verify uses same low-level crates as rsky internally.
Explain Go's MST performance advantage (decode-once-and-cache).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
adds rust benchmarks using the same crate stack as blacksky's rsky-relay:
ciborium + serde_ipld_dagcbor + rs-car-sync (with CID verification) for
decode, RustCrypto k256/p256 for sig-verify. three-way comparison now
covers zig, rust, and go across both decode and signature verification.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
add signature verification benchmark infrastructure:
- zig: capture_sigs corpus builder, three-tier bench (full/crypto/preparsed)
- go: equivalent three-tier bench using dcrd/secp256k1
- justfile: capture-sigs, bench-sigs commands
update README: reframe as relay infrastructure benchmarks covering
both decode and verify. update sig-verify numbers (zig and go now
roughly even). add synthesis in "when this matters" section.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- go-raw: fxamacker/cbor + hand-rolled CAR parser (~41k fps, 3.5x faster
than indigo)
- zig bench: add decode+verify mode using zat v0.2.1's CID hash
verification (~311k fps with SHA-256 per block)
- README: split results into production-correct (with CID verification)
and decode-only tables. only zat and indigo verify CID hashes.
- add CID verification comparison table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- rust/python/go: decode_full never propagates errors — catches
frame-level failures and counts them, matching zig's pattern
- go: distinguish io.EOF from real errors in CAR block iteration
- blocks/frame precision bumped from .1 to .2 (9.98 not 10.0)
- README: disclose zat CBOR decoder used in capture filter,
acknowledge 30-40% run-to-run variance in methodology
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- capture.zig: replace zat.firehose.decodeFrame with minimal CBOR
header peek — removes SDK bias from corpus generation
- bench.zig: decode header → payload → CAR → every block (was only
decoding op-linked blocks)
- bench.py: count blocks from CAR.from_bytes() (libipld already
decodes them internally)
- main.go: track error counts instead of swallowing, count blocks
- main.rs: add block/error counting to existing full-block decode
- all SDKs: report blocks/frame, error count, variance (min/median/max)
- README: honest fairness notes, explain python > rust result
verified: all four SDKs report identical block counts on same corpus.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
capture ~10s of live firehose traffic into length-prefixed binary corpus,
then decode with zig (zat), rust (jacquard-style), go (indigo), and
python (atproto SDK). each SDK calls its real consumer API — no synthetic
shortcuts. reports frames/sec and MB/s.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>