# A Naive FOCIL Interop Between Prysm And Geth Date: January 22, 2025 - _[Previous interop note by Terence](https://x.com/terencechain/status/1881536105016852500)_ - _[How to run a local devnet using Kurtosis](https://hackmd.io/@jihoonsong/Skidf4ePye)_ ### Reproduction **Geth** - [Code](https://github.com/jihoonsong/prysm/tree/f1a658cbd97a2003e9b66dc9a598f2afb7187d7c) - [Docker Image](https://hub.docker.com/repository/docker/jihoonsg/geth-focil/tags/93a5a14/sha256:8db59509925a87fe3696b1710a2635baa9e806e1cc0ed69457b707dd40bd74f1) **Prysm** - [Code](https://github.com/jihoonsong/go-ethereum/tree/93a5a1488a773d4f04d23d2b7ff535f949b8526d) - [Docker Image (beacon chain)](https://hub.docker.com/repository/docker/jihoonsg/prysm-beacon-chain-focil/tags/f1a658c/sha256:85e15fcd6cab3812ebf147903f4755f6c3821954676c0852b69e7248a160191e) - [Docker Image (validator)](https://hub.docker.com/repository/docker/jihoonsg/prysm-validator-focil/tags/f1a658c/sha256:c8ef334088d93b9425ba47e8341ad663fc9be40dac11cd317005fabc679f711d) **Kurtosis** - [Configuration](https://github.com/jihoonsong/local-devnet-focil/blob/main/kurtosis/kurtosis.config.local.yaml) For instructions on how to run a local devnet with the code described above, please refer to this [document](https://hackmd.io/@jihoonsong/Skidf4ePye). FOCIL is activated at epoch 2. If you wish to use off-the-shelf Docker images instead: ```bash= # Make sure you have Docker and Kurtosis installed. git clone https://github.com/jihoonsong/local-devnet-focil cd kurtosis make run-registry # Now you can access Dora the Explore at localhost:65500. ``` ### Status Quo The latest implementation supports a naive interop between Prysm and Geth, with full compatibility for all APIs introduced or modified by FOCIL. By naive, we mean that all participants are honest. Once the FOCIL fork is activated, each IL committee member creates an IL by calling `engine_getInclusionListV1` and broadcasts it over the P2P network. A builder then collects ILs from the P2P network and updates its payload during block construction by calling `engine_updatePayloadWithInclusionListV1` to produce an IL-compliant block. When a validator receives this block, it calls `engine_newPayloadV5` to verify that it meets the IL constraints before importing it. For more details on roles and participants, see [EIP-7805](https://eips.ethereum.org/EIPS/eip-7805#roles-and-participants). Currently, we are using Fulu for the FOCIL fork for simplicity. However, we plan to use FOCIL specific fork number and epoch. This approach ensures that FOCIL development doesn't inject any dependencies to others, making it easier to run spec tests, generate toolings, and so on. Later, once consensus is reached on which upgrade will include FOCIL, merging into the main branch should be straightforward. For more information, refer to this [discussion in the Eth R&D discord](https://discord.com/channels/595666850260713488/1210529202458071050/1331039289097850880). We have set the total validator count to 512, which is the minimum required, given that the IL committee size is 16 and there are 32 slots per epoch. We use [transaction spammer](https://github.com/ethpandaops/spamoor) to generate transactions, as is commonly done in devnet tests. It offers various modes, but the default one is typically sufficient. ### Lessons Learned According to the [consensus spec](https://github.com/terencechain/consensus-specs/blob/focil-consensus/specs/_features/eip7805/beacon-chain.md#inclusionlist), the inclusion list is defined as: ```bash= class InclusionList(Container): slot: Slot validator_index: ValidatorIndex inclusion_list_committee_root: Root transactions: List[Transaction, MAX_TRANSACTIONS_PER_INCLUSION_LIST] ``` In this context, `slot` indicates the slot in which the inclusion list is built. Therefore, an attester at `slot N` should retrieve all inclusion lists whose slot field is set to `N-1`. ### Next Steps Now that we have a naive version of local devnet up and running, along with a testing environment, we want to rigorously examine the FOCIL-specific features. In particular, we want to confirm that IL constraints are enforced as expected. One way to do this is by using a censoring client to propose blocks that do not comply with IL, and then verify whether they are rejected by the network. After we ship Electra, we would want to add more test cases, including those that cover edge cases potentially introduced by EIP-7702. As Electra is scheduled for release around mid-March, this is not a current priority. It would also be very helpful for Dora the Explorer to support FOCIL. A modified version of Dora would allow us to view IL details for each slot and verify whether blocks comply with IL constraints. This would not only streamline FOCIL testing but also facilitate its integration into the future upgrade where we agree to include FOCIL. ### FOCIL Breakout Room Join us in FOCIL breakout room and stay up-to-date on the latest developments! We meet every two weeks and the next session is scheduled for January 28, 2025, at 2:00 PM UTC. Recaps are available [here](https://github.com/ethereum/pm/tree/master/Breakout-Room-Meetings/FOCIL).