github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/keeper/keeper_parallel.go (about) 1 package keeper 2 3 import ( 4 "math/big" 5 "sync" 6 7 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 8 9 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 10 11 "github.com/fibonacci-chain/fbc/x/evm/types" 12 ) 13 14 func (k *Keeper) FixLog(tx []sdk.Tx, logIndex []int, hasEnterEvmTx []bool, anteErrs []error, resp []abci.ResponseDeliverTx) [][]byte { 15 txSize := len(logIndex) 16 res := make([][]byte, txSize, txSize) 17 logSize := uint(0) 18 txInBlock := -1 19 k.Bloom = new(big.Int) 20 21 for index := 0; index < txSize; index++ { 22 if hasEnterEvmTx[index] { 23 txInBlock++ 24 } 25 rs, ok := k.LogsManages.Get(logIndex[index]) 26 if ok && anteErrs[index] == nil && rs.ResultData != nil { 27 for _, v := range rs.ResultData.Logs { 28 v.Index = logSize 29 v.TxIndex = uint(txInBlock) 30 logSize++ 31 } 32 33 k.Bloom = k.Bloom.Or(k.Bloom, rs.ResultData.Bloom.Big()) 34 data, err := types.EncodeResultData(rs.ResultData) 35 if err != nil { 36 panic(err) 37 } 38 res[index] = data 39 } 40 // save transaction and transactionReceipt to watcher 41 k.saveParallelTxResult(tx[index], rs.ResultData, resp[index]) 42 } 43 44 return res 45 } 46 47 type LogsManager struct { 48 cnt int 49 mu sync.RWMutex 50 Results map[int]TxResult 51 } 52 53 func NewLogManager() *LogsManager { 54 return &LogsManager{ 55 mu: sync.RWMutex{}, 56 Results: make(map[int]TxResult), 57 } 58 } 59 60 func (l *LogsManager) Set(value TxResult) int { 61 l.mu.Lock() 62 defer l.mu.Unlock() 63 64 l.cnt++ 65 l.Results[l.cnt] = value 66 return l.cnt 67 } 68 69 func (l *LogsManager) Get(index int) (TxResult, bool) { 70 l.mu.RLock() 71 defer l.mu.RUnlock() 72 data, ok := l.Results[index] 73 return data, ok 74 } 75 76 func (l *LogsManager) Len() int { 77 l.mu.RLock() 78 defer l.mu.RUnlock() 79 return len(l.Results) 80 } 81 82 func (l *LogsManager) Reset() { 83 if l == nil { 84 return 85 } 86 for k := range l.Results { 87 delete(l.Results, k) 88 } 89 l.cnt = 0 90 } 91 92 type TxResult struct { 93 ResultData *types.ResultData 94 } 95 96 func (k *Keeper) saveParallelTxResult(tx sdk.Tx, resultData *types.ResultData, resp abci.ResponseDeliverTx) { 97 if !k.Watcher.Enabled() { 98 return 99 } 100 k.Watcher.SaveParallelTx(tx, resultData, resp) 101 }