Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 0f5297b

Browse files
committedJun 6, 2024··
rpc: Fix incorrect txfeecap (#10636)
Fixes #10582
1 parent d04796e commit 0f5297b

17 files changed

+83
-60
lines changed
 

‎cmd/rpcdaemon/cli/httpcfg/http_cfg.go

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type HttpCfg struct {
4242

4343
API []string
4444
Gascap uint64
45+
Feecap float64
4546
MaxTraces uint64
4647
WebsocketPort int
4748
WebsocketEnabled bool

‎turbo/cli/flags.go

+1
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ func setEmbeddedRpcDaemon(ctx *cli.Context, cfg *nodecfg.Config, logger log.Logg
488488
DBReadConcurrency: ctx.Int(utils.DBReadConcurrencyFlag.Name),
489489
RpcAllowListFilePath: ctx.String(utils.RpcAccessListFlag.Name),
490490
Gascap: ctx.Uint64(utils.RpcGasCapFlag.Name),
491+
Feecap: ctx.Float64(utils.RPCGlobalTxFeeCapFlag.Name),
491492
MaxTraces: ctx.Uint64(utils.TraceMaxtracesFlag.Name),
492493
TraceCompatibility: ctx.Bool(utils.RpcTraceCompatFlag.Name),
493494
BatchLimit: ctx.Int(utils.RpcBatchLimit.Name),

‎turbo/engineapi/engine_server.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func (e *EngineServer) Start(
8989
) {
9090
base := jsonrpc.NewBaseApi(filters, stateCache, blockReader, agg, httpConfig.WithDatadir, httpConfig.EvmCallTimeout, engineReader, httpConfig.Dirs)
9191

92-
ethImpl := jsonrpc.NewEthAPI(base, db, eth, txPool, mining, httpConfig.Gascap, httpConfig.ReturnDataLimit, httpConfig.AllowUnprotectedTxs, httpConfig.MaxGetProofRewindBlockCount, httpConfig.WebsocketSubscribeLogsChannelSize, e.logger)
92+
ethImpl := jsonrpc.NewEthAPI(base, db, eth, txPool, mining, httpConfig.Gascap, httpConfig.Feecap, httpConfig.ReturnDataLimit, httpConfig.AllowUnprotectedTxs, httpConfig.MaxGetProofRewindBlockCount, httpConfig.WebsocketSubscribeLogsChannelSize, e.logger)
9393

9494
// engineImpl := NewEngineAPI(base, db, engineBackend)
9595
// e.startEngineMessageHandler()

‎turbo/jsonrpc/corner_cases_support_test.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import (
44
"context"
55
"testing"
66

7-
"github.com/ledgerwatch/erigon-lib/common"
87
"github.com/stretchr/testify/require"
98

9+
"github.com/ledgerwatch/erigon-lib/common"
10+
11+
"github.com/ledgerwatch/log/v3"
12+
1013
"github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest"
1114
"github.com/ledgerwatch/erigon/rpc"
12-
"github.com/ledgerwatch/log/v3"
1315
)
1416

1517
// TestNotFoundMustReturnNil - next methods - when record not found in db - must return nil instead of error
@@ -18,7 +20,7 @@ func TestNotFoundMustReturnNil(t *testing.T) {
1820
require := require.New(t)
1921
m, _, _ := rpcdaemontest.CreateTestSentry(t)
2022
api := NewEthAPI(newBaseApiForTest(m),
21-
m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
23+
m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
2224
ctx := context.Background()
2325

2426
a, err := api.GetTransactionByBlockNumberAndIndex(ctx, 10_000, 1)

‎turbo/jsonrpc/daemon.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package jsonrpc
22

33
import (
4+
"github.com/ledgerwatch/log/v3"
5+
46
"github.com/ledgerwatch/erigon-lib/gointerfaces/txpool"
7+
58
"github.com/ledgerwatch/erigon-lib/kv"
69
"github.com/ledgerwatch/erigon-lib/kv/kvcache"
710
libstate "github.com/ledgerwatch/erigon-lib/state"
@@ -12,7 +15,6 @@ import (
1215
"github.com/ledgerwatch/erigon/rpc"
1316
"github.com/ledgerwatch/erigon/turbo/rpchelper"
1417
"github.com/ledgerwatch/erigon/turbo/services"
15-
"github.com/ledgerwatch/log/v3"
1618
)
1719

1820
// APIList describes the list of available RPC apis
@@ -22,7 +24,7 @@ func APIList(db kv.RoDB, eth rpchelper.ApiBackend, txPool txpool.TxpoolClient, m
2224
logger log.Logger,
2325
) (list []rpc.API) {
2426
base := NewBaseApi(filters, stateCache, blockReader, agg, cfg.WithDatadir, cfg.EvmCallTimeout, engine, cfg.Dirs)
25-
ethImpl := NewEthAPI(base, db, eth, txPool, mining, cfg.Gascap, cfg.ReturnDataLimit, cfg.AllowUnprotectedTxs, cfg.MaxGetProofRewindBlockCount, cfg.WebsocketSubscribeLogsChannelSize, logger)
27+
ethImpl := NewEthAPI(base, db, eth, txPool, mining, cfg.Gascap, cfg.Feecap, cfg.ReturnDataLimit, cfg.AllowUnprotectedTxs, cfg.MaxGetProofRewindBlockCount, cfg.WebsocketSubscribeLogsChannelSize, logger)
2628
erigonImpl := NewErigonAPI(base, db, eth)
2729
txpoolImpl := NewTxPoolAPI(base, db, txPool)
2830
netImpl := NewNetAPIImpl(eth)

‎turbo/jsonrpc/debug_api_test.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import (
88

99
"github.com/davecgh/go-spew/spew"
1010
jsoniter "github.com/json-iterator/go"
11+
"github.com/ledgerwatch/log/v3"
12+
"github.com/stretchr/testify/require"
13+
1114
"github.com/ledgerwatch/erigon-lib/common"
1215
"github.com/ledgerwatch/erigon-lib/kv"
1316
"github.com/ledgerwatch/erigon-lib/kv/iter"
@@ -19,8 +22,6 @@ import (
1922
"github.com/ledgerwatch/erigon/rpc"
2023
"github.com/ledgerwatch/erigon/rpc/rpccfg"
2124
"github.com/ledgerwatch/erigon/turbo/adapter/ethapi"
22-
"github.com/ledgerwatch/log/v3"
23-
"github.com/stretchr/testify/require"
2425
)
2526

2627
var dumper = spew.ConfigState{Indent: " "}
@@ -52,7 +53,7 @@ func TestTraceBlockByNumber(t *testing.T) {
5253
agg := m.HistoryV3Components()
5354
stateCache := kvcache.New(kvcache.DefaultCoherentConfig)
5455
baseApi := NewBaseApi(nil, stateCache, m.BlockReader, agg, false, rpccfg.DefaultEvmCallTimeout, m.Engine, m.Dirs)
55-
ethApi := NewEthAPI(baseApi, m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
56+
ethApi := NewEthAPI(baseApi, m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
5657
api := NewPrivateDebugAPI(baseApi, m.DB, 0)
5758
for _, tt := range debugTraceTransactionTests {
5859
var buf bytes.Buffer
@@ -97,7 +98,7 @@ func TestTraceBlockByNumber(t *testing.T) {
9798

9899
func TestTraceBlockByHash(t *testing.T) {
99100
m, _, _ := rpcdaemontest.CreateTestSentry(t)
100-
ethApi := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
101+
ethApi := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
101102
api := NewPrivateDebugAPI(newBaseApiForTest(m), m.DB, 0)
102103
for _, tt := range debugTraceTransactionTests {
103104
var buf bytes.Buffer

‎turbo/jsonrpc/erigon_receipts_test.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ import (
77
"testing"
88

99
"github.com/holiman/uint256"
10-
libcommon "github.com/ledgerwatch/erigon-lib/common"
11-
"github.com/ledgerwatch/erigon-lib/kv"
1210
"github.com/stretchr/testify/assert"
1311
"github.com/stretchr/testify/require"
1412

13+
libcommon "github.com/ledgerwatch/erigon-lib/common"
14+
"github.com/ledgerwatch/erigon-lib/kv"
15+
16+
"github.com/ledgerwatch/log/v3"
17+
1518
"github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest"
1619
"github.com/ledgerwatch/erigon/common"
1720
"github.com/ledgerwatch/erigon/core"
@@ -22,14 +25,13 @@ import (
2225
"github.com/ledgerwatch/erigon/params"
2326
"github.com/ledgerwatch/erigon/rpc"
2427
"github.com/ledgerwatch/erigon/turbo/stages/mock"
25-
"github.com/ledgerwatch/log/v3"
2628
)
2729

2830
func TestGetLogs(t *testing.T) {
2931
assert := assert.New(t)
3032
m, _, _ := rpcdaemontest.CreateTestSentry(t)
3133
{
32-
ethApi := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
34+
ethApi := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
3335

3436
logs, err := ethApi.GetLogs(context.Background(), filters.FilterCriteria{FromBlock: big.NewInt(0), ToBlock: big.NewInt(10)})
3537
assert.NoError(err)

‎turbo/jsonrpc/eth_api.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ type APIImpl struct {
348348
gasCache *GasPriceCache
349349
db kv.RoDB
350350
GasCap uint64
351+
FeeCap float64
351352
ReturnDataLimit int
352353
AllowUnprotectedTxs bool
353354
MaxGetProofRewindBlockCount int
@@ -356,7 +357,7 @@ type APIImpl struct {
356357
}
357358

358359
// NewEthAPI returns APIImpl instance
359-
func NewEthAPI(base *BaseAPI, db kv.RoDB, eth rpchelper.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, gascap uint64, returnDataLimit int, allowUnprotectedTxs bool, maxGetProofRewindBlockCount int, subscribeLogsChannelSize int, logger log.Logger) *APIImpl {
360+
func NewEthAPI(base *BaseAPI, db kv.RoDB, eth rpchelper.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, gascap uint64, feecap float64, returnDataLimit int, allowUnprotectedTxs bool, maxGetProofRewindBlockCount int, subscribeLogsChannelSize int, logger log.Logger) *APIImpl {
360361
if gascap == 0 {
361362
gascap = uint64(math.MaxUint64 / 2)
362363
}
@@ -369,6 +370,7 @@ func NewEthAPI(base *BaseAPI, db kv.RoDB, eth rpchelper.ApiBackend, txPool txpoo
369370
mining: mining,
370371
gasCache: NewGasPriceCache(),
371372
GasCap: gascap,
373+
FeeCap: feecap,
372374
AllowUnprotectedTxs: allowUnprotectedTxs,
373375
ReturnDataLimit: returnDataLimit,
374376
MaxGetProofRewindBlockCount: maxGetProofRewindBlockCount,

‎turbo/jsonrpc/eth_api_test.go

+15-13
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,20 @@ import (
88
"github.com/ledgerwatch/erigon-lib/common/hexutil"
99

1010
"github.com/holiman/uint256"
11-
"github.com/ledgerwatch/erigon-lib/common"
1211
"github.com/stretchr/testify/assert"
1312

13+
"github.com/ledgerwatch/erigon-lib/common"
14+
1415
"github.com/ledgerwatch/erigon-lib/kv/kvcache"
1516
"github.com/ledgerwatch/erigon/core"
1617
"github.com/ledgerwatch/erigon/rpc"
1718
"github.com/ledgerwatch/erigon/rpc/rpccfg"
1819
"github.com/ledgerwatch/erigon/turbo/adapter/ethapi"
1920
"github.com/ledgerwatch/erigon/turbo/stages/mock"
2021

21-
"github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest"
2222
"github.com/ledgerwatch/log/v3"
23+
24+
"github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest"
2325
)
2426

2527
func newBaseApiForTest(m *mock.MockSentry) *BaseAPI {
@@ -55,7 +57,7 @@ func TestGetTransactionReceipt(t *testing.T) {
5557
db := m.DB
5658
agg := m.HistoryV3Components()
5759
stateCache := kvcache.New(kvcache.DefaultCoherentConfig)
58-
api := NewEthAPI(NewBaseApi(nil, stateCache, m.BlockReader, agg, false, rpccfg.DefaultEvmCallTimeout, m.Engine, m.Dirs), db, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
60+
api := NewEthAPI(NewBaseApi(nil, stateCache, m.BlockReader, agg, false, rpccfg.DefaultEvmCallTimeout, m.Engine, m.Dirs), db, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
5961
// Call GetTransactionReceipt for transaction which is not in the database
6062
if _, err := api.GetTransactionReceipt(context.Background(), common.Hash{}); err != nil {
6163
t.Errorf("calling GetTransactionReceipt with empty hash: %v", err)
@@ -64,7 +66,7 @@ func TestGetTransactionReceipt(t *testing.T) {
6466

6567
func TestGetTransactionReceiptUnprotected(t *testing.T) {
6668
m, _, _ := rpcdaemontest.CreateTestSentry(t)
67-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
69+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
6870
// Call GetTransactionReceipt for un-protected transaction
6971
if _, err := api.GetTransactionReceipt(context.Background(), common.HexToHash("0x3f3cb8a0e13ed2481f97f53f7095b9cbc78b6ffb779f2d3e565146371a8830ea")); err != nil {
7072
t.Errorf("calling GetTransactionReceipt for unprotected tx: %v", err)
@@ -76,7 +78,7 @@ func TestGetTransactionReceiptUnprotected(t *testing.T) {
7678
func TestGetStorageAt_ByBlockNumber_WithRequireCanonicalDefault(t *testing.T) {
7779
assert := assert.New(t)
7880
m, _, _ := rpcdaemontest.CreateTestSentry(t)
79-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
81+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
8082
addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
8183

8284
result, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithNumber(0))
@@ -90,7 +92,7 @@ func TestGetStorageAt_ByBlockNumber_WithRequireCanonicalDefault(t *testing.T) {
9092
func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault(t *testing.T) {
9193
assert := assert.New(t)
9294
m, _, _ := rpcdaemontest.CreateTestSentry(t)
93-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
95+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
9496
addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
9597

9698
result, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(m.Genesis.Hash(), false))
@@ -104,7 +106,7 @@ func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault(t *testing.T) {
104106
func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue(t *testing.T) {
105107
assert := assert.New(t)
106108
m, _, _ := rpcdaemontest.CreateTestSentry(t)
107-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
109+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
108110
addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
109111

110112
result, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(m.Genesis.Hash(), true))
@@ -117,7 +119,7 @@ func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue(t *testing.T) {
117119

118120
func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault_BlockNotFoundError(t *testing.T) {
119121
m, _, _ := rpcdaemontest.CreateTestSentry(t)
120-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
122+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
121123
addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
122124

123125
offChain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 1, func(i int, block *core.BlockGen) {
@@ -138,7 +140,7 @@ func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault_BlockNotFoundError
138140

139141
func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue_BlockNotFoundError(t *testing.T) {
140142
m, _, _ := rpcdaemontest.CreateTestSentry(t)
141-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
143+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
142144
addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
143145

144146
offChain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 1, func(i int, block *core.BlockGen) {
@@ -160,7 +162,7 @@ func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue_BlockNotFoundError(t
160162
func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault_NonCanonicalBlock(t *testing.T) {
161163
assert := assert.New(t)
162164
m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t)
163-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
165+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
164166
addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
165167

166168
orphanedBlock := orphanedChain[0].Blocks[0]
@@ -179,7 +181,7 @@ func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault_NonCanonicalBlock(
179181

180182
func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue_NonCanonicalBlock(t *testing.T) {
181183
m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t)
182-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
184+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
183185
addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
184186

185187
orphanedBlock := orphanedChain[0].Blocks[0]
@@ -195,7 +197,7 @@ func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue_NonCanonicalBlock(t *
195197

196198
func TestCall_ByBlockHash_WithRequireCanonicalDefault_NonCanonicalBlock(t *testing.T) {
197199
m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t)
198-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
200+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
199201
from := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
200202
to := common.HexToAddress("0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e")
201203

@@ -218,7 +220,7 @@ func TestCall_ByBlockHash_WithRequireCanonicalDefault_NonCanonicalBlock(t *testi
218220

219221
func TestCall_ByBlockHash_WithRequireCanonicalTrue_NonCanonicalBlock(t *testing.T) {
220222
m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t)
221-
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 100_000, false, 100_000, 128, log.New())
223+
api := NewEthAPI(newBaseApiForTest(m), m.DB, nil, nil, nil, 5000000, 1e18, 100_000, false, 100_000, 128, log.New())
222224
from := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7")
223225
to := common.HexToAddress("0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e")
224226

0 commit comments

Comments
 (0)
Please sign in to comment.