Repository navigation
Commit fe7d2cb
committed
fix(node): address reviewer findings on #26 split 2/4 (transport)
- P1 (DB lookup): get_arweave_anchor_by_item_id now filters on
irys_tx_id (the externally-routable item id) rather than the
internal UUID primary key. The production writer stores a fresh
UUID in `id` and the Irys response / ANS-104 derived id in
`irys_tx_id`; the old filter would always 404. New
integration tests exercise the production writer path with
distinct values for the two columns.
- P1 (verify-gate): verify_anchor now gates on repo read via
authorize_repo_read. The route is split in server.rs: the
public list_anchors stays ungated (#134 tracks that surface),
the verify route gets optional_signature per the team memory
`axum-layer-vs-merge-pitfall.md`. Denials on row-lookup, gate,
and missing repo all collapse to the same opaque 404 so the
public endpoint does not leak anchor-row existence.
- P1 (ANS-104 deep-hash): rewritten to the verified SHA-384
recursive list/blob algorithm (matches `arbundles` JS
reference). deep_hash returns [u8; 48]; signature is over the
raw 48-byte digest. Three reference vectors from
`Irys-xyz/arbundles/src/__tests__/deepHash.spec.ts` are
bit-exact-asserted as the interop canary per the team memory
`self-roundtrip-tests-do-not-prove-interop.md`.
- P1 (artifact-identity): v2 verify now derives the protocol id
via DataItem::id() (base64url(SHA256(signature))) and requires
equality with the requested URL item_id. A node key signs
many data items, so a valid signature only proves who signed
the response — not that the served item is the one the caller
asked to verify. The team memory
`verify-against-artifact-id-not-signer.md` is the policy.
- P1 (verifier can't read this head's writes): verify_anchor
now accepts BOTH the v2 ANS-104 format and the v1 raw-JSON
shape the live path on this branch actually writes. The v1
path does a field-equality check on repo, ref_name, old_sha,
new_sha, node_did against the persisted row (no signature in
v1; Irys storage plus the JSON parse are the integrity
guarantee).
- P2 (ProbeOutcome in result): AnchorVerifyResult now carries
outcome: ProbeOutcome. The HTTP handler maps the structured
field to the status string instead of parsing the human-
readable error message — any future wording change in
arweave_v2.rs can no longer silently reclassify a
DefinitivelyAbsent as Indeterminate.
- P2 (empty 404 body): classify_404 returns Indeterminate for
bodyless 404s. The team memory
`distinguish-unknown-from-empty.md` is the policy: a
bodyless 404 from a proxy is not a proof of absence, and the
recovery policy (permits_reupload -> true on
DefinitivelyAbsent) authorizes a paid, irreversible re-upload.
- P2 (streaming cap): read_capped_body no longer uses
resp.bytes() (which buffers the full response before checking
size). It now reads chunk-by-chunk and aborts the moment the
cumulative byte count crosses the cap, so a chunked response
without Content-Length cannot force unbounded allocation.1 parent a53a63a commit fe7d2cb
5 files changed
Lines changed: 1339 additions & 197 deletions
0 commit comments