6868from chia .protocols .full_node_protocol import RequestBlocks , RespondBlock , RespondBlocks , RespondSignagePoint
6969from chia .protocols .outbound_message import Message , NodeType , make_msg
7070from chia .protocols .protocol_message_types import ProtocolMessageTypes
71+ from chia .protocols .protocol_timing import CONSENSUS_ERROR_BAN_SECONDS
7172from chia .protocols .shared_protocol import Capability
7273from chia .protocols .wallet_protocol import CoinStateUpdate , RemovedMempoolItem
7374from chia .rpc .rpc_server import StateChangedProtocol
8788from chia .util .db_synchronous import db_synchronous_on
8889from chia .util .db_version import lookup_db_version , set_db_version_async
8990from chia .util .db_wrapper import DBWrapper2 , manage_connection
90- from chia .util .errors import ConsensusError , Err , TimestampError , ValidationError
91+ from chia .util .errors import ConsensusError , Err , TimestampError
9192from chia .util .limited_semaphore import LimitedSemaphore
9293from chia .util .network import is_localhost
9394from chia .util .path import path_from_root
@@ -506,7 +507,7 @@ async def _handle_one_transaction(self, entry: TransactionQueueEntry) -> None:
506507 error_stack = traceback .format_exc ()
507508 self .log .error (f"Error in _handle_one_transaction, closing: { error_stack } " )
508509 if peer is not None :
509- await peer .close ()
510+ await peer .close (CONSENSUS_ERROR_BAN_SECONDS )
510511 finally :
511512 self .add_transaction_semaphore .release ()
512513
@@ -1092,13 +1093,13 @@ async def request_validate_wp(
10921093 response = await weight_proof_peer .call_api (FullNodeAPI .request_proof_of_weight , request , timeout = wp_timeout )
10931094 # Disconnect from this peer, because they have not behaved properly
10941095 if response is None or not isinstance (response , full_node_protocol .RespondProofOfWeight ):
1095- await weight_proof_peer .close (600 )
1096+ await weight_proof_peer .close (CONSENSUS_ERROR_BAN_SECONDS )
10961097 raise RuntimeError (f"Weight proof did not arrive in time from peer: { weight_proof_peer .peer_info .host } " )
10971098 if response .wp .recent_chain_data [- 1 ].reward_chain_block .height != peak_height :
1098- await weight_proof_peer .close (600 )
1099+ await weight_proof_peer .close (CONSENSUS_ERROR_BAN_SECONDS )
10991100 raise RuntimeError (f"Weight proof had the wrong height: { weight_proof_peer .peer_info .host } " )
11001101 if response .wp .recent_chain_data [- 1 ].reward_chain_block .weight != peak_weight :
1101- await weight_proof_peer .close (600 )
1102+ await weight_proof_peer .close (CONSENSUS_ERROR_BAN_SECONDS )
11021103 raise RuntimeError (f"Weight proof had the wrong weight: { weight_proof_peer .peer_info .host } " )
11031104 if self .in_bad_peak_cache (response .wp ):
11041105 raise ValueError ("Weight proof failed bad peak cache validation" )
@@ -1113,10 +1114,10 @@ async def request_validate_wp(
11131114 try :
11141115 validated , fork_point , summaries = await self .weight_proof_handler .validate_weight_proof (response .wp )
11151116 except Exception as e :
1116- await weight_proof_peer .close (600 )
1117+ await weight_proof_peer .close (CONSENSUS_ERROR_BAN_SECONDS )
11171118 raise ValueError (f"Weight proof validation threw an error { e } " )
11181119 if not validated :
1119- await weight_proof_peer .close (600 )
1120+ await weight_proof_peer .close (CONSENSUS_ERROR_BAN_SECONDS )
11201121 raise ValueError ("Weight proof validation failed" )
11211122 self .log .info (f"Re-checked peers: total of { len (peers_with_peak )} peers with peak { peak_height } " )
11221123 self .sync_store .set_sync_mode (True )
@@ -1378,7 +1379,7 @@ async def ingest_blocks(
13781379 vs ,
13791380 )
13801381 if err is not None :
1381- await peer .close (600 )
1382+ await peer .close (CONSENSUS_ERROR_BAN_SECONDS )
13821383 raise ValueError (f"Failed to validate block batch { start_height } to { end_height } : { err } " )
13831384 if end_height - block_rate_height > 100 :
13841385 now = time .monotonic ()
@@ -2767,66 +2768,56 @@ async def add_transaction(
27672768 return MempoolInclusionStatus .SUCCESS , None
27682769 if self .mempool_manager .seen (spend_name ):
27692770 return MempoolInclusionStatus .FAILED , Err .ALREADY_INCLUDING_TRANSACTION
2770- self .mempool_manager .add_and_maybe_pop_seen (spend_name )
27712771 self .log .debug (f"Processing transaction: { spend_name } " )
27722772 # Ignore if syncing or if we have not yet received a block
27732773 # the mempool must have a peak to validate transactions
27742774 if self .sync_store .get_sync_mode () or self .mempool_manager .peak is None :
2775- status = MempoolInclusionStatus .FAILED
2776- error : Optional [Err ] = Err .NO_TRANSACTIONS_WHILE_SYNCING
2777- self .mempool_manager .remove_seen (spend_name )
2778- else :
2775+ return MempoolInclusionStatus .FAILED , Err .NO_TRANSACTIONS_WHILE_SYNCING
2776+
2777+ cost_result = await self .mempool_manager .pre_validate_spendbundle (transaction , spend_name , self ._bls_cache )
2778+
2779+ self .mempool_manager .add_and_maybe_pop_seen (spend_name )
2780+
2781+ if self .config .get ("log_mempool" , False ): # pragma: no cover
27792782 try :
2780- cost_result = await self .mempool_manager .pre_validate_spendbundle (
2781- transaction , spend_name , self ._bls_cache
2782- )
2783- except ValidationError as e :
2784- self .mempool_manager .remove_seen (spend_name )
2785- return MempoolInclusionStatus .FAILED , e .code
2783+ mempool_dir = path_from_root (self .root_path , "mempool-log" ) / f"{ self .blockchain .get_peak_height ()} "
2784+ mempool_dir .mkdir (parents = True , exist_ok = True )
2785+ with open (mempool_dir / f"{ spend_name } .bundle" , "wb+" ) as f :
2786+ f .write (bytes (transaction ))
27862787 except Exception :
2787- self .mempool_manager .remove_seen (spend_name )
2788- raise
2788+ self .log .exception (f"Failed to log mempool item: { spend_name } " )
27892789
2790- if self .config .get ("log_mempool" , False ): # pragma: no cover
2791- try :
2792- mempool_dir = path_from_root (self .root_path , "mempool-log" ) / f"{ self .blockchain .get_peak_height ()} "
2793- mempool_dir .mkdir (parents = True , exist_ok = True )
2794- with open (mempool_dir / f"{ spend_name } .bundle" , "wb+" ) as f :
2795- f .write (bytes (transaction ))
2796- except Exception :
2797- self .log .exception (f"Failed to log mempool item: { spend_name } " )
2798-
2799- async with self .blockchain .priority_mutex .acquire (priority = BlockchainMutexPriority .low ):
2800- if self .mempool_manager .get_spendbundle (spend_name ) is not None :
2801- self .mempool_manager .remove_seen (spend_name )
2802- return MempoolInclusionStatus .SUCCESS , None
2803- if self .mempool_manager .peak is None :
2804- return MempoolInclusionStatus .FAILED , Err .MEMPOOL_NOT_INITIALIZED
2805- info = await self .mempool_manager .add_spend_bundle (
2806- transaction , cost_result , spend_name , self .mempool_manager .peak .height
2807- )
2808- status = info .status
2809- error = info .error
2810- if status == MempoolInclusionStatus .SUCCESS :
2811- self .log .debug (
2812- f"Added transaction to mempool: { spend_name } mempool size: "
2813- f"{ self .mempool_manager .mempool .total_mempool_cost ()} normalized "
2814- f"{ self .mempool_manager .mempool .total_mempool_cost () / 5000000 } "
2815- )
2790+ async with self .blockchain .priority_mutex .acquire (priority = BlockchainMutexPriority .low ):
2791+ if self .mempool_manager .get_spendbundle (spend_name ) is not None :
2792+ self .mempool_manager .remove_seen (spend_name )
2793+ return MempoolInclusionStatus .SUCCESS , None
2794+ if self .mempool_manager .peak is None :
2795+ return MempoolInclusionStatus .FAILED , Err .MEMPOOL_NOT_INITIALIZED
2796+ info = await self .mempool_manager .add_spend_bundle (
2797+ transaction , cost_result , spend_name , self .mempool_manager .peak .height
2798+ )
2799+ status = info .status
2800+ error = info .error
2801+ if status == MempoolInclusionStatus .SUCCESS :
2802+ self .log .debug (
2803+ f"Added transaction to mempool: { spend_name } mempool size: "
2804+ f"{ self .mempool_manager .mempool .total_mempool_cost ()} normalized "
2805+ f"{ self .mempool_manager .mempool .total_mempool_cost () / 5000000 } "
2806+ )
28162807
2817- # Only broadcast successful transactions, not pending ones. Otherwise it's a DOS
2818- # vector.
2819- mempool_item = self .mempool_manager .get_mempool_item (spend_name )
2820- assert mempool_item is not None
2821- await self .broadcast_removed_tx (info .removals )
2822- await self .broadcast_added_tx (mempool_item , current_peer = peer )
2808+ # Only broadcast successful transactions, not pending ones. Otherwise it's a DOS
2809+ # vector.
2810+ mempool_item = self .mempool_manager .get_mempool_item (spend_name )
2811+ assert mempool_item is not None
2812+ await self .broadcast_removed_tx (info .removals )
2813+ await self .broadcast_added_tx (mempool_item , current_peer = peer )
28232814
2824- if self .simulator_transaction_callback is not None : # callback
2825- await self .simulator_transaction_callback (spend_name )
2815+ if self .simulator_transaction_callback is not None : # callback
2816+ await self .simulator_transaction_callback (spend_name )
28262817
2827- else :
2828- self .mempool_manager .remove_seen (spend_name )
2829- self .log .debug (f"Wasn't able to add transaction with id { spend_name } , status { status } error: { error } " )
2818+ else :
2819+ self .mempool_manager .remove_seen (spend_name )
2820+ self .log .debug (f"Wasn't able to add transaction with id { spend_name } , status { status } error: { error } " )
28302821 return status , error
28312822
28322823 async def broadcast_added_tx (
0 commit comments