Skip to content

📁 Historical document — archived 2026-06-12 during the post-0.7.0 documentation audit. Point-in-time record kept for reference; not maintained and may not reflect the current implementation.

Low-Hanging Fruit Analysis: Remaining Test Failures

Quick Assessment of Remaining Categories

After implementing the fix for Category 1 (State Sync Timeouts - 28 tests), the following categories remain:

Category Summary

Category Tests Time to Fail Complexity Quick Fix?
MESS Consensus 3 < 250ms Medium ⚠️ Maybe
VM Data Decoding 1 83ms Low ✅ YES
Sync State Undefined 3 6-7s Low-Medium ✅ Likely fixed by Cat 1
Fork Validation 1 1.3s Low ✅ Likely fixed by Cat 1
Handshake Timeouts 2 7-9s Low ✅ Likely fixed by Cat 1

Test: VMTestsSpec: should load and parse a sample VM arithmetic test
Time to Fail: 83ms (quick assertion failure)
Priority: P2 (Low impact, but easy fix)

Error

DecodingFailure at .add.blocks: Missing required field

Root Cause

The BlockchainTest decoder requires blocks as a mandatory field (line 88 in EthereumTestsAdapter.scala), but some VM test files may have this as optional or use a different structure.

Proposed Fix (5-10 minutes)

File: src/it/scala/com/chipprbots/ethereum/ethtest/EthereumTestsAdapter.scala

Change line 88 from:

blocks <- cursor.downField("blocks").as[Seq[TestBlock]]

To:

blocks <- cursor.downField("blocks").as[Option[Seq[TestBlock]]].map(_.getOrElse(Seq.empty))

And update the case class (line 78):

blocks: Seq[TestBlock],  // Keep as is - empty seq if missing

Rationale: VM tests may not have blocks field if they're testing pre-execution state only. Making it optional with a default empty sequence allows the test to load.

Risk: Very low - empty blocks is a valid test scenario
Testing: Run sbt "IntegrationTest/testOnly com.chipprbots.ethereum.ethtest.VMTestsSpec"


Tests: 1. should prefer recently seen chain over old chain with same difficulty (243ms) 2. should handle blocks without first-seen time using block timestamp (1ms) 3. should correctly handle chain reorganization scenario (3ms)

Time to Fail: All < 250ms (quick assertion failures, not timeouts)
Priority: P1 (High - consensus correctness)

Why NOT a Quick Fix

While the failures are fast (suggesting assertion failures), the issues are in consensus logic:

  1. Test 1 Failure: Line 102-104 in MESSIntegrationSpec.scala

    weightA should be > weightB  // Fails - MESS scoring not working as expected
    

  2. Test 2 Failure: Line 167-168

    messAdjusted should be > BigInt(980)
    messAdjusted should be < BigInt(1000)  // Fails - timestamp fallback logic incorrect
    

  3. Test 3 Failure: Line 223

    canonicalWeight should be > attackWeight  // Fails - reorg protection not working
    

Issues Identified

Looking at MESSScorer.scala:

  1. Line 129: Calls firstSeenStorage.contains(blockHash) - this works (default impl on line 42 of BlockFirstSeenStorage)

  2. Potential Issue: The exponential decay calculation (lines 60-76) may have precision issues or incorrect formula

  3. Time conversion: Line 91 converts unixTimestamp (seconds) to milliseconds - might cause issues if already in millis

Why Defer

  • Consensus-critical code: Mistakes could cause chain splits
  • Needs thorough testing: Must test with real blockchain scenarios
  • Requires validation: Need to verify against MESS spec and other implementations
  • Not blocking: These are new MESS features, not breaking existing functionality

Recommendation: Create separate issue for MESS consensus fixes after validating Category 1 fix


Likely Auto-Fixed by Category 1 Fix

Tests That May Pass After Timeout Fix

Category 3: Sync State Undefined (3 tests) - All have 6-7 second failures with "None was not defined" - Likely caused by incomplete sync due to timeouts - Estimated auto-fix probability: 80%

Category 5: Fork Validation (1 test) - ForksTest: should execute blocks with respect to forks (1.3s) - Error: Missing MPT root node - Likely caused by incomplete state setup due to timeouts - Estimated auto-fix probability: 70%

Category 6: Handshake Timeouts (2 tests) - Both 7-9 second timeouts - May be related to general timeout configuration - Estimated auto-fix probability: 60%

Total: 6 tests (16% of failures) likely auto-fixed


Recommendation Summary

Implement Now (Before Commit)

✅ VM Data Decoding Fix (1 test) - Very low risk - 5-10 minute fix - Easy to validate - Minimal code change

Wait for Validation (Next PR)

⏳ Wait to see if auto-fixed (6 tests) - Sync State Undefined (3) - Fork Validation (1) - Handshake Timeouts (2)

⏳ MESS Consensus Fixes (3 tests) - Requires careful analysis - Consensus-critical code - Separate focused PR recommended - Not blocking other work


Action Plan

  1. ✅ Commit Category 1 fix (State Sync Timeouts - 28 tests)
  2. ⏳ Wait for nightly run validation
  3. ⏳ Assess which of the 6 "likely auto-fixed" tests actually pass
  4. ⏳ Address remaining failures in separate PRs

Pros: Safe, validates assumptions
Cons: Slower resolution

Option B: Quick Win Included

  1. ✅ Commit Category 1 fix (State Sync Timeouts - 28 tests)
  2. ✅ Add VM Data Decoding fix (1 test) - 5-10 minutes
  3. ⏳ Wait for nightly run validation
  4. ⏳ Address remaining failures based on results

Pros: Picks low-hanging fruit, 29 of 37 fixed (78%)
Cons: Slightly more risk (but very low)


Code Change for Quick Win

If choosing Option B, here's the exact change:

File: src/it/scala/com/chipprbots/ethereum/ethtest/EthereumTestsAdapter.scala

Line 88 - Change:

// Before:
blocks <- cursor.downField("blocks").as[Seq[TestBlock]]

// After:
blocks <- cursor.downField("blocks").as[Option[Seq[TestBlock]]].map(_.getOrElse(Seq.empty))

Validation Command:

sbt "IntegrationTest/testOnly com.chipprbots.ethereum.ethtest.VMTestsSpec -- -z \"load and parse\""

Expected Result: Test should now load the file successfully (though it may still be marked as pending if submodule is not initialized)


Prepared by: @copilot
Date: December 20, 2025
Decision needed: Option A (Conservative) or Option B (Quick Win Included)