mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-04-04 15:55:23 +00:00 
			
		
		
		
	update
This commit is contained in:
		
							parent
							
								
									6df54c84b5
								
							
						
					
					
						commit
						7900795654
					
				| @ -114,7 +114,7 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan | |||||||
| 			return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()} | 			return abci.ResponsePrepareProposal{Txs: h.txSelector.SelectedTxs()} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		txnInfoMap := make(map[string][]txnInfo, h.mempool.CountTx()) | 		txnInfoMap := make(map[string][]*txnInfo, h.mempool.CountTx()) | ||||||
| 
 | 
 | ||||||
| 		iterator := h.mempool.Select(ctx, req.Txs) | 		iterator := h.mempool.Select(ctx, req.Txs) | ||||||
| 		selectedTxsSignersSeqs := make(map[string]uint64) | 		selectedTxsSignersSeqs := make(map[string]uint64) | ||||||
| @ -156,10 +156,10 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan | |||||||
| 							} | 							} | ||||||
| 
 | 
 | ||||||
| 							if _, exists := txnInfoMap[signer]; !exists { | 							if _, exists := txnInfoMap[signer]; !exists { | ||||||
| 								txnInfoMap[signer] = make([]txnInfo, 0, 128) | 								txnInfoMap[signer] = make([]*txnInfo, 0, 128) | ||||||
| 							} | 							} | ||||||
| 
 | 
 | ||||||
