---
# System prepended metadata

title: Week 9

---

# Week 9
This week was significant in terms of development. Successfully constructed the earliest *BAL* in [alloy/evm](https://github.com/Rimeeeeee/evm).
## Checkpoints:
### New rlp structure
The new eip marked a major shift from using **ssz** to **rlp** .Additionally, the pre_execution system contract index was moved 0. This is responsible to store changes concerning **eip-2935** and **eip-4788**.The post was at transactions.len()+1,storing changes concerning to **eip-7002** and **eip-7251** .I made changes to the core structures present in alloy as per the new convention.(e.g  bal_hash->block_access_list_hash etc)
### Recording pre and post execution changes
We initially had some struggle concerning getting access to the **Account** of revm in alloy/evm. The **CacheAccount** enabled access to AccountInfo without trait extension. So it could be either  using `db_mut().database().basic()` to get access to it or using `db_mut().database().load_cache_account()`.The change was undertaken by Soubhik.

After that the major work was recording pre-execution changes.The previous version of eip has a solid foundation upon how to tackle this. I had some initial doubt regarding the `HISTORY_STORAGE_ADDRESS`(which was present as a ecrecover precompile/dummy address in example section of eip).Upon sharing it with the writer,he fixed it. Thanks to [@nerolation](https://github.com/nerolation):)

For the implementation,I was responsible for keeping the changes concerning eip-2935.We previously lacked helper fxns like `with_address()`and `with_slot()`which would allow us to add the required part of change along with `AccountChanges::default()` .So finally it was something like:
```rust
 let slot_change = SlotChanges::default()
                .with_change(StorageChange {
                    block_access_index: 0,
                    new_value: parent_block_hash.into(),
                })
                .with_slot(U256::from((block_num - 1) % HISTORY_SERVE_WINDOW as u64).into());
        
        let acc_changes = AccountChanges::default()
            .with_storage_change(slot_change)
            .with_address(HISTORY_STORAGE_ADDRESS);

```
For the post execution, the key point was predetermined slots. For both the eips(eip-7002 and eip-7251),the system contract storage diffs from slot 0-3 are needed to be recored in `StorageChange`.This proved to be quite simple.

Also we noticed that we donot need access to the `state` in the post-execution directly,so the concept of `CacheAccount`(not really suitable tbh) was replaced with `Account`.

### Sorting and removing duplication
One of the key aspect of eip 7928 was having a lexicographically sorted list of `AccountChanges` in bal. Along with that the problem we feared is duplication. Since we were storing the changes across all 3 core functions dealing with **pre-execution**,**execution of txns** and **post-execution**, it was a possibility that we have redundant `AccountChanges` entry concerning addresses.We feared that we might have same addresses in txn execution and post_block_balance_increments. So after finally building the bal,I created a simple `sort_and_remove_duplicates_in_bal`  to tackle it before it finally moves to  `BlockExecutionResult`.

### Getting the essence of Block-level Access List
After patching the new modification of alloy/evm to reth,I enabled bal building through `assemble_block` and finally constructed the `block_access_list_hash` as `keccak256(rlp.encode(actual_bal))`.

After adding a simple test,we got the result like:
```json
{
  "block_access_list": {
    "account_changes": [
      {
        "address": "0x0000000000000000000000000000000000000000",
        "storage_changes": [],
        "storage_reads": [],
        "balance_changes": [
          {
            "block_access_index": 3,
            "post_balance": "5000000000000000000"
          }
        ],
        "nonce_changes": [],
        "code_changes": []
      },
      {
        "address": "0x000000000000000000000000000000000000beef",
        "storage_changes": [],
        "storage_reads": [],
        "balance_changes": [
          {
            "block_access_index": 0,
            "post_balance": "49999899999979000"
          },
          {
            "block_access_index": 0,
            "post_balance": "49999799999958000"
          }
        ],
        "nonce_changes": [
          {
            "block_access_index": 0,
            "new_nonce": 1
   },
          {
            "block_access_index": 0,
            "new_nonce": 2
          }
        ],
        "code_changes": []
      },
      {
        "address": "0x000000000000000000000000000000000000dead",
        "storage_changes": [],
        "storage_reads": [],
        "balance_changes": [
          {
            "block_access_index": 0,
            "post_balance": "150000100000000000"
          },
          {
            "block_access_index": 0,
            "post_balance": "150000200000000000"
          }
        ],
        "nonce_changes": [],
        "code_changes": []
}
}
```
## TODO:
* Adding actual tests to verify the block-level access list.
* Preparing reth in terms of bal building and generation.
* Refactoring and optimization.

*P.S. : There were no additional fun works this week.But looking at the output it was worthwhile!!!*

## Resources
[New revm approach](https://github.com/Soubhik-10/revm/pull/17)
[Alloy Evm build bal](https://github.com/Rimeeeeee/evm/pull/3)
[RLP Changes](https://github.com/Soubhik-10/alloy/pull/7)
[Eip-7002](https://eips.ethereum.org/EIPS/eip-7002)
[Eip-7251](https://eips.ethereum.org/EIPS/eip-7251)
