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  }