2056 Commits

Author SHA1 Message Date
andri lim
0ffc17d153
Merge test_txpool and test_txpool2 (#2983)
* Merge test_txpool and test_txpool2

* Fix copyright year
2025-01-05 08:05:29 +00:00
andri lim
7c0c507f6a
TxPool: simplify byPriceAndNonce algorithm (#2978)
Remove the intermediate bySender table usage. This will lower
the memory and CPU usage.

Also add more comments about how algorithm works.
2024-12-29 13:02:42 +07:00
andri lim
7d3616e3d9
Refactor TxPool: leaner and simpler (#2973)
* Refactor TxPool: leaner and simpler
* Rewrite test_txpool

Reduce number of tables used, from 5 to 2. Reduce number of files.
If need to modify the price rule or other filters, now is far more easier because only one table to work with(sender/nonce).
And the other table is just a map from txHash to TxItemRef.

Removing transactions from txPool either because of producing new block or syncing became much easier.
Removing expired transactions also simple.
Explicit Tx Pending, Staged, or Packed status is removed. The status of the transactions can be inferred implicitly.
Developer new to TxPool can easily follow the logic.

But the most important is we can revive the test_txpool without dirty trick and remove usage of getCanonicalHead furthermore to prepare for better integration with ForkedChain.
2024-12-26 17:07:25 +07:00
andri lim
487743fc2e
Proper setup of test_rpc (#2969)
Instead of using ancient/dirty code to setup the rpc test, now using newest method from TxPool and ForkedChain.
Also fix some bugs in server_api discovered when using this new setup.
2024-12-22 16:18:46 +07:00
andri lim
aba9b582db
Rename stateDB to ledger (#2966)
* Rename stateDB to ledger

* Fix readOnlyLedger
2024-12-21 20:46:13 +07:00
andri lim
473da69043
Remove unused stuff from txpool (#2967) 2024-12-21 20:13:33 +07:00
andri lim
86fc24a1d7
devnet-5: Update EIP-7685: exclude empty requests data in commitment (#2963)
* devnet-5: Update EIP-7685: exclude empty requests data in commitment

* Fix test vector

* Add more tests

* Fix executionRequests order validation

* Simplify test vector

* Fix t8n executionRequests output
2024-12-21 05:59:30 +00:00
Jacek Sieka
036dd23e9b
cleanups, import fixes (#2964)
* more generic-path removal
* tighter imports
2024-12-20 12:57:15 +01:00
andri lim
80f8b3c2b1
devnet-5: Implement EIP-7691: Blob throughput increase (#2957) 2024-12-20 09:12:16 +00:00
andri lim
1dff892995
devnet-5: Update EIP-2537: Remove redundant MUL precompiles (#2962) 2024-12-20 05:29:30 +00:00
andri lim
6085457f9b
devnet-5: Update EIP-2537: Gas repricing (#2959) 2024-12-19 17:38:29 +00:00
Jordan Hrycaj
c801a11190
Beacon sync mainentenance updates (#2958)
* Fix name after API change

why:
  Slipped through (debugging mode)

* Fine tuning error counters

why:
  Previous operating mode was quite blunt and considered some unnecessary
  condition. Error handling was invoked and the peer zombified where one
  could have continued working with that peer.

* Provide `kvt` table API bypassing `FC`

details:
  Not a full bypass yet

why:
  As discussed on Discord:
    Ideally, those would pass through fc as well, as thin wrappers around
    the db calls, for now - later, we probably see some policy involved
    here and at that point, fc will be responsible for arbitrage between
    sources (ie if a rpc source sends the block the syncer is syncing
    while the syncer is working, fc is there to referee


* Apply `kvt` API from `FC` to beacon sync

* No need to use extra table for persistent header cache state record

why:
  Slot zero can do. This allows deleting that table wholesale when needed
  once thatfeature is available.

* Logger updates

details:
  + Lifting main header/block op logs from `trace` to `debug`
  + Set metrics update before nano-sleep (for task switch)
2024-12-19 12:02:36 +00:00
andri lim
55fd25758a
devnet-5: fix Consolidation and Withdrawal request predeploy address (#2956)
* devnet-5: fix Consolidation and Withdrawal request predeploy address

[Update EIP-7251: Set MAX_CONSOLIDATIONS=2](https://github.com/ethereum/EIPs/pull/9127)
will override
[Update EIP-7251: fix CONSOLIDATION_REQUEST_PREDEPLOY_ADDRES](https://github.com/ethereum/EIPs/pull/9118)
therefore we only need the later.

* Fix test vectors
2024-12-19 10:39:18 +00:00
Advaita Saha
48aa410f8a
reduce blockHash call (#2954) 2024-12-19 01:13:12 +05:30
andri lim
cd3cea0e29
Fix bn256ecPairing precompile bug (#2953)
Thanks to @holiman of goevmlab for his fuzzer.
Similar with Blake2b precompile regression #2919.
When error, the precompile should not return any output.
2024-12-18 23:04:14 +07:00
Jacek Sieka
d45d03ce0c
reduce tx naming overload (#2952)
* if it's a db function, use `txFrame...`
* if it's not a db function, don't use `txFrame...`
2024-12-18 23:03:51 +07:00
Jacek Sieka
7bbb0f4421
Stream blocks during import (#2937)
When running the import, currently blocks are loaded in batches into a
`seq` then passed to the importer as such.

In reality, blocks are still processed one by one, so the batching does
not offer any performance advantage. It does however require that the
client wastes memory, up to several GB, on the block sequence while
they're waiting to be processed.

This PR introduces a persister that accepts these potentially large
blocks one by one and at the same time removes a number of redundant /
unnecessary copies, assignments and resets that were slowing down the
import process in general.
2024-12-18 13:21:20 +01:00
Jacek Sieka
06a544ac85
Remove forkTx and friends (#2951)
The forking facility has been replaced by ForkedChain - frames and
layers are two other mechanisms that mostly do the same thing at the
aristo level, without quite providing the functionality FC needs - this
cleanup will make that integration easier.
2024-12-18 11:56:46 +01:00
andri lim
45bc6422a0
Reduce getCanonicalHead usage, and delegate to ForkedChain (#2948)
The current getCanonicalHead of core db should not be confused with ForkedChain.latestHeader.
Therefore we need to use getCanonicalHead to restricted case only, e.g. initializing ForkedChain.
2024-12-18 11:04:23 +07:00
andri lim
b8932d9519
Remove MergeForkBlock alias and use MergeNetSplitBlock only (#2947) 2024-12-17 11:42:13 +00:00
andri lim
f8a6ed4f5f
Replace deprecated toBytes with toBytesBE in bn256ecPairing precompile (#2944) 2024-12-17 18:17:47 +07:00
andri lim
f74813520a
Connect gasLimit from Config to CommonRef (#2946) 2024-12-17 10:48:31 +00:00
tersec
0b704040e3
increase default gas limit from 30M to 36M (#2941) 2024-12-16 23:32:29 +00:00
Jordan Hrycaj
0ce5234231
Beacon sync mitigate deadlock with bogus sticky peers (#2943)
* Metrics cosmetics

* Better naming for error threshold constants

* Treating header/body process error different from response errors

why:
  Error handling becomes active not until some consecutive failures
  appear. As both types of errors may interleave (i.g. no response
  errors) the counter reset for one type might affect the other.

  By doing it wrong, a peer might send repeatedly a bogus block so
  locking in the syncer in an endless loop.
2024-12-16 16:26:38 +00:00
andri lim
650fec5a26
Wire ForkedChainRef to graphql and rpc_utils (#2936)
* fixes

* Wire ForkedChainRef to graphql and rpc_utils
2024-12-13 14:34:32 +07:00
andri lim
a57958f71e
Remove totalTerminalDifficultyPassed (#2934) 2024-12-13 13:29:00 +07:00
andri lim
2e5ef4fb5a
Wire ForkedChainRef properly to TxPool (#2933) 2024-12-13 13:21:20 +07:00
andri lim
847cc311eb
Remove verifyFrom, vmState, and checkSeal from ChainRef (#2932) 2024-12-13 12:12:57 +07:00
Jacek Sieka
3d58393b4c
Offload signature checking to taskpools (#2927)
In block processing, depending on the complexity of a transaction and
hotness of caches etc, signature checking can actually make up the
majority of time needed to process a transaction (60% observed in some
randomly sampled block ranges).

Fortunately, this is a task that trivially can be offloaded to a task
pool similar to how nimbus-eth2 does it.

This PR introduces taskpools in the most simple way possible, by
performing signature checking concurrently with other TX processing,
assigning a taskpool task per TX effectively.

With this little trick, we're in gigagas land 🎉 on my laptop!

```
INF 2024-12-10 21:05:35.170+01:00 Imported blocks
blockNumber=3874817 b... mgps=1222.707 ...
```

Tests don't use the taskpool for now because it needs manual cleanup and
we don't have a good mechanism in place. Future PR:s should address this
by creating a common shutdown sequence that also closes and cleans up
other resources like the DB.

Co-authored-by: andri lim <jangko128@gmail.com>
2024-12-13 11:53:41 +07:00
andri lim
1d5a48e153
Feature: configurable gas limit when building execution payload (#2931)
* Feature: configurable gas limit when building execution payload

* Raise default gas limit to 30M
2024-12-13 10:47:35 +07:00
Jordan Hrycaj
cbc5ec9385
Beacon sync logging updates (#2930)
* Cosmetics, add some metrics updates to smoothen curves

why:
  Progress downloading blocks was just a jump from none to full

* Reclassifying some syncer gossip from TRC to DBG

why:
  Might help debugging without full trace logs
2024-12-12 17:35:10 +00:00
andri lim
674e65f359
Move EVM code initialization outside of newComputation (#2926)
* Move EVM code initialization outside of newComputation

* Tidying up call_common.setupHost
2024-12-11 14:56:41 +01:00
Jacek Sieka
7b88bb3b30
Add branch cache (#2923)
Now that branches are small, we can add a branch cache that fits more
verticies in memory by only storing the branch portion (16 bytes) of the
VertexRef (136 bytes).

Where the original vertex cache hovers around a hit rate of ~60:ish,
this branch cache reaches >90% hit rate instead around block 20M which
gives a nice boost to processing.

A downside of this approach is that a new VertexRef must be allocated
for every cache hit instead of reusing an existing instance - this
causes some GC overhead that needs to be addressed.

Nice 15% improvement nonetheless, can't complain!

```
blocks: 19630784, baseline: 161h18m38s, contender: 136h23m23s
Time (total): -24h55m14s, -15.45%
```
2024-12-11 11:53:26 +01:00
andri lim
57157a6f76
Fix Blake2b precompile regression (#2919)
Introduced by #2865
Detected on Holesky block 2.406.802 tx no 11
And on MainNet block 19.633.393
2024-12-09 20:52:34 +01:00
Jacek Sieka
a056a722eb
Sort subkey lookups by VertexID when computing keys (#2918)
Since data is ordered by VertexID on disk, with this simple trick we can
make much better use of the various rocksdb caches.

Computing the state root of the full mainnet state is down to 4 hours
(from 9) on my laptop.
2024-12-09 08:16:02 +01:00
Jacek Sieka
66ad5497d9
Unroll nibble ops (#2894)
A bit unexpectedly, nibble handling shows up in the profiler mainly
because the current impl is tuned towards slicing while the most common
operation is prefix comparison - since the code is simple, might has
well get rid of some of the excess fat by always aliging the nibbles to
the byte buffer.
2024-12-09 08:15:04 +01:00
Jordan Hrycaj
9a9d391217
Fix race condition on syncer termination (#2916)
* Cosmetics

* Must not async wait inside termination `for` loop

why:
  Async-waiting inside a `for` loop will switch to temination process
  which uncontrollably will modify the for-loop data base.

* Avoid `waitFor` in scheduler termination code

why:
  Is reserved for main loop
2024-12-06 12:11:40 +00:00
Jacek Sieka
667897557a
Interpreter dispatch cleanups (#2913)
* `shouldPrepareTracer` always true
* simple `pop` should not copy value (reading the memory shows up in a
profiler)
* continuation code simplified
* remove some unnecessary EH
2024-12-06 13:01:15 +01:00
andri lim
9b7e2960c2
Add Holesky deposit contract address (#2915) 2024-12-06 10:06:52 +00:00
Jordan Hrycaj
90dd86be9a
Fc module can update base also when on parent arc (#2911)
* Re-org internal descriptor `CanonicalDesc` as `PivotArc`

why:
  Despite its name, `CanonicalDesc` contained a cursor arc (or leg) from
  the base tree with a designated block (or Header) on its arc members
  (aka blocks.) The type is used more generally than only for s block on
  the canonical cursor.

  Also, the `PivotArc` provides some more fields for caching intermediate
  data. This simplifies managing extra arguments for some functions.

* Remove cruft

details:
  No need to find cursor arc if it is given as function argument.

* Rename prototype variables `head: PivotArc` to `pvarc`

why:
  Better reading

* Function and code massage, adjust names

details:
  Avoid the syllable `canonical` in function names that do not strictly
  apply to the canonical chain. So renaming
  * findCanonicalHead() => findCursorArc()
  * canonicalChain() => findHeader()
  * trimCanonicalChain() => trimCursorArc()

* Combine `updateBase()` function-args into single `PivotArgs` object

why:
  Will generalise action for more complex scenarios in future.

* update `calculateNewBase()` return code type => `PivotArc`

why:
  So it can directly be used as argument into `updateBase()`

* Update `calculateNewBase()` for target on parent arc

* Update unit tests
2024-12-05 13:01:57 +07:00
andri lim
dc81863c3a
Fixes for Mekong testnet: EIP-7702 gas related (#2912) 2024-12-05 13:00:47 +07:00
Jordan Hrycaj
1d70ba5ff0
Fix log warnings (== should have been !=) (#2907) 2024-12-04 14:36:15 +00:00
andri lim
1101895f92
Move rlp block import into it's own subcommand (#2904)
* Move rlp block import into it's own subcommand

* Fix test_configuration
2024-12-04 20:36:07 +07:00
Jacek Sieka
8cb3619141
stint: bump for endians (#2903)
* stint: bump for endians

* stint fix
2024-12-04 12:03:31 +01:00
Jacek Sieka
f034af422a
Pre-allocate vids for branches (#2882)
Each branch node may have up to 16 sub-items - currently, these are
given VertexID based when they are first needed leading to a
mostly-random order of vertexid for each subitem.

Here, we pre-allocate all 16 vertex ids such that when a branch subitem
is filled, it already has a vertexid waiting for it. This brings several
important benefits:

* subitems are sorted and "close" in their id sequencing - this means
that when rocksdb stores them, they are likely to end up in the same
data block thus improving read efficiency
* because the ids are consequtive, we can store just the starting id and
a bitmap representing which subitems are in use - this reduces disk
space usage for branches allowing more of them fit into a single disk
read, further improving disk read and caching performance - disk usage
at block 18M is down from 84 to 78gb!
* the in-memory footprint of VertexRef reduced allowing more instances
to fit into caches and less memory to be used overall.

Because of the increased locality of reference, it turns out that we no
longer need to iterate over the entire database to efficiently generate
the hash key database because the normal computation is now faster -
this significantly benefits "live" chain processing as well where each
dirtied key must be accompanied by a read of all branch subitems next to
it - most of the performance benefit in this branch comes from this
locality-of-reference improvement.

On a sample resync, there's already ~20% improvement with later blocks
seeing increasing benefit (because the trie is deeper in later blocks
leading to more benefit from branch read perf improvements)

```
blocks: 18729664, baseline: 190h43m49s, contender: 153h59m0s
Time (total): -36h44m48s, -19.27%
```

Note: clients need to be resynced as the PR changes the on-disk format

R.I.P. little bloom filter - your life in the repo was short but
valuable
2024-12-04 11:42:04 +01:00
Jordan Hrycaj
9da3f29dff
Add desc validator to fc unit tests (#2899)
* Kludge: fix `eip4844` import in `validate`

why:
  Importing `validate` needs `blscurve` here or with the importing module.

* Separate out `FC` descriptor iinto separate file

why:
  Needed for external descriptor access (e.g. for debugging)

* Debugging toolkit for `FC`

* Verify chain descriptor after changing state
2024-12-02 17:49:53 +00:00
Jordan Hrycaj
dd888deadb
Fc module various base tree admin updates (#2895)
* Cosmetics, update log and exception messages

* Update `FC` base tree updater `updateBase()`

why:
  Correct `forkJunction` of canonical cursor head record. When moving
  the `base`, this field would be below `base` unless updated.

* Fix `FC` chain selector `findCanonicalHead()`

why:
  Given a sample ref `hash` the function searched for the unique chain
  containing the block header referenced by `hash`.

  Unfortunately, when searching down the ancestry lineage, the function
  did not necessarily stop an the end of the sub-chain. Rather it
  continued with the parent chain without noticing. So returning the
  wrong result.

* When calculating new a base it must reside on cursor arc (or leg.)

why:
  The finalised block argument (that will eventually be the new base)
  might be moved further down the cursor arc if it is too close to the
  cursor head (typically smaller than 128 blocks.)

  So the finalised block selection is shifted down he cursor arc. And
  it might happen that the cursor arc itself is too small and one would
  end up at a parent cursor arc. This is rejected.

* Not starting a new cursor arc with a block already on another arc

why:
  This leads to an inconsistent set of cursor arcs which are supposed to
  be mutually disjunct.

* Tighten condition: A block that is not on the base tree must be on the DB

* One less TODO item
2024-12-02 08:25:58 +00:00
Jacek Sieka
b3cb51e89e
Speed up evm stack (#2881)
The EVM stack is a hot spot in EVM execution and we end up paying a nim
seq tax in several ways, adding up to ~5% of execution time:

* on initial allocation, all bytes get zeroed - this means we have to
choose between allocating a full stack or just a partial one and then
growing it
* pushing and popping introduce additional zeroing
* reallocations on growth copy + zero - expensive again!
* redundant range checking on every operation reducing inlining etc

Here a custom stack using C memory is instroduced:

* no zeroing on allocation
* full stack allocated on EVM startup -> no reallocation during
execution
* fast push/pop - no zeroing again
* 32-byte alignment - this makes it easier for the compiler to use
vector instructions
* no stack allocated for precompiles (these never use it anyway)

Of course, this change also means we have to manage memory manually -
for the EVM, this turns out to be not too bad because we already manage
database transactions the same way (they have to be freed "manually") so
we can simply latch on to this mechanism.

While we're at it, this PR also skips database lookup for known
precompiles by resolving such addresses earlier.
2024-11-30 10:07:10 +01:00
tersec
b2a4373cc9
Revert "Adopt latest changes to requests hash computation" (#2892)
* Revert "Adopt latest changes to requests hash computation (#2862)"

This reverts commit 1721435b3cfe9c48dddd59ffef1d32ac4e0ddbb2.

* Fix test vector requestHash

---------

Co-authored-by: jangko <jangko128@gmail.com>
2024-11-29 16:13:08 +07:00
andri lim
5e90522e70
Bump nim-web3 to c8f36f59cb354196cfe117b6866e81d450c8cfd7 (#2878)
* Bump nim-web3 to c8f36f59cb354196cfe117b6866e81d450c8cfd7

* Fix portal bridge

* Comply to nph format style
2024-11-27 20:16:31 +07:00