# Constructing and passing `BeaconState` to zkVM ## TLDR 1. Able to construct a full `BeaconState` from [consensus-spec-tests](https://github.com/ethereum/consensus-spec-tests) yaml files. 2. Able to pass a `BeamState` constructed with a subset of `BeaconState` fields, pass it into the guest zkVM, and journaled back to the host machine. 3. See the work at https://github.com/unnawut/consenzero/pull/1/ ## Details - After being stuck trying to construct a `BeaconState` from scratch, I was finally able to escape by constructing it from `consensus-spec-tests` test data instead. Thanks to Jun's suggestion and Kolby's [code in `ream/testing/ef-tests`](https://github.com/ReamLabs/ream/blob/master/testing/ef-tests/src/macros.rs) that made this straightforward. - Initially I tried passing the full `BeaconState` into the guest VM but the guest threw this error back: ```rust thread 'main' panicked at /Users/unnawut/.cargo/registry/src/index.crates.io-6f17d22bba15001f/risc0-zkvm-1.2.1/src/guest/env/read.rs:78:54: called `Result::unwrap()` on an `Err` value: NotSupported ``` - The `BeaconState` is a huge container so figuring out what went wrong would be hard. So I created `BeamState` within the `consenzero` repo and assigned the field over from `BeaconState` one by one until the error shows. This is the culprit: ```rust #[serde(deserialize_with = "ssz_types::serde_utils::quoted_u64_var_list::deserialize")] pub balances: VariableList<u64, U1099511627776>, ``` - It seems that `risc0` does not know how to deserialize `ssz_types::serde_utils::quoted_u64_var_list` hence the error "value: NotSupported". So I've [asked Risc0 team on Discord](https://discord.com/channels/953703904086994974/1334537285601071187) and waiting for their response. - For now I'd rather wait for their response than spending more time debugging myself since this is likely from their guest implementation. - While waiting for their response, I'll just proceed to build as many `BeamState` field as possible without errors then start trying out the state transition. ## Next - Wait for RiscZero team's response on the `guest::env::FdReader::read()` behavior - Continue to construct `BeamState` and see there are more errors elsewhere. - Start some state transition with the available fields.