Skip to content

Commit 5fef53b

Browse files
authored
Merge 4b95936 into dc71750
2 parents dc71750 + 4b95936 commit 5fef53b

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

EIPS/eip-7805.md

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
eip: 7805
33
title: Fork-choice enforced Inclusion Lists (FOCIL)
44
description: Allow a committee of validators to force-include a set of transactions in every block
5-
author: Thomas Thiery (@soispoke) <thomas.thiery@ethereum.org>, Francesco D'Amato <francesco.damato@ethereum.org>, Julian Ma <julian.ma@ethereum.org>, Barnabé Monnot <barnabe.monnot@ethereum.org>, Terence Tsao <ttsao@offchainlabs.com>, Jacob Kaufmann <jacob.kaufmann@ethereum.org>, Jihoon Song <jihoonsong.dev@gmail.com>
5+
author: Thomas Thiery (@soispoke) <thomas.thiery@ethereum.org>, Francesco D'Amato <francesco.damato@ethereum.org>, Julian Ma <julian.ma@ethereum.org>, Barnabé Monnot <barnabe.monnot@ethereum.org>, Terence Tsao <ttsao@offchainlabs.com>, Jacob Kaufmann <jacob.kaufmann@ethereum.org>, Jihoon Song <jihoonsong.dev@gmail.com>, Marc Harvey-Hill (@Marchhill) <marc.harvey-hill@nethermind.io>
66
discussions-to: https://ethereum-magicians.org/t/eip-7805-committee-based-fork-choice-enforced-inclusion-lists-focil/21578
77
status: Draft
88
type: Standards Track
@@ -14,7 +14,7 @@ created: 2024-11-01
1414

1515
FOCIL implements a robust mechanism to preserve Ethereum’s censorship resistance properties by guaranteeing timely transaction inclusion.
1616

17-
FOCIL (**Fo**rk-choice enforced **I**nclusion **L**ists) is built in a few simple steps:
17+
FOCIL (**Fo**rk-**c**hoice enforced **I**nclusion **L**ists) is built in a few simple steps:
1818

1919
- In each slot, a set of validators is selected as inclusion list (IL) committee members. Each member builds and gossips one IL according to their subjective view of the mempool.
2020
- The proposer and all attesters of the next slot monitor, store and forward available ILs.
@@ -40,7 +40,7 @@ This section outlines the workflow of FOCIL, detailing the roles and responsibil
4040
- **`Slot N`, `t=0 to 8s`**:
4141
IL committee members construct their ILs by including transactions pending in the public mempool, and broadcast them over the P2P network after processing the block for `slot N` and confirming it as the head. If no block is received by `t=7s`, they should run `get_head` and build and release their ILs based on the node’s local head.
4242

43-
By default, ILs are built by selecting raw transactions from the public mempool, ordered by priority fees, up to the IL’s maximum size in bytes of `MAX_BYTES_PER_INCLUSION_LIST = 8 KiB` per IL. Additional rules can be optionally applied to maximize censorship resistance, such as prioritizing valid transactions that have been pending in the mempool the longest.
43+
IL committee members may follow different strategies for constructing their ILs as discussed in [IL Building](#il-building).
4444

4545
#### Validators
4646

@@ -85,31 +85,46 @@ When validators receive ILs from the P2P network, they perform a series of valid
8585

8686
### Execution Layer
8787

88-
On the execution layer, the block validity conditions are extended such that, after all of the transactions in the block have been executed, we attempt to execute each valid transaction from ILs that was not present in the block.
89-
If one of those transactions executes successfully, then the block is invalid.
88+
On the execution layer, an additional check is introduced for new payloads. After all of the transactions in the payload have been executed, we check whether any transaction from ILs, that is not already present in the payload, could be validly included (i.e. nonce and balance checks pass). If that is the case for any transaction, then an error is returned to the CL. Although the block is valid, the CL will not attest to it.
9089

9190
Let `B` denote the current block.
9291
Let `S` denote the execution state following the execution of the last transaction in `B`.
92+
Let `gas_left` be the gas remaining after execution of B.
9393

9494
For each transaction `T` in ILs, perform the following:
9595

9696
1. Check whether `T` is present in `B`. If `T` is present, then jump to the next transaction, else continue with next step.
9797

98-
2. Validate `T` against `S`.
98+
2. Check whether `B` has enough remaining gas to execute `T`. If `T.gas` > `gas_left`, then jump to the next transaction, else continue with next step.
99+
100+
3. Validate `T` against `S` by checking the nonce and balance of `T.origin`.
99101

100102
- If `T` is invalid, then continue to the next transaction.
101103

102-
- If `T` is valid, terminate process and assert block `B` as invalid.
103-
104-
3. Execute `T` on state `S`. Assert that the execution of `T` fails.
104+
- If `T` is valid, terminate process and return an `INVALID_INCLUSION_LIST` error.
105105

106-
If `B` is full, the process terminates. Also note that we do not need to reset the state to `S`, since the only way for a transaction to alter the state is for it to execute successfully, in which case the block is invalid, and so the block will not be applied to the state.
106+
#### Engine API Changes
107107

108108
We make the following changes to the engine API:
109109

110-
- Add `engine_getInclusionList` endpoint to retrieve an IL from the `ExecutionEngine`
111-
- Modify `engine_newPayload` endpoint to include a parameter for transactions in ILs determined by the proposer
112-
- Modify `engine_forkchoiceUpdated` endpoint to include a field in the payload attributes for transactions in ILs determined by the proposer
110+
- Add `engine_getInclusionListV1` endpoint to retrieve an IL from the `ExecutionEngine`. It takes as an argument the IL committee member id, where the id is a value from `0`-`f` derived from ordering by validator index (i.e. lowest index has id `0`).
111+
- Add `engine_updatePayloadWithInclusionListV1` endpoint to update a payload with the IL that should be used to build the block. This takes as an argument an 8-byte `payloadId` of the ongoing payload build process, along with the IL itself.
112+
- Modify `engine_newPayload` endpoint to include a parameter for transactions in ILs determined by the IL committee member. If the IL is not satisfied an `INVALID_INCLUSION_LIST` error must be returned.
113+
114+
The full Engine API changes can be found in the [Execution APIs](https://github.com/ethereum/execution-apis/blob/572c54cd9d003f700bb5a57ce201606adbc8fc1c/src/engine/experimental/eip7805.md) GitHub repository.
115+
116+
#### IL Building
117+
118+
The rules for building ILs are left to the discretion of implementers; a diverse set of strategies can strengthen censorship resistance. Transactions from the public mempool could be selected based on several factors such as:
119+
120+
- Time spent pending in the mempool.
121+
- Priority fee.
122+
- Byte size: prioritising smaller transactions.
123+
- Nondeterminism: Introducing randomness can reduce overlap between ILs, leading to a larger IL when they are combined. Note that some overlap is desirable, otherwise the 1 of N honesty assumption would be undermined.
124+
- Bias: Picking some transactions more often than others in order to further reduce overlap between ILs. This should be done based on committee member id, for example the member with id `a` may be more likely to pick transactions with hashes that start with `a`.
125+
- The number of times a transaction has been included in reorged payloads.
126+
127+
The IL has a maximum size of `MAX_BYTES_PER_INCLUSION_LIST = 8 KiB` for all of the unserialised transactions.
113128

114129
### Consensus Layer
115130

0 commit comments

Comments
 (0)