Skip to content

Eip4444 - Portal Integration #3087

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 29 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
45ced0c
initial structuring of portal integration
advaita-saha Jan 24, 2025
f59107c
prelim single point integration
advaita-saha Jan 26, 2025
645c04b
remove fluffy taskpool + add only rpc layer
advaita-saha Feb 14, 2025
08917ae
fix ci
advaita-saha Feb 14, 2025
2d9bb56
remove unwanted changes
advaita-saha Feb 20, 2025
8a1f89e
reorder
advaita-saha Feb 23, 2025
5fae0af
mainnet detection and limit setup
advaita-saha Feb 25, 2025
59102c1
eip4444 limit
advaita-saha Mar 1, 2025
cc9ae27
resolve impl change eth68
advaita-saha Mar 9, 2025
1dbaa4c
fix initializer
advaita-saha Mar 9, 2025
cb26db7
Merge branch 'master' into eip4444-wip
advaita-saha Mar 28, 2025
ff13cdc
Merge branch 'master' into eip4444-wip
advaita-saha Apr 3, 2025
8646c30
seperate history expiry from portal
advaita-saha Apr 4, 2025
28e3326
Merge branch 'master' into eip4444-wip
advaita-saha Apr 4, 2025
eb78cce
Merge branch 'master' into eip4444-wip
advaita-saha Apr 9, 2025
ba700a7
remove extra type
advaita-saha Apr 9, 2025
794b9e7
better warn message
advaita-saha Apr 9, 2025
f4a2c65
simplify return
advaita-saha Apr 9, 2025
d40ea8f
hide configureable params
advaita-saha Apr 10, 2025
3e4f434
Merge branch 'master' into eip4444-wip
advaita-saha Apr 10, 2025
f4645cc
Merge branch 'master' into eip4444-wip
advaita-saha Apr 14, 2025
a5b298d
fix: merge conflict
advaita-saha Apr 15, 2025
4955711
fix: remove return
advaita-saha Apr 15, 2025
13dfd1a
remove unnecessary copy of the blk.body
advaita-saha Apr 15, 2025
c92cffd
Merge branch 'master' into eip4444-wip
advaita-saha Apr 15, 2025
f3f49c8
fix with suggested changes
advaita-saha Apr 15, 2025
b36dba1
remove func export
advaita-saha Apr 15, 2025
87b71e1
Merge branch 'master' into eip4444-wip
advaita-saha Apr 16, 2025
bca7048
Merge branch 'master' into eip4444-wip
advaita-saha Apr 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
# Ignore dynamic, static libs and libtool archive files
*.so
*.dylib
*.dSYM
*.a
*.la
*.exe
Expand Down
3 changes: 3 additions & 0 deletions execution_chain/common/common.nim
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,9 @@ func eip150Hash*(com: CommonRef): Hash32 =
func daoForkBlock*(com: CommonRef): Opt[BlockNumber] =
com.config.daoForkBlock

func posBlock*(com: CommonRef): Opt[BlockNumber] =
com.config.posBlock

func daoForkSupport*(com: CommonRef): bool =
com.config.daoForkSupport

Expand Down
15 changes: 15 additions & 0 deletions execution_chain/config.nim
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,21 @@ type
defaultValueDesc: $RpcFlag.Eth
name: "ws-api" }: seq[string]

historyExpiry* {.
desc: "Enable the data from Portal Network"
defaultValue: false
name: "history-expiry" }: bool

historyExpiryLimit* {.
hidden
desc: "Limit the number of blocks to be kept in history"
name: "debug-history-expiry-limit" }: Option[BlockNumber]

portalUrl* {.
desc: "URL of the Portal Network"
defaultValue: ""
name: "portal-url" }: string

