agents/skills/injectable/l1/data-availability-enforcement/SKILL.md
L1 supplement - audits storage / data-availability chains (Arweave, Filecoin, Irys, Crust, Celestia, EigenDA) for unenforced data commitments: producer commits to data inclusion but the validator never verifies the data was actually published / gossiped / sampled.
npx skillsauth add plamentsv/plamen data-availability-enforcementInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
L1 trigger:
L1_PATTERN=trueAND protocol-type is one of: storage, data_availability, da_chain, da_layer, blob_storage. Detection: recon finds a "publish ledger", "data root", "blob commitment", "DA root", or "ingress proof" structure in the block header AND the protocol's economic model assumes miners store data. Inject Into:depth-consensus-invariant,depth-state-traceLanguage: Go and Rust Finding prefix:[DA-N]Status: v0.1 — derived from Run 7 Irys post-mortem
Data availability chains are L1s whose primary function is to commit to and serve user data, not just to settle transactions. Examples: Arweave (permanent storage), Filecoin (negotiated storage), Irys (DA + L2 settlement), Celestia (rollup blob DA), EigenDA. The trust model is fundamentally different from settlement L1s: validators must enforce that committed data is actually available, not just that the commitment is well-formed.
The single most common DA-chain bug class is: the block header carries a commitment to data X, the producer is paid for committing to X, but nothing in the protocol forces the producer to actually publish X. Honest miners assigned to store X cannot, get penalized, and the chain becomes unreliable.
Enumerate every block-header field that commits to data the protocol expects to be stored elsewhere:
For each, identify:
Write the inventory to scratchpad/da_commitment_inventory.md.
For EACH commitment in the inventory, the validator must enforce that the data is actually available. Three valid mechanisms:
If NONE of these mechanisms exists for a commitment → CRITICAL finding. The producer is paid for a commitment with no enforcement. Honest miners assigned to store the data can be poisoned.
Tag: [DA-COMMITMENT-NO-AVAILABILITY:{ledger-name}]
Whenever the DA flow relies on validate_path, verify_proof, validate_chunk,
or any Merkle-style helper, audit the verifier itself rather than trusting that
the caller used it correctly.
Questions:
&& and || used with the intended meaning?Tag: [DA-MERKLE-PROOF:{function}]
For each committed data root, trace the gossip handler that is expected to deliver the actual chunks to other peers. The validator side does NOT replace gossip — both must exist:
gossip_chunks_for_data_root)Tag: [DA-GOSSIP-NOT-ENFORCED:{handler-path}]
For each ledger / blob / chunk class whose availability depends on peer-side replication, write a row:
| Data class | Publisher | Required recipients | Gossip trigger | Validator check | Penalty on missing gossip | Evidence | |------------|-----------|---------------------|----------------|-----------------|---------------------------|----------|
Required enumeration:
[DA-GOSSIP-DUTY-UNENFORCED:{data-class}].For each peer that RECEIVES committed data (chunks, blobs, DA attestations) via gossip:
Tag: [DA-RELAY-NOT-ENFORCED:{handler-path}]
Many DA chains use a "challenge" mechanism: every block, the protocol requires the miner to prove they have a randomly-selected chunk of their assigned partition. This is the storage-proof economic primitive.
Check:
consensus-safety-invariants Section 1 + efficient-sampling patterns)Tag: [DA-PoA-PREDICTABLE:{rng-source}], [DA-PoA-VERIFIER-WEAK:{check}]
Once availability is enforced, the next question is: what happens when a miner fails the proof? Most DA chains plan slashing but ship without it.
Check:
Slash / RemoveStake / Penalize code path in the validator?Tag: [DA-SLASHING-MISSING]
[CONFORMANCE-PASS] (run a synthetic non-publishing producer and verify validators reject) > [LSP-TRACE] > [CODE-TRACE]Arweave early Wildfire reputation gaming — miners selectively responded to recall challenges they had pre-stored, refusing others. Reputation system was patched repeatedly. The lesson: any storage-proof verifier whose challenge can be predicted by the prover is exploitable.
Filecoin Window PoSt incentive misalignment — miners can defer submission of storage proofs to earn revenue without losing stake until the window closes. Filecoin patched the timing model multiple times.
Celestia / EigenDA DAS sample size selection — academic papers show that DA sampling parameters (K samples, M-of-N threshold) must be calibrated against the target Byzantine fraction; under-sampled DAS gives a false sense of availability.
Irys Run 7 post-mortem (this skill's origin) — Publish ledger commitments had NO validator-side enforcement that gossiped chunks reached the assigned partition holders. A producer could include a data_root and never broadcast; assigned miners received partitions they could not reconstruct.
consensus-safety-invariants (boundary conditions on recall range RNG), p2p-dos-and-eclipse (gossip-path enforcement)depth-consensus-invariant, depth-state-tracedocs/l1-mode/severity-matrix.mddevelopment
Prepare Solidity projects for a security audit — test coverage, test quality, NatSpec docs, code hygiene, dependency health, best-practice enforcement, deployment readiness, and project documentation checks. Generates a scored Audit Readiness Report and optionally runs static analysis. Trigger on: "prepare for audit", "audit readiness", "pre-audit check", "audit prep", "NatSpec check", or any request to review a Solidity codebase before a security review.
development
Launch the Plamen deterministic Web3 security audit pipeline
development
Run the Plamen smart-contract audit wizard in Codex
testing
Launch the Plamen deterministic L1 infrastructure audit pipeline