---
# System prepended metadata

title: grandine-zkvm-study-250724
tags: [grandine, epf-6]

---

# Grandine zkVM Integration Study (2025-07-24)

I am studying the `/zkvm` diectory and have the following questions. Will be great if the core team could shed some light on them.

1. There are three main test cases, the `pectra-devnet-6 with/without epoch transition`, and the `mainnet without epoch transition`. Each test case downloading 
   - a block (using pectra-devnet with epoch): https://assets.grandine.io/beacon_block_slot_00021568_root_0xb28a634b89c669141990ed5deceb1.xz
   - a state: https://assets.grandine.io/beacon_state_slot_00021567_root_0xd51b605669c3e1ec96d83b6ab191d.xz

   to be fed in the stf in the zkVM. 
   
   a. Where can I get more context about what is inside this particular block and state? 
   b. Any significance about testing on this particular state and block?
   c. Can I construct my own block and state? How?

2. Reading the zkVM host code, we are executing the following in the host
   
   ```rs
   let block = SignedBeaconBlock::<Mainnet>::from_ssz(&config, block_ssz.clone())?;
   let mut state = BeaconState::<Mainnet>::from_ssz(&config, state_ssz.clone())?;
   let cache = PubkeyCache::load(Database::in_memory());

   state_transition(&config, &cache, &mut state, &block)?;

   (state.hash_tree_root(), cache.to_ssz().unwrap())
   
   //...
   // Passing these params to the zkVM and generate receipt
   let vm = Vm::new()?;
   let (output_bytes, report) = vm.execute(state_ssz, block_ssz, cache)?;   
   
   // can verify proof/receipt(output_bytes) at this point
   ```
   
   In the doc, it mentions `pectra-devnet-6 with epoch transition` tests over pectra epoch state transition with 100k validators.
   
   But I don't see there is spawning of validators node. So running with N validators are actually simulated via the **block** and **state** read from the test data file?

3. So, basically our task is to implement the host and guest code of other zkVM implementations, and feed the **block**, **state**, and **cache** (contains some kind of stf traces/artifact there I believe) objects into them, retrieve the receipt/proof, and verify it?

4. Is there a really simple small test case, just for sanity check during our development?