11package app
22
33import (
4- "context"
5- "io"
64 "sync"
7- "sync/atomic"
85
96 "cosmossdk.io/collections"
10- "cosmossdk.io/log"
11- "cosmossdk.io/store/cachemulti"
12- storetypes "cosmossdk.io/store/types"
13- abci "github.com/cometbft/cometbft/abci/types"
14- cmtproto "github.com/cometbft/cometbft/proto/tendermint/types"
157 authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
168 banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
179 evmtypes "github.com/evmos/ethermint/x/evm/types"
1810
19- "github.com/cosmos/cosmos-sdk/baseapp"
2011 sdk "github.com/cosmos/cosmos-sdk/types"
2112
2213 blockstm "github.com/crypto-org-chain/go-block-stm"
@@ -26,156 +17,6 @@ type evmKeeper interface {
2617 GetParams (ctx sdk.Context ) evmtypes.Params
2718}
2819
29- func STMTxExecutor (
30- stores []storetypes.StoreKey ,
31- workers int ,
32- estimate bool ,
33- evmKeeper evmKeeper ,
34- txDecoder sdk.TxDecoder ,
35- ) baseapp.TxExecutor {
36- var authStore , bankStore int
37- index := make (map [storetypes.StoreKey ]int , len (stores ))
38- for i , k := range stores {
39- switch k .Name () {
40- case authtypes .StoreKey :
41- authStore = i
42- case banktypes .StoreKey :
43- bankStore = i
44- }
45- index [k ] = i
46- }
47- return func (
48- ctx context.Context ,
49- txs [][]byte ,
50- ms storetypes.MultiStore ,
51- deliverTxWithMultiStore func (int , sdk.Tx , storetypes.MultiStore , map [string ]any ) * abci.ExecTxResult ,
52- patcher baseapp.TxResponsePatcher ,
53- ) ([]* abci.ExecTxResult , error ) {
54- blockSize := len (txs )
55- if blockSize == 0 {
56- return nil , nil
57- }
58- results := make ([]* abci.ExecTxResult , blockSize )
59- incarnationCache := make ([]atomic.Pointer [map [string ]any ], blockSize )
60- for i := 0 ; i < blockSize ; i ++ {
61- m := make (map [string ]any )
62- incarnationCache [i ].Store (& m )
63- }
64-
65- var (
66- estimates []blockstm.MultiLocations
67- memTxs []sdk.Tx
68- )
69- if estimate {
70- // pre-estimation
71- evmDenom := evmKeeper .GetParams (sdk .NewContext (ms , cmtproto.Header {}, false , log .NewNopLogger ())).EvmDenom
72- memTxs , estimates = preEstimates (txs , workers , authStore , bankStore , evmDenom , txDecoder )
73- }
74-
75- if err := blockstm .ExecuteBlockWithEstimates (
76- ctx ,
77- blockSize ,
78- index ,
79- stmMultiStoreWrapper {ms },
80- workers ,
81- estimates ,
82- func (txn blockstm.TxnIndex , ms blockstm.MultiStore ) {
83- var cache map [string ]any
84-
85- // only one of the concurrent incarnations gets the cache if there are any, otherwise execute without
86- // cache, concurrent incarnations should be rare.
87- v := incarnationCache [txn ].Swap (nil )
88- if v != nil {
89- cache = * v
90- }
91-
92- var memTx sdk.Tx
93- if memTxs != nil {
94- memTx = memTxs [txn ]
95- }
96- results [txn ] = deliverTxWithMultiStore (int (txn ), memTx , msWrapper {ms }, cache )
97-
98- if v != nil {
99- incarnationCache [txn ].Store (v )
100- }
101- },
102- ); err != nil {
103- return nil , err
104- }
105-
106- return patcher .Patch (results ), nil
107- }
108- }
109-
110- type msWrapper struct {
111- blockstm.MultiStore
112- }
113-
114- var _ storetypes.MultiStore = msWrapper {}
115-
116- func (ms msWrapper ) getCacheWrapper (key storetypes.StoreKey ) storetypes.CacheWrapper {
117- return ms .GetStore (key )
118- }
119-
120- func (ms msWrapper ) GetStore (key storetypes.StoreKey ) storetypes.Store {
121- return ms .MultiStore .GetStore (key )
122- }
123-
124- func (ms msWrapper ) GetKVStore (key storetypes.StoreKey ) storetypes.KVStore {
125- return ms .MultiStore .GetKVStore (key )
126- }
127-
128- func (ms msWrapper ) GetObjKVStore (key storetypes.StoreKey ) storetypes.ObjKVStore {
129- return ms .MultiStore .GetObjKVStore (key )
130- }
131-
132- func (ms msWrapper ) CacheMultiStore () storetypes.CacheMultiStore {
133- return cachemulti .NewFromParent (ms .getCacheWrapper , nil , nil )
134- }
135-
136- // Implements CacheWrapper.
137- func (ms msWrapper ) CacheWrap () storetypes.CacheWrap {
138- return ms .CacheMultiStore ().(storetypes.CacheWrap )
139- }
140-
141- // GetStoreType returns the type of the store.
142- func (ms msWrapper ) GetStoreType () storetypes.StoreType {
143- return storetypes .StoreTypeMulti
144- }
145-
146- // Implements interface MultiStore
147- func (ms msWrapper ) SetTracer (io.Writer ) storetypes.MultiStore {
148- return nil
149- }
150-
151- // Implements interface MultiStore
152- func (ms msWrapper ) SetTracingContext (storetypes.TraceContext ) storetypes.MultiStore {
153- return nil
154- }
155-
156- // Implements interface MultiStore
157- func (ms msWrapper ) TracingEnabled () bool {
158- return false
159- }
160-
161- type stmMultiStoreWrapper struct {
162- storetypes.MultiStore
163- }
164-
165- var _ blockstm.MultiStore = stmMultiStoreWrapper {}
166-
167- func (ms stmMultiStoreWrapper ) GetStore (key storetypes.StoreKey ) storetypes.Store {
168- return ms .MultiStore .GetStore (key )
169- }
170-
171- func (ms stmMultiStoreWrapper ) GetKVStore (key storetypes.StoreKey ) storetypes.KVStore {
172- return ms .MultiStore .GetKVStore (key )
173- }
174-
175- func (ms stmMultiStoreWrapper ) GetObjKVStore (key storetypes.StoreKey ) storetypes.ObjKVStore {
176- return ms .MultiStore .GetObjKVStore (key )
177- }
178-
17920// preEstimates returns a static estimation of the written keys for each transaction.
18021// NOTE: make sure it sync with the latest sdk logic when sdk upgrade.
18122func preEstimates (txs [][]byte , workers , authStore , bankStore int , evmDenom string , txDecoder sdk.TxDecoder ) ([]sdk.Tx , []blockstm.MultiLocations ) {
0 commit comments