mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2026-09-05 02:24:21 -05:00
* new blob block api method integrated into wallet * direct msg streaming of headers, rename, tests * perform_handshake call fix * updated trusted sync with new block header calls * add max blocks limit to fetch * added tests for rejected block header msgs * avoid parsing transactions info if not required * avoid looking up capabilities setting * move block tests out of a class * test fix * Merge changes * added docs and increased rate limits * increased block header request interval from 32 to 128 * remove fetching hashes and use height range * fetching by height in db v2 * update capabilities, other fixes * fixed range block header call * Add type hints * Start work on optimizing fetch_last_tx_from_peer * Huge speedup in trusted wallet sync * Revert unintentional changes * Fix trade issue * Improve the code * Str format * Optimize handling of farming rewards * Fix bug * Performance fixes * Optimizations to wallet syncing * Don't return all coins in respond_additions * Revert concurrency numbers * More optimization of the caches * Small optimization in coin_added * Optimize request_additions significantly by using a cache * fixes from feedback * capabilities check fixes * Increase rate limits to allow 250tps in verification requests * Start work on rate limits * New rate limit versioning support * Revert unrelated changes * revert return False * Lint * Revert cbi * try tests with trusted peer * Revert unrelated wallet changes * Revert more debug changes * Add test and throw on an error if not found * Reject invalid requests * Revert bad change with uint32, and change warning to info * Parametrize wallet sync test * Merge and LGTM * More clean way to choose peers * Fix lint * add the new RejectBlockHeaders, RequestBlockHeaders and RespondBlockHeaders to the network protocol regression test and regenerate test files * Rate limit diffs only * Improve performance * Simpler * Lint Co-authored-by: Sebastjan <trepca@gmail.com> Co-authored-by: arvidn <arvid@libtorrent.org>
68 lines
2.8 KiB
Python
68 lines
2.8 KiB
Python
from chia.protocols.protocol_message_types import ProtocolMessageTypes as pmt, ProtocolMessageTypes
|
|
|
|
NO_REPLY_EXPECTED = [
|
|
# full_node -> full_node messages
|
|
pmt.new_peak,
|
|
pmt.new_transaction,
|
|
pmt.new_unfinished_block,
|
|
pmt.new_signage_point_or_end_of_sub_slot,
|
|
pmt.request_mempool_transactions,
|
|
pmt.new_compact_vdf,
|
|
pmt.request_mempool_transactions,
|
|
]
|
|
|
|
"""
|
|
VALID_REPLY_MESSAGE_MAP:
|
|
key: sent message type.
|
|
value: valid reply message types, from the view of the requester.
|
|
A state machine can be built from this message map.
|
|
"""
|
|
|
|
VALID_REPLY_MESSAGE_MAP = {
|
|
# messages for all services
|
|
# pmt.handshake is handled in WSChiaConnection.perform_handshake
|
|
# full_node -> full_node protocol messages
|
|
pmt.request_transaction: [pmt.respond_transaction],
|
|
pmt.request_proof_of_weight: [pmt.respond_proof_of_weight],
|
|
pmt.request_block: [pmt.respond_block, pmt.reject_block],
|
|
pmt.request_blocks: [pmt.respond_blocks, pmt.reject_blocks],
|
|
pmt.request_unfinished_block: [pmt.respond_unfinished_block],
|
|
pmt.request_block_header: [pmt.respond_block_header, pmt.reject_header_request],
|
|
pmt.request_signage_point_or_end_of_sub_slot: [pmt.respond_signage_point, pmt.respond_end_of_sub_slot],
|
|
pmt.request_compact_vdf: [pmt.respond_compact_vdf],
|
|
pmt.request_peers: [pmt.respond_peers],
|
|
pmt.request_header_blocks: [pmt.respond_header_blocks, pmt.reject_header_blocks],
|
|
pmt.request_block_headers: [pmt.respond_block_headers, pmt.reject_block_headers],
|
|
}
|
|
|
|
|
|
def static_check_sent_message_response() -> None:
|
|
"""Check that allowed message data structures VALID_REPLY_MESSAGE_MAP and NO_REPLY_EXPECTED are consistent."""
|
|
# Reply and non-reply sets should not overlap: This check should be static
|
|
overlap = set(NO_REPLY_EXPECTED).intersection(set(VALID_REPLY_MESSAGE_MAP.keys()))
|
|
if len(overlap) != 0:
|
|
raise AssertionError(f"Overlapping NO_REPLY_EXPECTED and VALID_REPLY_MESSAGE_MAP values: {overlap}")
|
|
|
|
|
|
def message_requires_reply(sent: ProtocolMessageTypes) -> bool:
|
|
"""Return True if message has an entry in the full node P2P message map"""
|
|
# If we knew the peer NodeType is FULL_NODE, we could also check `sent not in NO_REPLY_EXPECTED`
|
|
return sent in VALID_REPLY_MESSAGE_MAP
|
|
|
|
|
|
def message_response_ok(sent: ProtocolMessageTypes, received: ProtocolMessageTypes) -> bool:
|
|
"""
|
|
Check to see that peers respect protocol message types in reply.
|
|
Call with received == None to indicate that we do not expect a specific reply message type.
|
|
"""
|
|
# Errors below are runtime protocol message mismatches from peers
|
|
if sent in VALID_REPLY_MESSAGE_MAP:
|
|
if received not in VALID_REPLY_MESSAGE_MAP[sent]:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
# Run `static_check_sent_message_response` to check this static invariant at import time
|
|
static_check_sent_message_response()
|