<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://blog.weids.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.weids.dev/" rel="alternate" type="text/html" /><updated>2026-04-24T20:52:00+00:00</updated><id>https://blog.weids.dev/feed.xml</id><title type="html">WeidS Lab</title><subtitle>Notes on verifiable computing, cryptography, and systems — from WeidS Lab.</subtitle><entry><title type="html">Wrappers — A Manifesto</title><link href="https://blog.weids.dev/2026/04/25/manifesto.html" rel="alternate" type="text/html" title="Wrappers — A Manifesto" /><published>2026-04-25T04:00:00+00:00</published><updated>2026-04-25T04:00:00+00:00</updated><id>https://blog.weids.dev/2026/04/25/manifesto</id><content type="html" xml:base="https://blog.weids.dev/2026/04/25/manifesto.html"><![CDATA[<p>Wrappers is a C++ library for verifiable computing.</p>

<p>The target is simple to state: a programmer writes a computation, marks a
value as traced, and runs the program natively on whatever hardware is at
hand — a laptop, a server, a phone. When the program finishes, its
output comes with a proof that the output follows from the inputs under
the program as written. Anyone with the source code can regenerate and
verify the proof on their own machine — no virtual machine to install,
no network to join, no cluster to trust.</p>

<p>What follows is an argument for why that target is worth aiming at now,
what the library is built on, and what the trust chain looks like in
practice.</p>

<h1 id="the-problem-with-teeth">The Problem, With Teeth</h1>

<p>Zero-knowledge proofs are becoming settlement infrastructure. Bridges,
rollups, cross-chain messaging, machine-learning attestation —
consequential flows are increasingly gated by proof systems. As this
happens, the question of <em>who can audit the code that decides these
flows</em>, and <em>who can generate and re-verify the proofs themselves</em>,
becomes a systemic one.</p>

<p>The failure mode of infrastructure at this scale is rarely cryptographic.
It is operational: the most centralized component in a nominally
decentralized system determines its security. The <a href="https://x.com/LayerZero_Core/status/2046081551574983137">KelpDAO incident of April
2026</a> is a concrete and recent instance. LayerZero’s DVN architecture
distributes message attestation across multiple independent validators,
each running its own infrastructure — yet those validators depended on
off-chain data sources that were not verified end-to-end by the
attestation layer itself. When that upstream data was polluted, the
decentralization of the validator set was irrelevant: every honest
validator signed the same poisoned input. Adding more validators, more
GPUs, or more independent RPC endpoints treats the symptom. The disease
is that the security of the system rests on data the application did not
itself verify.</p>

<p>This is precisely the shape of problem that application-level verifiable
computing is positioned to address. If a computation can be proven on any
commodity machine, there is no structural need for a validator cluster
at all — the application itself, or its user, can generate the proof
locally and post only the verifiable result on-chain. The cryptographic
proof replaces the social trust in a cluster of replicated computers
running the same computation. Every user with the source code can
recompute the proof on their own laptop, the same way any Ethereum full
node re-executes blocks to verify consensus. Responsibility for pinning
the inputs — RPC data, oracle feeds, signed messages — falls where
it actually belongs: on the application developer, who knows which
inputs are load-bearing and designs the program so that the user can
verify them without trusting the server.</p>

<p>zkVMs are a structural continuation of the cluster-scale pattern. Their
per-cycle overhead — several committed field elements per guest
instruction, layered on top of interpreter slowdown of one to three
orders of magnitude — pushes proof generation for any non-trivial
computation into datacenter territory, which reintroduces the
operator-concentration problem the proofs were meant to solve. Recent
work such as Jolt Pro improves constant factors but does not change the
shape. Projects like <a href="https://eprint.iacr.org/2025/2234">ZeroOS (Zou et al., 2025)</a> fix the ergonomics above
the zkVM boundary — unmodified toolchains, a modular library OS —
but do not shorten the chain beneath it. A proof system can only serve
as public infrastructure if ordinary participants can both inspect its
code and run it on their own machines.</p>

