<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Ivan Anishchuk, EPF</title>
    <link>https://ivananishchuk.github.io/eth-protocol-fellowship/updates/</link>
    <description>Ivan Anishchuk's Ethereum Protocol Fellowship cohort-seven dev updates and project notes.</description>
    <atom:link href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/feed.xml" rel="self"/>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>zensical-updates</generator>
    <language>en</language>
    <lastBuildDate>Mon, 03 Aug 2026 00:00:00 +0000</lastBuildDate>
    <item>
      <title>EPF Week 6 - Ivan Anishchuk - the merkle-branch completeness proof goes upstream</title>
      <link>https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-08-03-week-6/</link>
      <description>Short version:</description>
      <content:encoded><![CDATA[<p>Short version:</p>
<ul>
<li>The merkle-branch completeness proof went upstream as
  <a href="https://github.com/etheorem/etheorem/pull/42">#42</a>, the first consensus-layer proof off
  the roadmap.</li>
<li>It's the bottom of a three-branch stack. Layer 2 (generalized index) goes up next, layer
  3 (<code>hash_tree_root</code> agreement) is held behind a spec divergence I filed as
  <a href="https://github.com/etheorem/etheorem/issues/40">#40</a>.</li>
<li>Co-presented the proposal with Raj on 29 July. Video and slides linked below. The
  proposal itself is merged into the cohort repo.</li>
<li>Side quest: packaged <code>jitsi-meet-desktop</code> as an ebuild and presented on it. Guest mode
  only so far.</li>
</ul>
<h2 id="the-proof-went-up">The proof went up<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-08-03-week-6/#the-proof-went-up" title="Permanent link">¶</a></h2>
<p><a href="https://github.com/etheorem/etheorem/pull/42">#42</a> is the result I've been promising
since week 4: <code>is_valid_merkle_branch</code> accepts every honest opening of an openable tree,
machine-checked. That's the check <code>processDeposit</code> runs against <code>eth1Data.depositRoot</code>, so
the deposit path is covered directly. Eighteen files. Most of that is the tree and path
vocabulary the statement quantifies over, not the theorem itself.</p>
<p>Fixed a divergence from the spec while I was in there. <code>merkleBranchRoot</code> now takes
<code>depth ≤ branch.size</code>, so a short branch can't fold in <code>Inhabited</code> defaults where
upstream's <code>compute_merkle_branch_root</code> raises <code>IndexError</code>. External signature unchanged,
<code>processDeposit</code> needed no edit.</p>
<p>Trust footprint: <code>propext</code>, <code>Classical.choice</code>, <code>Quot.sound</code>, nothing else. The
<code>Sha256Spec</code> corollaries add <code>sha256Combine_eq_spec</code>, the one named FFI-equals-spec
bridge. No <code>sorry</code> anywhere.</p>
<h2 id="the-stack-behind-it">The stack behind it<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-08-03-week-6/#the-stack-behind-it" title="Permanent link">¶</a></h2>
<p><a href="https://github.com/etheorem/etheorem/pull/42">#42</a> is the bottom of three stacked
branches, roadmap items A4, A9 and A5, against the
roadmap in <a href="https://github.com/etheorem/etheorem/pull/35">#35</a>. Layer 2 models
<code>get_generalized_index</code> and proves it names the position <code>Node.ofShape</code> actually puts a
container field at, which reaches the data-column sidecar inclusion proof,
<code>FINALIZED_ROOT_GINDEX</code>, <code>EXECUTION_BLOCK_HASH_GINDEX</code> and both sync-committee gindices.
Layer 3 proves <code>hash_tree_root</code> equals the root of the cached <code>Node</code> tree.</p>
<p>The value is back-loaded. Layers 1 and 2 are stated over <code>Node.merkleRoot</code>, our own
construction, not Ethereum's <code>hash_tree_root</code>, so neither says anything about spec
behaviour until layer 3 bridges them.</p>
<p>Layer 3 is held, blocked on <a href="https://github.com/etheorem/etheorem/issues/40">#40</a>: our
zero-hash table stops at 65 entries where the pyspec builds 100, and clamps out of range
where the spec raises. That divergence is why layer 3's headline theorem carries a
<code>depth ≤ 64</code> side condition. Fixing the table removes the side condition and rewrites
layer 3's central argument, so it has to land first.</p>
<p>Completeness only, throughout. The check accepts every honest opening, which rules out
rejecting valid data, the failure mode that forks a light client off its peers. Binding,
that a forged branch gets rejected, has no sound statement under a real 64-to-32
<code>combine</code>. It squeezes sixty-four bytes into thirty-two, so colliding branches exist by
pigeonhole, and what's left is a hardness assumption rather than something you prove.</p>
<h2 id="proposal-presented-and-merged">Proposal presented and merged<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-08-03-week-6/#proposal-presented-and-merged" title="Permanent link">¶</a></h2>
<p>Raj and I co-presented the proposal on 29 July, in
<a href="https://www.youtube.com/watch?v=egjhzvLGlus&amp;t=4743s">EPF7 Project Presentations 3</a> (our
segment starts at 1:19:03), and here is the
<a href="https://ivananishchuk.github.io/eth-protocol-fellowship/slides/etheorem-proposal-deck.pdf">proposal deck</a>.</p>
<p>The proposal is merged into the cohort repo as
<a href="https://github.com/eth-protocol-fellows/cohort-seven/blob/main/projects/etheorem-consensus-proofs-lean4.md"><code>projects/etheorem-consensus-proofs-lean4.md</code></a>.</p>
<h2 id="aside-jitsi-meet-desktop">Aside: jitsi-meet-desktop<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-08-03-week-6/#aside-jitsi-meet-desktop" title="Permanent link">¶</a></h2>
<p>Unrelated to the proofs. I packaged <code>jitsi-meet-desktop</code> as an ebuild in my overlay,
<a href="https://github.com/congentoo/localrepo/blob/main/net-im/jitsi-meet-desktop/jitsi-meet-desktop-2026.7.0.ebuild"><code>net-im/jitsi-meet-desktop-2026.7.0</code></a>,
and gave the presentation above on it. Worked well, screen share included.</p>
<p>It joins OIDC-gated rooms as a guest, which is what got me through the call. Non-guest
mode is another matter. It doesn't look like the desktop client supports authentication
the way the Ethereum server does it, so that needs more investigation before it's usable
as a properly logged-in client.</p>
<p>Next: get #42 through review, put layer 2 up behind it, and fix the zero-hash table so
layer 3 can move.</p>
<h2 id="resources">Resources<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-08-03-week-6/#resources" title="Permanent link">¶</a></h2>
<ul>
<li>etheorem: <a href="https://github.com/etheorem/etheorem">https://github.com/etheorem/etheorem</a></li>
<li>The merkle-branch completeness PR: <a href="https://github.com/etheorem/etheorem/pull/42">https://github.com/etheorem/etheorem/pull/42</a></li>
<li>The zero-hash table divergence: <a href="https://github.com/etheorem/etheorem/issues/40">https://github.com/etheorem/etheorem/issues/40</a></li>
<li>The verification roadmap: <a href="https://github.com/etheorem/etheorem/pull/35">https://github.com/etheorem/etheorem/pull/35</a></li>
<li>Proposal presentation (29 July 2026):
  <a href="https://www.youtube.com/watch?v=egjhzvLGlus&amp;t=4743s">https://www.youtube.com/watch?v=egjhzvLGlus&amp;t=4743s</a></li>
<li>Proposal deck (PDF): <a href="https://ivananishchuk.github.io/eth-protocol-fellowship/slides/etheorem-proposal-deck.pdf">../slides/etheorem-proposal-deck.pdf</a></li>
<li>The proposal:
  <a href="https://github.com/eth-protocol-fellows/cohort-seven/blob/main/projects/etheorem-consensus-proofs-lean4.md">https://github.com/eth-protocol-fellows/cohort-seven/blob/main/projects/etheorem-consensus-proofs-lean4.md</a></li>
<li>jitsi-meet-desktop ebuild:
  <a href="https://github.com/congentoo/localrepo/blob/main/net-im/jitsi-meet-desktop/jitsi-meet-desktop-2026.7.0.ebuild">https://github.com/congentoo/localrepo/blob/main/net-im/jitsi-meet-desktop/jitsi-meet-desktop-2026.7.0.ebuild</a></li>
</ul>]]></content:encoded>
      <guid isPermaLink="true">https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-08-03-week-6/</guid>
      <pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>EPF Week 5 - Ivan Anishchuk - a joint proposal with Raj and the verification roadmap upstream</title>
      <link>https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-07-27-week-5/</link>
      <description>Short version:</description>
      <content:encoded><![CDATA[<p>Short version:</p>
<ul>
<li>The verification roadmap went upstream as a PR
  (<a href="https://github.com/etheorem/etheorem/pull/35">#35</a>), twenty proof targets across four
  tiers.</li>
<li>Raj Gill (<a href="https://github.com/irajgill">@irajgill</a>) and I wrote a joint proposal, split
  by layer. He takes SSZ, I take the consensus layer above it.</li>
<li>Three of my PRs are sitting open upstream: the roadmap, the fork-choice
  throw-faithfulness sweep (<a href="https://github.com/etheorem/etheorem/pull/22">#22</a>), and the
  Heze fork layer (<a href="https://github.com/etheorem/etheorem/pull/6">#6</a>) still going through
  review.</li>
</ul>
<p>The proposal took most of the week. Raj and I worked on it together and wrote it as one
project with two lanes, split by layer. His lane is finishing the three central
serialization theorems until they hold for every type the codec actually implements. Mine
is everything above SSZ, the arithmetic and structural invariants, merkleization, the
shuffle, fork choice, plus keeping conformance green as the forks move and the roadmap
both lanes work from. Splitting by layer rather than by ticket keeps us in different
packages.</p>
<p>Where the SSZ side stands: the mixed-field container arm is in review
(<a href="https://github.com/etheorem/etheorem/pull/28">#28</a>,
<a href="https://github.com/etheorem/etheorem/pull/29">#29</a>). It's the hardest one and the shape
<code>BeaconState</code> itself takes, since the decoder has to recover field boundaries from the
offset table the encoder wrote. One arm sits behind it, <code>vector</code> and <code>list</code> over
variable-size elements, same offset machinery element-wise, scheduled for August. After
that the three theorems cover everything the codec implements.</p>
<p>The roadmap PR is up. Twenty targets, four tiers, each pinned to a function and an
acceptance criterion, with prior-art tags for what the Dafny and Runtime Verification work
covered.</p>
<p>The other two open PRs are older business. #22 is the throw-faithfulness sweep from the
week-3 review, converting the fork-choice helpers that can throw in the Python spec into
Lean versions that can also fail instead of quietly returning something. #6 is the Heze
fork layer, still in review, still the piece the FOCIL inclusion-list proof target sits on.
Neither is dramatic, both need to land before the proof work above them means much.</p>
<p>The presentation deck for the proposal is built too.</p>
<p>Next: submit the proposal to the cohort repo, present it, and start on the overflow-safety
and slot/epoch invariants while the container arms land underneath.</p>
<h2 id="resources">Resources<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-07-27-week-5/#resources" title="Permanent link">¶</a></h2>
<ul>
<li>etheorem: <a href="https://github.com/etheorem/etheorem">https://github.com/etheorem/etheorem</a></li>
<li>The verification roadmap PR: <a href="https://github.com/etheorem/etheorem/pull/35">https://github.com/etheorem/etheorem/pull/35</a></li>
<li>The throw-faithfulness sweep: <a href="https://github.com/etheorem/etheorem/pull/22">https://github.com/etheorem/etheorem/pull/22</a></li>
<li>The Heze FOCIL fork layer: <a href="https://github.com/etheorem/etheorem/pull/6">https://github.com/etheorem/etheorem/pull/6</a></li>
<li>Raj's mixed-field container arms:
  <a href="https://github.com/etheorem/etheorem/pull/28">https://github.com/etheorem/etheorem/pull/28</a> and
  <a href="https://github.com/etheorem/etheorem/pull/29">https://github.com/etheorem/etheorem/pull/29</a></li>
</ul>]]></content:encoded>
      <guid isPermaLink="true">https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-07-27-week-5/</guid>
      <pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>EPF Week 2 - Ivan Anishchuk - expanding etheorem with Heze/FOCIL and cross-client conformance harness experimentation</title>
      <link>https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-07-03-week-2/</link>
      <description>Week 2 I shifted off the Charon+Aeneas extraction experiments and onto etheorem's conformance layer, the Lean 4 spec-container models that get checked against the official test vectors. That work landed:</description>
      <content:encoded><![CDATA[<p>Week 2 I shifted off the Charon+Aeneas extraction experiments and onto etheorem's
conformance layer, the Lean 4 spec-container models that get checked against the official
test vectors. That work landed:</p>
<ul>
<li>Two PRs merged, the consensus-specs re-pin to v1.7.0-alpha.11 with the new EIP-8282
  builder containers (<a href="https://github.com/etheorem/etheorem/pull/5">#5</a>) plus a small
  cross-distro build fix (<a href="https://github.com/etheorem/etheorem/pull/4">#4</a>). My first
  merged PRs there.</li>
<li>The big one is the Heze fork layer (FOCIL, EIP-7805), published as
  <a href="https://github.com/etheorem/etheorem/pull/6">#6</a> and now up for review. ~2.2k lines
  across 36 files; the spec delta over Gloas at this pin is compact (the inclusion-list
  containers plus the FOCIL fork-choice machinery), so most of the work was the fork-choice
  layer and keeping everything conformance-green (6770 passed / 0 failed on minimal,
  997 / 0 on mainnet). One catch: alpha.11 ships no vectors that actually drive FOCIL
  behavior, so I pinned the vectorless fork-choice code with build-enforced <code>#guard</code>
  examples worked out by hand.</li>
</ul>
<p>The other half of the week was research. How do we use etheorem to verify actual clients,
starting with moonglass? Two candidate shapes. Differential testing (fuzzing-flavored),
where you run both implementations over the same inputs and diff the verdicts, cheap and
wide. Or proving by extraction, pulling the Rust through Charon/Aeneas into Lean and
proving it equivalent to etheorem's definitions. Slower, way more painful, but you end up
with an actual theorem. I settled on a 50/50 balance, the differential harness for breadth
plus extraction proofs for the small pure kernels where a real theorem is within reach.
(The extraction side already has an anchor from the week-1 experiments: the machine-checked
proof that the extracted Rust u64 SSZ encoder is byte-equal to etheorem's now checks
against SizzLean's actual definition instead of a pinned copy.)</p>
<p>In practice that meant fixing a few minor toolchain issues (the usual yaks) and getting an
initial harness/runner implementation going. It drives etheorem and moonglass side by side
over the official vectors and compares the two verdict streams, a real cross-implementation
diff rather than each checked against the fixtures alone. On everything both currently
cover (the gloas operations family) it finds zero divergences, which is the boring kind of
result you actually want. The coverage edge is the runner's scope, not the harness's. The
code is public now, <a href="https://github.com/IvanAnishchuk/consensus-diff">consensus-diff</a> (the
harness) and <a href="https://github.com/IvanAnishchuk/moonglass-runner">moonglass-runner</a> (the
moonglass-side adapter). They're deliberately two repos, for a stupid copywrongs reason
(the runner links moonglass's AGPL core so it has to be AGPL itself; the harness only talks
to backends over a subprocess wire protocol, carries no moonglass code, and stays
tri-licensed CC0/Apache/WTFPL). And the runner might hopefully get upstreamed into
moonglass itself eventually anyway.</p>
<p>Next: handle whatever review lands on #6, then widen the moonglass runner past operations
so the differential covers more of the suite. After that probably mutation-fuzzing inputs
with etheorem as the oracle. I still need to shape what I'm doing into a more specific and
presentable project proposal, too. To be continued.</p>
<h2 id="resources">Resources<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-07-03-week-2/#resources" title="Permanent link">¶</a></h2>
<ul>
<li>The Heze FOCIL PR: <a href="https://github.com/etheorem/etheorem/pull/6">https://github.com/etheorem/etheorem/pull/6</a></li>
<li>etheorem: <a href="https://github.com/etheorem/etheorem">https://github.com/etheorem/etheorem</a></li>
<li>moonglass (the Rust client in the cross-check): <a href="https://github.com/brech1/moonglass">https://github.com/brech1/moonglass</a></li>
<li>consensus-diff (the differential harness): <a href="https://github.com/IvanAnishchuk/consensus-diff">https://github.com/IvanAnishchuk/consensus-diff</a></li>
<li>moonglass-runner (the moonglass adapter): <a href="https://github.com/IvanAnishchuk/moonglass-runner">https://github.com/IvanAnishchuk/moonglass-runner</a></li>
<li>EIP-7805 (FOCIL): <a href="https://eips.ethereum.org/EIPS/eip-7805">https://eips.ethereum.org/EIPS/eip-7805</a></li>
<li>EIP-8282 (Builder Execution Requests): <a href="https://eips.ethereum.org/EIPS/eip-8282">https://eips.ethereum.org/EIPS/eip-8282</a></li>
</ul>]]></content:encoded>
      <guid isPermaLink="true">https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-07-03-week-2/</guid>
      <pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>EPF Week 1 - Ivan Anishchuk - Rust to Lean, first proofs</title>
      <link>https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-22-week-1/</link>
      <description>Week 1, still scoping. I leaned harder into the formal-verification side, and most of the time went into one question: can you take Rust code, generate Lean 4 out of it automatically, and then prove the generated Lean matches a reference model (or, where there isn't one, just holds the property I'm after)? None of this is worth submitting anywhere yet, it's all still exploration, but it's holding together so far.</description>
      <content:encoded><![CDATA[<p>Week 1, still scoping. I leaned harder into the formal-verification side, and most of the time went
into one question: can you take Rust code, generate Lean 4 out of it
automatically, and then prove the generated Lean matches a reference model (or, where there isn't one,
just holds the property I'm after)? None of this is worth submitting anywhere yet, it's all still
exploration, but it's holding together so far.</p>
<p>The engine that does the Rust→Lean step is Charon+Aeneas. I got it set up with the stable Lean release
(v4.29.1, after fighting some typical dependency hell a little) and spent the week playing with the stack,
extracting Rust code and proving what came out.</p>
<p>On moonglass (experimental CL client) I worked up a handful of small slices. Cheapest
first, and not even a proof: I fed moonglass's gloas test fixtures through etheorem's SSZ runner with no
transpiler at all, just to see whether two independent implementations agree on the hashes, and they
did, 5 out of 5 on what I tried. Then the extracted-and-proved slices, each one machine-checked and
sorry-free (the Lean kernel actually checks them, no holes): the integer primitives, the u64 SSZ
round-trip (Rust SSZ library encoder coming out byte-for-byte equal to etheorem's), the balance and slashing
arithmetic, the attester-slashing latch, and LMD-GHOST head pick.</p>
<p>On leanVM (zkVM from the lean-Ethereum effort, its arithmetic running over a small
prime field called KoalaBear) I was mostly exercising the tooling on something other than consensus. I got
its arithmetic core to extract and proved it matches MeanVM (my partial, tool-generated model of
leanVM), at least for add, subtract and multiply: those I grounded fully against the extracted
low-level arithmetic, no field axiom assumed. The inverse I left on one clearly-labeled assumption,
rather than pretend it comes for free.</p>
<p>What I learned... The low-level field arithmetic extracts transparently and
proves with no trust assumptions at all, which is honestly great; the higher-level wiring (Rust traits)
is where the extractor still kinda struggles. So the move is to prove at the level I can actually
back up, instead of forcing the whole thing. The differential cross-check was the cheapest
piece and maybe the highest-value, which surprised me a bit (no extraction needed, and it'd flag any
divergence between the two).</p>
<p>Caveats/blockers. I hit two toolchain limitations on the full leanVM extraction that I'm holding as
candidate/unconfirmed for now, could be real bugs, could be me holding it wrong tbh, I need to properly
sit down and review before I know next steps. And a couple of the slices currently lean on a small faithful
stand-in for a private upstream function, so those want a drift-check against source before I'd trust
them long-term.</p>
<p>Next is grinding down that inverse assumption, chasing those two questions upstream, and
probably checking in with the projects' devs for pointers. Exploration goes on, stay tuned.</p>
<h2 id="resources">Resources<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-22-week-1/#resources" title="Permanent link">¶</a></h2>
<ul>
<li>moonglass (Rust consensus client): <a href="https://github.com/brech1/moonglass">https://github.com/brech1/moonglass</a></li>
<li>etheorem (Lean 4 SSZ + the conformance runner): <a href="https://github.com/etheorem/etheorem">https://github.com/etheorem/etheorem</a></li>
<li>leanVM (zkVM): <a href="https://github.com/leanEthereum/leanVM">https://github.com/leanEthereum/leanVM</a></li>
<li>Charon: <a href="https://github.com/AeneasVerif/charon">https://github.com/AeneasVerif/charon</a> · Aeneas: <a href="https://github.com/AeneasVerif/aeneas">https://github.com/AeneasVerif/aeneas</a></li>
<li>consensus-specs (gloas <code>ssz_static</code> vectors): <a href="https://github.com/ethereum/consensus-specs">https://github.com/ethereum/consensus-specs</a></li>
</ul>]]></content:encoded>
      <guid isPermaLink="true">https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-22-week-1/</guid>
      <pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>EPF Week 0 - Ivan Anishchuk - Getting Started</title>
      <link>https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-17-week-0/</link>
      <description>I'm Ivan ([@IvanAnishchuk](https://github.com/IvanAnishchuk)), a backend engineer by trade, about fifteen years of it, mostly Python, mostly in web2 and some early AI before it was cool, the last few in applied cryptography and ZK. The one constant under all of it is math: I did discrete math and probability at university (although never graduated, I'm actually also currently catching up on academic things in parallel) and my first actual research was in abstract algebra (finite function algebras, k-valued logic, the sort of thing nobody asks you about at parties). That's probably most of why formal methods keep pulling me back. I came into cohort 7 drawn to the consensus layer but without a project picked, so Week 0 was mostly scoping.</description>
      <content:encoded><![CDATA[<p>I'm Ivan (<a href="https://github.com/IvanAnishchuk">@IvanAnishchuk</a>), a backend engineer by trade, about
fifteen years of it, mostly Python, mostly in web2 and some early AI before it was cool, the last
few in applied cryptography and ZK. The one constant under all of it is math: I did discrete math
and probability at university (although never graduated, I'm actually also currently catching up
on academic things in parallel) and my first actual research was in abstract algebra (finite
function algebras, k-valued logic, the sort of thing nobody asks you about at parties). That's
probably most of why formal methods keep pulling me back. I came into cohort 7 drawn to the consensus
layer but without a project picked, so Week 0 was mostly scoping.</p>
<h2 id="a-bit-of-background">A bit of background<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-17-week-0/#a-bit-of-background" title="Permanent link">¶</a></h2>
<p>No core-client work yet, I'll be honest. The closest thing I've built is
ETH Consensus Neotrace, which started as a
consensus-spec study at Invisible Garden and turned into a tool that generates cross-client test
vectors by tracing the spec (the <a href="https://github.com/ethereum/consensus-specs/pull/4755">upstream spec PR</a> out of it got closed unmerged, so I file it under
"study" rather than "contribution"). Before being accepted to EPF I mostly dabbled in applied crypto:
<a href="https://github.com/IvanAnishchuk/NozKash">NoZKash</a>, privacy eCash on the EVM with no zk-SNARKs (just
BLS blind signatures over the EIP-2537 precompiles), plus some zkML research, a little bit of
decentralized AI development and a few smaller things in other ecosystems.</p>
<h2 id="what-i-did-this-week">What I did this week<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-17-week-0/#what-i-did-this-week" title="Permanent link">¶</a></h2>
<p>Got oriented and scoped. I read wide first, the study-group tracks (Lean/zkEVM, cryptography,
protocol fundamentals) and the kickoff, then went through the cohort project board and open
issues from client teams to see what's actually being asked for, beyond what I happen to find interesting.</p>
<p>Surveyed the formal-verification work, since that's the part I keep coming back to. I mapped what
already exists on the consensus layer: ConsenSys's Dafny effort (archived now), pieces from Runtime
Verification, the etheorem project in Lean 4, and the EF consensus team's model-checking work
(<a href="https://arxiv.org/abs/2501.07958">arXiv:2501.07958</a>). etheorem is the one I went deepest on. It
formalizes SSZ, Ethereum's serialization and Merkleization layer, and already proves the core encoding
properties for the simpler cases, with the harder ones still open. I also kept half an eye on the
recent lean-Ethereum interop devnets, where serialization bugs keep turning up
(<a href="https://github.com/leanEthereum/leanSpec/pull/327">leanSpec #327</a>,
<a href="https://github.com/blockblaz/zeam/issues/942">zeam #942</a>).</p>
<p>Got hands-on with etheorem. On top of an overall review of the repo, I got it building on its pinned toolchain
(Lean v4.29.1, Lake) and ran the conformance suite for a clean baseline, then did a tool-assisted
audit I drove myself: 24 findings awaiting triage, 4 high-severity across three root causes (subgroup
checks in the BLS code, deserializer offset validation, and an out-of-bounds path in the Merkle cache),
plus a fork that's implemented but not yet wired into conformance. Enough to feel the shape of the
codebase, and what actually picking it up would involve. Yeah, I did some catching up on Lean4 too in
the weeks leading to this.</p>
<h2 id="areas-tools-and-whats-next">Areas, tools, and what's next<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-17-week-0/#areas-tools-and-whats-next" title="Permanent link">¶</a></h2>
<p>What I'm drawn to, and happy to be pointed at: formal verification and the consensus layer most of
all, but plain implementation and tooling too. I work mostly in Python (my strongest) and Rust, with
the applied-crypto and ZK background sitting underneath. Over the next couple of weeks I'll keep
surveying (open issues, the project ideas the teams have posted, the formal-methods efforts, and what
proposing my own would actually take, etheorem being the one I've gone deepest on), then commit to one.
It might end up a proof-heavy project, a hands-on implementation task, plain bug-fixing, or my own
proposal; I'd rather make that call with the survey done than guess at it now. Either way: small and
concrete to start. We'll see.</p>
<h2 id="resources">Resources<a class="headerlink" href="https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-17-week-0/#resources" title="Permanent link">¶</a></h2>
<ul>
<li><a href="https://github.com/etheorem/etheorem">etheorem</a> (the Lean 4 SSZ formalization, the one I went
  deepest on this week)</li>
<li><a href="https://github.com/ethereum/consensus-specs/blob/master/ssz/simple-serialize.md">SSZ spec</a> and the
  <a href="https://github.com/ethereum/consensus-spec-tests">consensus-spec-tests</a></li>
<li>ConsenSys <code>eth2.0-dafny</code>;
  <a href="https://github.com/leonardoalt/ethereum_formal_verification_overview">Leonardo Alt's FV overview</a>;
  <a href="https://arxiv.org/abs/2501.07958">EF consensus-spec model-checking</a></li>
<li><a href="https://epf.wiki">epf.wiki</a>: <code>CL/SSZ</code>, <code>CL/merkleization</code>, <code>testing/formal-verification</code></li>
</ul>]]></content:encoded>
      <guid isPermaLink="true">https://ivananishchuk.github.io/eth-protocol-fellowship/updates/2026-06-17-week-0/</guid>
      <pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>