engineApiEnabled* {.
desc: "Enable the Engine API"
defaultValue: false
Expand Down
58 changes: 45 additions & 13 deletions execution_chain/core/chain/forked_chain.nim
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import
../../evm/state,
../validate,
../executor/process_block,
./forked_chain/[chain_desc, chain_branch],
../../portal/portal,
./forked_chain/[
chain_desc,
chain_branch,
Expand Down Expand Up @@ -693,6 +695,12 @@ func txRecords*(c: ForkedChainRef, txHash: Hash32): (Hash32, uint64) =
func isInMemory*(c: ForkedChainRef, blockHash: Hash32): bool =
c.hashToBlock.hasKey(blockHash)

func isHistoryExpiryActive*(c: ForkedChainRef): bool =
not c.portal.isNil

func isPortalActive(c: ForkedChainRef): bool =
(not c.portal.isNil) and c.portal.portalEnabled

func memoryBlock*(c: ForkedChainRef, blockHash: Hash32): BlockDesc =
c.hashToBlock.withValue(blockHash, loc):
return loc.branch.blocks[loc.index]
Expand Down Expand Up @@ -729,20 +737,30 @@ proc headerByNumber*(c: ForkedChainRef, number: BlockNumber): Result[Header, str
return err("Requested block number not exists: " & $number)

if number < c.baseBranch.tailNumber:
return c.baseTxFrame.getBlockHeader(number)
let hdr = c.baseTxFrame.getBlockHeader(number).valueOr:
if c.isPortalActive:
return c.portal.getHeaderByNumber(number)
else:
return err("Portal inactive, block not found, number = " & $number)
return ok(hdr)

var branch = c.activeBranch
while not branch.isNil:
if number >= branch.tailNumber:
return ok(branch.blocks[number - branch.tailNumber].blk.header)
branch = branch.parent

err("Header not found, number = " & $number)
err("Block not found, number = " & $number)

proc headerByHash*(c: ForkedChainRef, blockHash: Hash32): Result[Header, string] =
c.hashToBlock.withValue(blockHash, loc):
return ok(loc[].header)
c.baseTxFrame.getBlockHeader(blockHash)
let hdr = c.baseTxFrame.getBlockHeader(blockHash).valueOr:
if c.isPortalActive:
return c.portal.getHeaderByHash(blockHash)
else:
return err("Block header not found")
ok(hdr)

proc txDetailsByTxHash*(c: ForkedChainRef, txHash: Hash32): Result[(Hash32, uint64), string] =
if c.txRecords.hasKey(txHash):
Expand All @@ -754,15 +772,9 @@ proc txDetailsByTxHash*(c: ForkedChainRef, txHash: Hash32): Result[(Hash32, uint
header = ?c.headerByNumber(txDetails.blockNumber)
blockHash = header.computeBlockHash
return ok((blockHash, txDetails.index))

proc blockByHash*(c: ForkedChainRef, blockHash: Hash32): Result[Block, string] =
# used by getPayloadBodiesByHash
# https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.4/src/engine/shanghai.md#specification-3
# 4. Client software MAY NOT respond to requests for finalized blocks by hash.
c.hashToBlock.withValue(blockHash, loc):
return ok(loc[].blk)
c.baseTxFrame.getEthBlock(blockHash)


# TODO: Doesn't fetch data from portal
# Aristo returns empty txs for both non-existent blocks and existing blocks with no txs [ Solve ? ]
proc blockBodyByHash*(c: ForkedChainRef, blockHash: Hash32): Result[BlockBody, string] =
c.hashToBlock.withValue(blockHash, loc):
let blk = loc[].blk
Expand All @@ -773,12 +785,32 @@ proc blockBodyByHash*(c: ForkedChainRef, blockHash: Hash32): Result[BlockBody, s
))
c.baseTxFrame.getBlockBody(blockHash)

proc blockByHash*(c: ForkedChainRef, blockHash: Hash32): Result[Block, string] =
# used by getPayloadBodiesByHash
# https://github.com/ethereum/execution-apis/blob/v1.0.0-beta.4/src/engine/shanghai.md#specification-3
# 4. Client software MAY NOT respond to requests for finalized blocks by hash.
c.hashToBlock.withValue(blockHash, loc):
return ok(loc[].blk)
let blk = c.baseTxFrame.getEthBlock(blockHash)
# Serves portal data if block not found in db
if blk.isErr or (blk.get.transactions.len == 0 and blk.get.header.transactionsRoot != zeroHash32):
if c.isPortalActive:
return c.portal.getBlockByHash(blockHash)
blk

proc blockByNumber*(c: ForkedChainRef, number: BlockNumber): Result[Block, string] =
if number > c.activeBranch.headNumber:
return err("Requested block number not exists: " & $number)

if number <= c.baseBranch.tailNumber:
return c.baseTxFrame.getEthBlock(number)
let blk = c.baseTxFrame.getEthBlock(number)
# Txs not there in db - Happens during era1/era import, when we don't store txs and receipts
if blk.isErr or (blk.get.transactions.len == 0 and blk.get.header.transactionsRoot != emptyRoot):
# Serves portal data if block not found in database
if c.isPortalActive:
return c.portal.getBlockByNumber(number)
else:
return blk

var branch = c.activeBranch
while not branch.isNil:
Expand Down
6 changes: 5 additions & 1 deletion execution_chain/core/chain/forked_chain/chain_desc.nim
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ import
./chain_branch,
./block_quarantine,
../../../common,
../../../db/core_db
../../../db/core_db,
../../../portal/portal

export deques, tables

Expand Down Expand Up @@ -65,6 +66,9 @@ type
# When move forward, this is the minimum distance
# to move the base. And the bulk writing can works
# efficiently.

portal*: HistoryExpiryRef
# History Expiry tracker and portal access entry point

# ----------------

Expand Down
4 changes: 3 additions & 1 deletion execution_chain/nimbus_execution_client.nim
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ import
./db/core_db/persistent,
./db/storage_types,
./sync/wire_protocol,
./common/chain_config_hash
./common/chain_config_hash,
./portal/portal

from beacon_chain/nimbus_binary_common import setupFileLimits

Expand All @@ -40,6 +41,7 @@ proc basicServices(nimbus: NimbusNode,
conf: NimbusConf,
com: CommonRef) =
nimbus.fc = ForkedChainRef.init(com)
nimbus.fc.portal = HistoryExpiryRef.init(conf, com)

# txPool must be informed of active head
# so it can know the latest account state
Expand Down
Loading