<h1 id="what-wrappers-is">What Wrappers Is</h1>

<p>Wrappers is a C++ library for verifiable computing, built on the family
of sum-check-based protocols. Its soundness derives from a single
classical observation: a low-degree polynomial, evaluated at a random
point in a sufficiently large finite field, cannot hide a disagreement
with the correct polynomial for long. From this observation alone, an
interactive proof can reduce a claim about a sum over an exponentially
large set to a single polynomial evaluation. The resulting proof system
is post-quantum secure — it uses no elliptic-curve assumption, no
trusted setup, and no structured reference string.</p>

<p>From the programmer’s perspective, the library is one type import and a
type annotation:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;wrappers&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">Traced</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
        <span class="n">sum</span> <span class="o">+=</span> <span class="n">i</span> <span class="o">*</span> <span class="n">i</span><span class="p">;</span>

    <span class="k">return</span> <span class="n">sum</span><span class="p">.</span><span class="n">value</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>When this program compiles and runs, it executes natively on whatever
hardware the user happens to be sitting at. Each operation on <code class="language-plaintext highlighter-rouge">sum</code> —
the initial assignment, each accumulation, each multiplication of the
loop index — is recorded into a trace. The trace is arithmetized into
a layered circuit and a proof is produced alongside the returned
value. Anyone with the source code and the claimed output can recompute
the proof on their own machine and verify that the result follows from
the program.</p>

<p>Three words carry the thesis.</p>

<p><em>Optional.</em> Proof is not an environment, a virtual machine, or a runtime
setting. It is a local property of specific values, entered by the act
of typing something as <code class="language-plaintext highlighter-rouge">Traced&lt;T&gt;</code>. A program may have one traced
variable, twenty, or none. Values typed as plain <code class="language-plaintext highlighter-rouge">int</code> are ordinary
native integers and do not participate in the proof. The programmer
draws the boundary by deciding which values deserve to be traced.</p>

<p><em>Application-level.</em> What is traced is the application’s own arithmetic
— the loop, the multiplications, the accumulation — not the
operating system’s syscalls, not the compiler’s lowered instructions,
not the CPU’s microarchitectural state. The proof attests that <code class="language-plaintext highlighter-rouge">sum</code>
equals the sum of the squared indices, as written in the source, not
that the CPU executed a particular sequence of RISC-V instructions. The
boundary is visible in the source code.</p>

<p><em>Executor-agnostic.</em> The program compiles and runs under any standard
C++ toolchain, on any machine. There is no zkVM to install, no
specialized validator cluster to join, no coordination protocol to
participate in. Once the source code is public, any observer — a user
auditing the result, a counterparty checking a settlement figure, a
researcher reproducing an experiment — can recompile and regenerate
the proof on their own laptop, in the same way an Ethereum full node
re-executes blocks locally to verify consensus. The machine that
produced the proof can be compromised, misconfigured, or adversarial;
if the proof verifies, the output is correct.</p>

<h1 id="the-threat-model-inversion">The Threat-Model Inversion</h1>

<p>The difference between Wrappers and the zkVM approach is not which
protocol is used. Both ultimately rest on sum-check. The difference is
what the proof is <em>about</em>.</p>

<p>A zkVM proof states: “this RISC-V execution trace is the correct
evaluation of this program, given these prover-supplied inputs and
syscall returns.” The proof is about the machine’s behavior.</p>

<p>A Wrappers proof states: “this function, given these inputs, produces
this output.” The proof is about the function. Everything that is not
the function — the machine, the OS, the executor’s environment — is
moved outside the boundary and marked as such in source.</p>

<p>This inversion is cleaner in two ways.</p>

