Skip to content

Commit e5c3a1c

Browse files
author
yihuang
authored
Problem: parallel transaction execution is not supported (#414)
* Problem: go-block-stm is not integrated for parallel tx execution - integrate go-block-stm as tx executor - small optimiations fix * package deps * cleanup * update sdk deps * cleanup * cleanup * cleanup * Update server/config/config.go Signed-off-by: yihuang <[email protected]> * Update server/config/toml.go Signed-off-by: yihuang <[email protected]> * cleanup * cleanup * cleanup * fix default executor --------- Signed-off-by: yihuang <[email protected]>
1 parent 66df413 commit e5c3a1c

File tree

18 files changed

+216
-43
lines changed

18 files changed

+216
-43
lines changed

CHANGELOG.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ Ref: https://keepachangelog.com/en/1.0.0/
3737

3838
## Unreleased
3939

40+
### Features
41+
42+
* (evm) [#414](https://github.com/crypto-org-chain/ethermint/pull/414) Integrate go-block-stm for parallel tx execution.
43+
44+
### State Machine Breaking
45+
46+
* (rpc) [#443](https://github.com/crypto-org-chain/ethermint/pull/443) Keep behavior of random opcode as before.
47+
* (app) [#451](https://github.com/crypto-org-chain/ethermint/pull/451) Disable block gas meter, it's not compatible with parallel tx execution. It's safe to do as long as we checks total gas-wanted against block gas limit in process proposal, which we do in default handler.
48+
4049
### Bug Fixes
4150

4251
- (ante) [#422](https://github.com/crypto-org-chain/ethermint/pull/422) vendor `NewDeductFeeDecorator` to re-use the custom `checkTxFeeWithValidatorMinGasPrices` method, so it'll repsect the `DefaultPriorityReduction` config.
@@ -52,13 +61,6 @@ Ref: https://keepachangelog.com/en/1.0.0/
5261
* (evm) [#450](https://github.com/crypto-org-chain/ethermint/pull/450) Refactor transient stores to be compatible with parallel tx execution.
5362
* (evm) [#454](https://github.com/crypto-org-chain/ethermint/pull/454) Migrate transient stores to object stores.
5463

55-
### State Machine Breaking
56-
57-
* (rpc) [#443](https://github.com/crypto-org-chain/ethermint/pull/443) Keep behavior of random opcode as before.
58-
* (app) [#451](https://github.com/crypto-org-chain/ethermint/pull/451) Disable block gas meter, it's not compatible with parallel tx execution. It's safe to do as long as we checks total gas-wanted against block gas limit in process proposal, which we do in default handler.
59-
60-
### Features
61-
6264
## v0.21.x-cronos
6365

6466
### Features

app/app.go

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"net/http"
2424
"os"
2525
"path/filepath"
26+
"sort"
2627

2728
autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
2829
reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1"
@@ -131,6 +132,7 @@ import (
131132
"github.com/evmos/ethermint/app/ante"
132133
"github.com/evmos/ethermint/encoding"
133134
"github.com/evmos/ethermint/ethereum/eip712"
135+
srvconfig "github.com/evmos/ethermint/server/config"
134136
srvflags "github.com/evmos/ethermint/server/flags"
135137
ethermint "github.com/evmos/ethermint/types"
136138
"github.com/evmos/ethermint/x/evm"
@@ -314,7 +316,6 @@ func NewEthermintApp(
314316
bApp.SetVersion(version.Version)
315317
bApp.SetInterfaceRegistry(interfaceRegistry)
316318
bApp.SetTxEncoder(txConfig.TxEncoder())
317-
bApp.SetTxExecutor(DefaultTxExecutor)
318319
bApp.SetDisableBlockGasMeter(true)
319320

320321
keys := storetypes.NewKVStoreKeys(
@@ -354,6 +355,18 @@ func NewEthermintApp(
354355
okeys: okeys,
355356
}
356357

358+
executor := cast.ToString(appOpts.Get(srvflags.EVMBlockExecutor))
359+
switch executor {
360+
case srvconfig.BlockExecutorBlockSTM:
361+
sdk.SetAddrCacheEnabled(false)
362+
workers := cast.ToInt(appOpts.Get(srvflags.EVMBlockSTMWorkers))
363+
app.SetTxExecutor(STMTxExecutor(app.GetStoreKeys(), workers))
364+
case "", srvconfig.BlockExecutorSequential:
365+
app.SetTxExecutor(DefaultTxExecutor)
366+
default:
367+
panic(fmt.Errorf("unknown EVM block executor: %s", executor))
368+
}
369+
357370
// init params keeper and subspaces
358371
app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey])
359372

@@ -981,6 +994,25 @@ func (app *EthermintApp) GetMemKey(storeKey string) *storetypes.MemoryStoreKey {
981994
return app.memKeys[storeKey]
982995
}
983996

997+
// GetStoreKeys returns all the stored store keys.
998+
func (app *EthermintApp) GetStoreKeys() []storetypes.StoreKey {
999+
keys := make([]storetypes.StoreKey, 0, len(app.keys))
1000+
for _, key := range app.keys {
1001+
keys = append(keys, key)
1002+
}
1003+
for _, key := range app.tkeys {
1004+
keys = append(keys, key)
1005+
}
1006+
for _, key := range app.memKeys {
1007+
keys = append(keys, key)
1008+
}
1009+
for _, key := range app.okeys {
1010+
keys = append(keys, key)
1011+
}
1012+
sort.SliceStable(keys, func(i, j int) bool { return keys[i].Name() < keys[j].Name() })
1013+
return keys
1014+
}
1015+
9841016
// GetSubspace returns a param subspace for a given module name.
9851017
//
9861018
// NOTE: This is solely to be used for testing purposes.

app/executor.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@ package app
22

33
import (
44
"context"
5+
"io"
56

7+
"cosmossdk.io/store/cachemulti"
68
storetypes "cosmossdk.io/store/types"
79
abci "github.com/cometbft/cometbft/abci/types"
810
evmtypes "github.com/evmos/ethermint/x/evm/types"
11+
12+
"github.com/cosmos/cosmos-sdk/baseapp"
13+
14+
blockstm "github.com/crypto-org-chain/go-block-stm"
915
)
1016

1117
func DefaultTxExecutor(_ context.Context,
@@ -19,3 +25,105 @@ func DefaultTxExecutor(_ context.Context,
1925
}
2026
return evmtypes.PatchTxResponses(results), nil
2127
}
28+
29+
func STMTxExecutor(stores []storetypes.StoreKey, workers int) baseapp.TxExecutor {
30+
index := make(map[storetypes.StoreKey]int, len(stores))
31+
for i, k := range stores {
32+
index[k] = i
33+
}
34+
return func(
35+
ctx context.Context,
36+
blockSize int,
37+
ms storetypes.MultiStore,
38+
deliverTxWithMultiStore func(int, storetypes.MultiStore) *abci.ExecTxResult,
39+
) ([]*abci.ExecTxResult, error) {
40+
if blockSize == 0 {
41+
return nil, nil
42+
}
43+
results := make([]*abci.ExecTxResult, blockSize)
44+
if err := blockstm.ExecuteBlock(
45+
ctx,
46+
blockSize,
47+
index,
48+
stmMultiStoreWrapper{ms},
49+
workers,
50+
func(txn blockstm.TxnIndex, ms blockstm.MultiStore) {
51+
result := deliverTxWithMultiStore(int(txn), msWrapper{ms})
52+
results[txn] = result
53+
},
54+
); err != nil {
55+
return nil, err
56+
}
57+
58+
return evmtypes.PatchTxResponses(results), nil
59+
}
60+
}
61+
62+
type msWrapper struct {
63+
blockstm.MultiStore
64+
}
65+
66+
var _ storetypes.MultiStore = msWrapper{}
67+
68+
func (ms msWrapper) getCacheWrapper(key storetypes.StoreKey) storetypes.CacheWrapper {
69+
return ms.GetStore(key)
70+
}
71+
72+
func (ms msWrapper) GetStore(key storetypes.StoreKey) storetypes.Store {
73+
return ms.MultiStore.GetStore(key)
74+
}
75+
76+
func (ms msWrapper) GetKVStore(key storetypes.StoreKey) storetypes.KVStore {
77+
return ms.MultiStore.GetKVStore(key)
78+
}
79+
80+
func (ms msWrapper) GetObjKVStore(key storetypes.StoreKey) storetypes.ObjKVStore {
81+
return ms.MultiStore.GetObjKVStore(key)
82+
}
83+
84+
func (ms msWrapper) CacheMultiStore() storetypes.CacheMultiStore {
85+
return cachemulti.NewFromParent(ms.getCacheWrapper, nil, nil)
86+
}
87+
88+
// Implements CacheWrapper.
89+
func (ms msWrapper) CacheWrap() storetypes.CacheWrap {
90+
return ms.CacheMultiStore().(storetypes.CacheWrap)
91+
}
92+
93+
// GetStoreType returns the type of the store.
94+
func (ms msWrapper) GetStoreType() storetypes.StoreType {
95+
return storetypes.StoreTypeMulti
96+
}
97+
98+
// Implements interface MultiStore
99+
func (ms msWrapper) SetTracer(io.Writer) storetypes.MultiStore {
100+
return nil
101+
}
102+
103+
// Implements interface MultiStore
104+
func (ms msWrapper) SetTracingContext(storetypes.TraceContext) storetypes.MultiStore {
105+
return nil
106+
}
107+
108+
// Implements interface MultiStore
109+
func (ms msWrapper) TracingEnabled() bool {
110+
return false
111+
}
112+
113+
type stmMultiStoreWrapper struct {
114+
storetypes.MultiStore
115+
}
116+
117+
var _ blockstm.MultiStore = stmMultiStoreWrapper{}
118+
119+
func (ms stmMultiStoreWrapper) GetStore(key storetypes.StoreKey) storetypes.Store {
120+
return ms.MultiStore.GetStore(key)
121+
}
122+
123+
func (ms stmMultiStoreWrapper) GetKVStore(key storetypes.StoreKey) storetypes.KVStore {
124+
return ms.MultiStore.GetKVStore(key)
125+
}
126+
127+
func (ms stmMultiStoreWrapper) GetObjKVStore(key storetypes.StoreKey) storetypes.ObjKVStore {
128+
return ms.MultiStore.GetObjKVStore(key)
129+
}

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ require (
2828
github.com/cosmos/ibc-go/modules/capability v1.0.0
2929
github.com/cosmos/ibc-go/v8 v8.1.0
3030
github.com/cosmos/rosetta v0.50.3-1
31+
github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde
3132
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
3233
github.com/ethereum/go-ethereum v1.10.26
3334
github.com/gogo/protobuf v1.3.2
@@ -242,15 +243,16 @@ require (
242243

243244
replace (
244245
// release/v0.50.x
245-
cosmossdk.io/store => github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240403085742-29d3142f7596
246+
cosmossdk.io/store => github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240408014408-56c165536d0a
246247
// use cosmos keyring
247248
github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0
248249
github.com/cockroachdb/pebble => github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811
249250
// release/v0.50.x
250-
github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240403085742-29d3142f7596
251+
github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240408014408-56c165536d0a
251252
github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e
252253
// Fix upstream GHSA-h395-qcrw-5vmq vulnerability.
253254
// TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409
254255
github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0
255256
github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
257+
github.com/tidwall/btree => github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c
256258
)

go.sum

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,14 @@ github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6
413413
github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U=
414414
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
415415
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
416-
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240403085742-29d3142f7596 h1:0GboNOKFdX+T9VmuMa/qW+s/XCjwgcqjomQ9Si6bm28=
417-
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240403085742-29d3142f7596/go.mod h1:nRk8EA8/fEG4zSme2i/Rq5z3k7TrlsHkOYhrY79hhD8=
418-
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240403085742-29d3142f7596 h1:NUjIepL9YhwwhpyefOiJIU2lm5dI+qhsJ9sPyTrMFCY=
419-
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240403085742-29d3142f7596/go.mod h1:lfuLI1f4o+0SGtlHQS4x5qsjRcZZfYqG8bp3k8hM0M8=
416+
github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c h1:MOgfS4+FBB8cMkDE2j2VBVsbY+HCkPIu0YsJ/9bbGeQ=
417+
github.com/crypto-org-chain/btree v0.0.0-20240406140148-2687063b042c/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
418+
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240408014408-56c165536d0a h1:3IiFpiRRiF0lFCJcKGEu6UafcqzRUwUUl75aXan9pJI=
419+
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240408014408-56c165536d0a/go.mod h1:nRk8EA8/fEG4zSme2i/Rq5z3k7TrlsHkOYhrY79hhD8=
420+
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240408014408-56c165536d0a h1:YHeIe/VPKf7xK7xxLWUzvspFZJY6fDT6Epj+MH9dLOc=
421+
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240408014408-56c165536d0a/go.mod h1:lfuLI1f4o+0SGtlHQS4x5qsjRcZZfYqG8bp3k8hM0M8=
422+
github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde h1:sQIHTJfVt5VTrF7po9eZiFkZiPjlHbFvnXtGCOoBjNM=
423+
github.com/crypto-org-chain/go-block-stm v0.0.0-20240408011717-9f11af197bde/go.mod h1:iwQTX9xMX8NV9k3o2BiWXA0SswpsZrDk5q3gA7nWYiE=
420424
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e h1:vnyepPQ/m25+19xcTuBUdRxmltZ/EjVWNqEjhg7Ummk=
421425
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y=
422426
github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
@@ -1093,8 +1097,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70
10931097
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
10941098
github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
10951099
github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
1096-
github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
1097-
github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
1100+
github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE=
1101+
github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU=
10981102
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
10991103
github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
11001104
github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=

gomod2nix.toml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ schema = 3
4141
version = "v1.3.0"
4242
hash = "sha256-EEFK43Cr0g0ndhQhkIKher0FqV3mvkmE9z0sP7uVSHg="
4343
[mod."cosmossdk.io/store"]
44-
version = "v0.0.0-20240403085742-29d3142f7596"
45-
hash = "sha256-wV4pdty1onr51ZtRWS1MSR4sH3rptsLL+Zc3dPuvlIA="
44+
version = "v0.0.0-20240408014408-56c165536d0a"
45+
hash = "sha256-5fFhveNdA4rEwtTVNE4MIzK7udgNF80q9fkiDcw7T/Q="
4646
replaced = "github.com/crypto-org-chain/cosmos-sdk/store"
4747
[mod."cosmossdk.io/tools/confix"]
4848
version = "v0.1.1"
@@ -161,8 +161,8 @@ schema = 3
161161
version = "v1.0.0-beta.4"
162162
hash = "sha256-5Kn82nsZfiEtuwhhLZqmMxdAY1tX/Fi3HJ0/MEaRohw="
163163
[mod."github.com/cosmos/cosmos-sdk"]
164-
version = "v0.46.0-beta2.0.20240403085742-29d3142f7596"
165-
hash = "sha256-qIvDAFwGrFIOxPGUazpfR3mu9X3eJqkbBJWQUwhP2hY="
164+
version = "v0.46.0-beta2.0.20240408014408-56c165536d0a"
165+
hash = "sha256-xjZvl0pxsEkSW2X8Q37mPHXAHnMeHiwCtX2FmDZVUHQ="
166166
replaced = "github.com/crypto-org-chain/cosmos-sdk"
167167
[mod."github.com/cosmos/go-bip39"]
168168
version = "v1.0.0"
@@ -200,6 +200,9 @@ schema = 3
200200
[mod."github.com/creachadair/tomledit"]
201201
version = "v0.0.24"
202202
hash = "sha256-4vUukHONOjNn0qfQr4esK6TWfPWsIp+rbdz65og84lw="
203+
[mod."github.com/crypto-org-chain/go-block-stm"]
204+
version = "v0.0.0-20240408011717-9f11af197bde"
205+
hash = "sha256-+UTSUoh4DxkWPQEc/j0atak1Oxq3tdP8r6ZMmB0k5KE="
203206
[mod."github.com/danieljoos/wincred"]
204207
version = "v1.2.0"
205208
hash = "sha256-LHcvTJCc8++bFndbd8ZgMSTe4L5h2C4rN+cSWHCz54Y="
@@ -566,8 +569,9 @@ schema = 3
566569
version = "v0.16.0"
567570
hash = "sha256-JW4zO/0vMzf1dXLePOqaMtiLUZgNbuIseh9GV+jQlf0="
568571
[mod."github.com/tidwall/btree"]
569-
version = "v1.7.0"
570-
hash = "sha256-bnr6c7a0nqo2HyGqxHk0kEZCEsjLYkPbAVY9WzaZ30o="
572+
version = "v0.0.0-20240406140148-2687063b042c"
573+
hash = "sha256-8eDLGHhw4qXG6MEa7w5Q9KLwOobXr8Vn5qqyQhuipQw="
574+
replaced = "github.com/crypto-org-chain/btree"
571575
[mod."github.com/tidwall/gjson"]
572576
version = "v1.14.4"
573577
hash = "sha256-3DS2YNL95wG0qSajgRtIABD32J+oblaKVk8LIw+KSOc="

server/config/config.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,18 @@ const (
9797

9898
// DefaultRosettaDenomToSuggest defines the default denom for fee suggestion
9999
DefaultRosettaDenomToSuggest = "basecro"
100+
101+
BlockExecutorSequential = "sequential"
102+
BlockExecutorBlockSTM = "block-stm"
100103
)
101104

102105
var (
103106
// DefaultRosettaGasPrices defines the default list of prices to suggest
104107
DefaultRosettaGasPrices = sdk.NewDecCoins(sdk.NewDecCoin(DefaultRosettaDenomToSuggest, sdkmath.NewInt(4_000_000)))
105108

106109
evmTracers = []string{"json", "markdown", "struct", "access_list"}
110+
111+
blockExecutors = []string{BlockExecutorSequential, BlockExecutorBlockSTM}
107112
)
108113

109114
// Config defines the server's top level configuration. It includes the default app config
@@ -124,6 +129,10 @@ type EVMConfig struct {
124129
Tracer string `mapstructure:"tracer"`
125130
// MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode.
126131
MaxTxGasWanted uint64 `mapstructure:"max-tx-gas-wanted"`
132+
// BlockExecutor set block executor type, "block-stm" for parallel execution, "sequential" for sequential execution.
133+
BlockExecutor string `mapstructure:"block-executor"`
134+
// BlockSTMWorkers is the number of workers for block-stm execution, `0` means using all available CPUs.
135+
BlockSTMWorkers int `mapstructure:"block-stm-workers"`
127136
}
128137

129138
// JSONRPCConfig defines configuration for the EVM RPC server.
@@ -238,6 +247,7 @@ func DefaultEVMConfig() *EVMConfig {
238247
return &EVMConfig{
239248
Tracer: DefaultEVMTracer,
240249
MaxTxGasWanted: DefaultMaxTxGasWanted,
250+
BlockExecutor: BlockExecutorSequential,
241251
}
242252
}
243253

@@ -247,6 +257,10 @@ func (c EVMConfig) Validate() error {
247257
return fmt.Errorf("invalid tracer type %s, available types: %v", c.Tracer, evmTracers)
248258
}
249259

260+
if !strings.StringInSlice(c.BlockExecutor, blockExecutors) {
261+
return fmt.Errorf("invalid block executor type %s, available types: %v", c.BlockExecutor, blockExecutors)
262+
}
263+
250264
return nil
251265
}
252266

@@ -392,8 +406,10 @@ func GetConfig(v *viper.Viper) (Config, error) {
392406
return Config{
393407
Config: cfg,
394408
EVM: EVMConfig{
395-
Tracer: v.GetString("evm.tracer"),
396-
MaxTxGasWanted: v.GetUint64("evm.max-tx-gas-wanted"),
409+
Tracer: v.GetString("evm.tracer"),
410+
MaxTxGasWanted: v.GetUint64("evm.max-tx-gas-wanted"),
411+
BlockExecutor: v.GetString("evm.block-executor"),
412+
BlockSTMWorkers: v.GetInt("evm.block-stm-workers"),
397413
},
398414
JSONRPC: JSONRPCConfig{
399415
Enable: v.GetBool("json-rpc.enable"),

server/config/toml.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ tracer = "{{ .EVM.Tracer }}"
3131
# MaxTxGasWanted defines the gas wanted for each eth tx returned in ante handler in check tx mode.
3232
max-tx-gas-wanted = {{ .EVM.MaxTxGasWanted }}
3333
34+
# BlockExecutor set block executor type, "block-stm" for parallel execution, "sequential" for sequential execution.
35+
block-executor = "{{ .EVM.BlockExecutor }}"
36+
# BlockSTMWorkers is the number of workers for block-stm execution, 0 means using all available CPUs.
37+
block-stm-workers = {{ .EVM.BlockSTMWorkers }}
38+
3439
###############################################################################
3540
### JSON RPC Configuration ###
3641
###############################################################################

0 commit comments

Comments
 (0)