| 							txnInfoMap[signer] = append(txnInfoMap[signer], txnInfo{ | 							txnInfoMap[signer] = append(txnInfoMap[signer], &txnInfo{ | ||||||
| 								gasPrice: ethTx.GasPrice(), | 								gasPrice: ethTx.GasPrice(), | ||||||
| 								gasLimit: ethTx.Gas(), | 								gasLimit: ethTx.Gas(), | ||||||
| 								nonce:    nonce, | 								nonce:    nonce, | ||||||
| @ -175,13 +175,13 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan | |||||||
| 					signer := sdk.AccAddress(sigs[0].PubKey.Address()).String() | 					signer := sdk.AccAddress(sigs[0].PubKey.Address()).String() | ||||||
| 
 | 
 | ||||||
| 					if _, exists := txnInfoMap[signer]; !exists { | 					if _, exists := txnInfoMap[signer]; !exists { | ||||||
| 						txnInfoMap[signer] = make([]txnInfo, 0, 16) | 						txnInfoMap[signer] = make([]*txnInfo, 0, 16) | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					evmGasPrice, err := utilCosmosDemonGasPriceToEvmDemonGasPrice(fee.GetAmount()) | 					evmGasPrice, err := utilCosmosDemonGasPriceToEvmDemonGasPrice(fee.GetAmount()) | ||||||
| 
 | 
 | ||||||
| 					if err == nil { | 					if err == nil { | ||||||
| 						txnInfoMap[signer] = append(txnInfoMap[signer], txnInfo{ | 						txnInfoMap[signer] = append(txnInfoMap[signer], &txnInfo{ | ||||||
| 							gasPrice: evmGasPrice, | 							gasPrice: evmGasPrice, | ||||||
| 							gasLimit: utilCosmosDemonGasLimitToEvmDemonGasLimit(fee.GetGas()), | 							gasLimit: utilCosmosDemonGasLimitToEvmDemonGasLimit(fee.GetGas()), | ||||||
| 							nonce:    sigs[0].Sequence, | 							nonce:    sigs[0].Sequence, | ||||||
| @ -255,44 +255,39 @@ func (h *DefaultProposalHandler) PrepareProposalHandler() sdk.PrepareProposalHan | |||||||
| 			h.feemarketKeeper.SetSuggestionGasPrice(ctx, big.NewInt(0)) | 			h.feemarketKeeper.SetSuggestionGasPrice(ctx, big.NewInt(0)) | ||||||
| 		} else { | 		} else { | ||||||
| 			senderCnt := 0 | 			senderCnt := 0 | ||||||
|  | 			txnCnt := 0 | ||||||
| 			for sender := range txnInfoMap { | 			for sender := range txnInfoMap { | ||||||
| 				sort.Slice(txnInfoMap[sender], func(i, j int) bool { | 				sort.Slice(txnInfoMap[sender], func(i, j int) bool { | ||||||
| 					return txnInfoMap[sender][i].nonce < txnInfoMap[sender][j].nonce | 					return txnInfoMap[sender][i].nonce < txnInfoMap[sender][j].nonce | ||||||
| 				}) | 				}) | ||||||
|  | 				txnCnt += len(txnInfoMap[sender]) | ||||||
| 				senderCnt++ | 				senderCnt++ | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			remaing := gasPriceSuggestionBlockNum * int64(maxBlockGas) | 			remaing := gasPriceSuggestionBlockNum * int64(maxBlockGas) | ||||||
| 			for senderCnt > 0 && remaing > 0 { | 			for len(txnInfoMap) > 0 && remaing > 0 { | ||||||
| 				// peek top
 | 
 | ||||||
| 				txnInfoSlice := make([]txnInfo, 0, senderCnt) | 				// peek each sender's top
 | ||||||
|  | 				sortSlice := make([]*txnInfo, 0, senderCnt) | ||||||
| 				for sender := range txnInfoMap { | 				for sender := range txnInfoMap { | ||||||
| 					txnInfoSlice = append(txnInfoSlice, txnInfoMap[sender][0]) | 					endIndex := findFirstContinuousDecreasingSubsequence(txnInfoMap[sender]) | ||||||
| 				} | 					appendSlice := txnInfoMap[sender][:endIndex] | ||||||
| 
 | 					sortSlice = append(sortSlice, appendSlice...) | ||||||
| 				sort.Slice(txnInfoSlice, func(i, j int) bool { | 					txnInfoMap[sender] = txnInfoMap[sender][endIndex:] | ||||||
| 					return txnInfoSlice[i].gasPrice.Cmp(txnInfoSlice[j].gasPrice) > 0 | 					if len(txnInfoMap[sender]) == 0 { | ||||||
| 				}) | 						delete(txnInfoMap, sender) | ||||||
| 
 |  | ||||||
| 				for i := range txnInfoSlice { |  | ||||||
| 					remaing -= int64(txnInfoSlice[i].gasLimit) |  | ||||||
| 					if remaing <= 0 { |  | ||||||
| 						h.feemarketKeeper.SetSuggestionGasPrice(ctx, txnInfoSlice[i].gasPrice) |  | ||||||
| 						break |  | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				// pop
 | 				sort.Slice(sortSlice, func(i, j int) bool { | ||||||
| 				if remaing > 0 { | 					return sortSlice[i].gasPrice.Cmp(sortSlice[j].gasPrice) > 0 | ||||||
| 					senderCnt = 0 | 				}) | ||||||
| 					for sender := range txnInfoMap { | 
 | ||||||
| 						cnt := len(txnInfoMap[sender]) | 				for i := range sortSlice { | ||||||
| 						if cnt > 1 { | 					remaing -= int64(sortSlice[i].gasLimit) | ||||||
| 							txnInfoMap[sender] = txnInfoMap[sender][1:] | 					if remaing <= 0 { | ||||||
| 							senderCnt++ | 						h.feemarketKeeper.SetSuggestionGasPrice(ctx, sortSlice[i].gasPrice) | ||||||
| 						} else { | 						break | ||||||
| 							delete(txnInfoMap, sender) |  | ||||||
| 						} |  | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| @ -459,3 +454,25 @@ func utilCosmosDemonGasPriceToEvmDemonGasPrice(gasGroup sdk.Coins) (*big.Int, er | |||||||
| func utilCosmosDemonGasLimitToEvmDemonGasLimit(gasLimit uint64) uint64 { | func utilCosmosDemonGasLimitToEvmDemonGasLimit(gasLimit uint64) uint64 { | ||||||
| 	return gasLimit * chaincfg.GasDenomConversionMultiplier | 	return gasLimit * chaincfg.GasDenomConversionMultiplier | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func findFirstContinuousDecreasingSubsequence(data []*txnInfo) int { | ||||||
|  | 	ll := len(data) | ||||||
|  | 	if ll < 2 { | ||||||
|  | 		return ll | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for i := 0; i < ll-1; i++ { | ||||||
|  | 		if data[i].gasPrice.Cmp(data[i+1].gasPrice) >= 0 { | ||||||
|  | 			end := i + 1 | ||||||
|  | 			for ; end < ll && data[end-1].gasPrice.Cmp(data[end].gasPrice) > 0; end++ { | ||||||
|  | 			} | ||||||
|  | 			if end == ll || data[end-1].gasPrice.Cmp(data[end].gasPrice) <= 0 { | ||||||
|  | 				return end | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			return i + 1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return ll | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Solovyov1796
						Solovyov1796