<p>It is <em>honest</em> about input provenance. A zkVM cannot prove that a
<code class="language-plaintext highlighter-rouge">getrandom</code> syscall returned a value drawn from a true RNG, that a file
descriptor returned the real contents of a file, or that a network read
returned a genuine response from the claimed peer. Those return values
come from the real host and are, at the proof-system layer, chosen by
the prover. Every production zkVM deployment therefore relies on
application-level pinning — public inputs, Merkle commitments, signed
oracle feeds — to make its proofs meaningful. Wrappers requires the
same pinning, but <em>visibly</em>, at the source line where the traced value
is constructed, where the programmer is forced to decide how each input
is attested.</p>

<p>It is <em>shorter</em> in trust. The verifier must trust their own verification
code, the cryptographic assumption underlying the chosen backend, and
the library’s implementation of the protocol. That is the trusted
computing base. It fits in a single directory of C++ headers and —
crucially — fits in the head of an individual reader.</p>

<h1 id="the-thompson-lineage">The Thompson Lineage</h1>

<p>Forty-two years ago, Ken Thompson’s <a href="https://dl.acm.org/doi/10.1145/358198.358210">Turing Award lecture</a> brought the
elephant in the room to the table: trust is chained, and the chain can
never be fully escaped. The compiler that compiled your compiler may
contain a backdoor that no amount of source-level auditing will find.
The moral was not despair. It was that trust must bottom out somewhere,
and the shorter and more inspectable the chain, the better the position
one is in.</p>

<p>The elephant is in the proof-system room too. A zkVM proof rests on a
stack of trust that includes the zkVM implementation, its patched
standard library, its arithmetized kernel, the toolchain that produced
the guest binary, and the host environment that supplied
non-deterministic inputs. If any single link in that chain is
compromised, the proof is rendered meaningless, regardless of how
rigorous the cryptography is above it. This is not a bug in any
particular zkVM; it is a structural consequence of building a proof
system that tries to cover an execution environment as deep as an
operating system.</p>

<p>Wrappers does not claim to resolve this fundamentally. No proof system
can. What it does is move the security model to a layer where <em>more
people can meaningfully participate in the auditing</em>. The global
community working on zkVM internals is small — comparable in size to
the teams building production compilers, if that. The community of
application developers writing C++, Rust, Python, and JavaScript is
many orders of magnitude larger. When the proof boundary is drawn in
application code, the people best positioned to read, review, modify,
and extend it are the ones already writing that code. That is a
different axis of decentralization than the one offered by distributed
provers: it is the decentralization of <em>who can inspect the work</em>.</p>]]></content><author><name>A. Wang</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">GKR Explained: From Cubes to Curves</title><link href="https://blog.weids.dev/2025/10/21/gkr.html" rel="alternate" type="text/html" title="GKR Explained: From Cubes to Curves" /><published>2025-10-21T00:00:00+00:00</published><updated>2025-10-21T00:00:00+00:00</updated><id>https://blog.weids.dev/2025/10/21/gkr</id><content type="html" xml:base="https://blog.weids.dev/2025/10/21/gkr.html"><![CDATA[<p>This is a reference entry pointing to the GKR tutorial hosted at
<a href="https://org.weids.dev/agenda/notes/gkr-sum-check-tutorial.html">org.weids.dev</a>.</p>]]></content><author><name>A. Wang</name></author><summary type="html"><![CDATA[Soundness via Sum-Check, Folding, and Multilinear Extensions.]]></summary></entry><entry><title type="html">A Survey of Interactive Verifiable Computing</title><link href="https://blog.weids.dev/2025/01/09/survey.html" rel="alternate" type="text/html" title="A Survey of Interactive Verifiable Computing" /><published>2025-01-09T00:00:00+00:00</published><updated>2025-01-09T00:00:00+00:00</updated><id>https://blog.weids.dev/2025/01/09/survey</id><content type="html" xml:base="https://blog.weids.dev/2025/01/09/survey.html"><![CDATA[<p>This is a reference entry pointing to the IACR ePrint paper at
<a href="https://ia.cr/2025/008">ia.cr/2025/008</a>.</p>]]></content><author><name>A. Wang</name></author><summary type="html"><![CDATA[Utilizing Randomness in Low-Degree Polynomials.]]></summary></entry></feed>