This implements batched state-test exectution, similar to
https://github.com/ethereum/go-ethereum/pull/27318 .
Some speedtests, executing a state-test twice on current master takes
~4-5 seconds, and scales linerarly.
```
Doing 2 execs old style
real 0m8.185s
user 0m8.081s
sys 0m0.110s
```
Doing `100` executions on this PR -- a few seconds of ramp-up time, but
very quick execution after that :
```
Doing 100 execs v2
real 0m5.009s
user 0m4.560s
sys 0m0.508s
```
I also tested a version where I moved the db instantiation into the top
callsite, with the `MustOpen` and `.Close` only performed once, instead
of `100` times -- however, I noticed no additional speed gains from
doing so (my branch `batched_evm_v2`).
Therefore, I suspect that the slowdowns comes not from the db, but the
kzg library initialization.
## What's this PR about?
- Added states to be sent to diagnostics system for header downloader
monitor
- Added the code for sending the states through the tunnel
- Code added for updating the states in the header_algos.go file
---------
Co-authored-by: alex.sharov <AskAlexSharov@gmail.com>
feature: support generate parse transaction input bytes codes in
`abigen`.
It's easy to use abigen to generate code that help you parse the event
log and call the payable method with the transactor.
But parsing the transaction call data is missing. You can only send a
transaction with a transactor. This PR aims to generate codes that help
developer parse transaction calldata.
abigen can generate code to parse the transaction call data.
With this PR, transaction parse codes are generated like this:
```go
// CollectParams is an auto generated read-only Go binding of transcaction calldata params
type CollectParams struct {
Param_params INonfungiblePositionManagerCollectParams
}
// Parse Collect method from calldata of a transaction
//
// Solidity: function collect((uint256,address,uint128,uint128) params) payable returns(uint256 amount0, uint256 amount1)
func ParseCollect(calldata []byte) (*CollectParams, error) {
if len(calldata) <= 4 {
return nil, fmt.Errorf("invalid calldata input")
}
_abi, err := abi.JSON(strings.NewReader(UniswapABI))
if err != nil {
return nil, fmt.Errorf("failed to get abi of registry metadata: %w", err)
}
out, err := _abi.Methods["collect"].Inputs.Unpack(calldata[4:])
if err != nil {
return nil, fmt.Errorf("failed to unpack collect params data: %w", err)
}
var paramsResult = new(CollectParams)
value := reflect.ValueOf(paramsResult).Elem()
if value.NumField() != len(out) {
return nil, fmt.Errorf("failed to match calldata with param field number")
}
out0 := *abi.ConvertType(out[0], new(INonfungiblePositionManagerCollectParams)).(*INonfungiblePositionManagerCollectParams)
return &CollectParams{
Param_params: out0,
}, nil
}
```
Example of using `Parse` Function above:
```go
package bin
import (
"context"
"fmt"
"testing"
"github.com/ledgerwatch/erigon/common/hexutil"
"github.com/ledgerwatch/erigon/rpc"
"github.com/ledgerwatch/log/v3"
)
func TestOnParse(t *testing.T) {
cli, err := rpc.Dial("https://rpc.ankr.com/polygon", log.New(context.Background()))
if err != nil {
t.Fatal(err)
}
var collectTx struct {
Input string `json:"input"`
}
err = cli.CallContext(context.Background(), &collectTx, "eth_getTransactionByHash", "0x741146cce64d873cfe82ade413651de355a6db92f992e5bfc4e1c58d92f5dd5b")
if err != nil {
t.Fatal(err)
}
var increaseLiquidityTx struct {
Input string `json:"input"`
}
err = cli.CallContext(context.Background(), &increaseLiquidityTx, "eth_getTransactionByHash", "0x645ff650d7bfb9a74f573af474b9ebee48c3fadc7dac67257a8da6b55c71f338")
if err != nil {
t.Fatal(err)
}
fmt.Println(collectTx.Input)
fmt.Println(increaseLiquidityTx.Input)
collectBytes, _ := hexutil.Decode(collectTx.Input)
increaseLiquidityBytes, _ := hexutil.Decode(increaseLiquidityTx.Input)
collectInfo, err := ParseCollect(collectBytes)
if err != nil {
t.Fatal(err)
}
increaseLiquidityInfo, err := ParseIncreaseLiquidity(increaseLiquidityBytes)
if err != nil {
t.Fatal(err)
}
fmt.Printf("%+v\n", collectInfo)
fmt.Printf("%+v\n", increaseLiquidityInfo)
}
```
Output of code above:
&{Param_params:{TokenId:+894123
Recipient:0x48B8e4ed457da9B64c33Ee50Fd5490614833A37D
Amount0Max:+340282366920938463463374607431768211455
Amount1Max:+340282366920938463463374607431768211455}}
&{Param_params:{TokenId:+891904 Amount0Desired:+331092 Amount1Desired:+0
Amount0Min:+331092 Amount1Min:+0 Deadline:+1685112789}}
we update observability in the p2p layer for handlers, and also properly
encode error codes, close streams.
---------
Co-authored-by: Alex Sharov <AskAlexSharov@gmail.com>
Co-authored-by: Giulio <giulio.rebuffo@gmail.com>
Dirty hack to fix Chiado until #7151 is properly implemented. Should fix
the following error:
```
[WARN] [05-23|17:07:39.303] Verification failed for header hash=0x4eee718e5958a862746ea9a9531a16e6a404698d3a0e8120e8aff743b9f1e0a2 height=1 err="invalid gas limit: have 12500000, want 10000000 +-= 9764"
```
When mining is enabled, it waits for either a new block event, or a tx
notif or recommit interval before it starts mining the first block. This
PR achieves the following things:
- Start mining immediately (subsequent blocks will be mined via the new
head channel or miner.recommit timer).
- Modifies the conditions when it needs to look for new mining work
- Don't start mining on arrival of new transactions as it can be too
frequent (only for bor consensus as of now).
- Reset timer only if some work was done previously
- always RLock all snapshots - to guarantee consistency
- introduce class View (analog of RoTx and MakeContext)
- move read methods to View object
- View object will be managed by temporal_tx
---------
Co-authored-by: Alex Sharp <alexsharp@Alexs-MacBook-Pro-2.local>
## What's this PR is about?
Minor fix in args usage message of support flag. The current message
says that the flag should be 'metrics.url' but it reality it should be
'metrics.urls'