Skip to content

Commit bb77c53

Browse files
committed
full node stubs
1 parent d91b889 commit bb77c53

File tree

4 files changed

+354
-4
lines changed

4 files changed

+354
-4
lines changed

chia/apis/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from chia.apis.api_protocol_registry import ApiProtocolRegistry
44
from chia.apis.farmer_stub import FarmerApiStub
5+
from chia.apis.full_node_stub import FullNodeApiStub
56
from chia.apis.harvester_stub import HarvesterApiStub
67
from chia.apis.timelord_stub import TimelordApiStub
78

8-
__all__ = ["ApiProtocolRegistry", "FarmerApiStub", "HarvesterApiStub", "TimelordApiStub"]
9+
__all__ = ["ApiProtocolRegistry", "FarmerApiStub", "FullNodeApiStub", "HarvesterApiStub", "TimelordApiStub"]

chia/apis/api_protocol_registry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
from __future__ import annotations
22

33
from chia.apis.farmer_stub import FarmerApiStub
4+
from chia.apis.full_node_stub import FullNodeApiStub
45
from chia.apis.harvester_stub import HarvesterApiStub
56
from chia.apis.timelord_stub import TimelordApiStub
6-
from chia.full_node.full_node_api import FullNodeAPI
77
from chia.introducer.introducer_api import IntroducerAPI
88
from chia.protocols.outbound_message import NodeType
99
from chia.server.api_protocol import ApiProtocol
1010
from chia.wallet.wallet_node_api import WalletNodeAPI
1111

1212
ApiProtocolRegistry: dict[NodeType, type[ApiProtocol]] = {
13-
NodeType.FULL_NODE: FullNodeAPI,
13+
NodeType.FULL_NODE: FullNodeApiStub,
1414
NodeType.WALLET: WalletNodeAPI,
1515
NodeType.INTRODUCER: IntroducerAPI,
1616
NodeType.TIMELORD: TimelordApiStub,

chia/apis/full_node_stub.py

Lines changed: 350 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,350 @@
1+
from __future__ import annotations
2+
3+
import logging
4+
from typing import TYPE_CHECKING, ClassVar, Optional, cast
5+
6+
if TYPE_CHECKING:
7+
from chia.server.api_protocol import ApiProtocol
8+
9+
# Minimal imports to avoid circular dependencies
10+
from chia.protocols import farmer_protocol, full_node_protocol, introducer_protocol, timelord_protocol, wallet_protocol
11+
from chia.protocols.outbound_message import Message
12+
from chia.protocols.protocol_message_types import ProtocolMessageTypes
13+
from chia.server.api_protocol import ApiMetadata
14+
from chia.server.ws_connection import WSChiaConnection
15+
16+
17+
class FullNodeApiStub:
18+
"""Lightweight API stub for FullNodeAPI to break circular dependencies."""
19+
20+
if TYPE_CHECKING:
21+
_protocol_check: ClassVar[ApiProtocol] = cast("FullNodeApiStub", None)
22+
23+
log: logging.Logger
24+
metadata: ClassVar[ApiMetadata] = ApiMetadata()
25+
26+
def ready(self) -> bool:
27+
"""Check if the full node is ready."""
28+
return True
29+
30+
@metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_peers])
31+
async def request_peers(
32+
self, _request: full_node_protocol.RequestPeers, peer: WSChiaConnection
33+
) -> Optional[Message]:
34+
"""Handle peer request."""
35+
return None
36+
37+
@metadata.request(peer_required=True)
38+
async def respond_peers(
39+
self, request: full_node_protocol.RespondPeers, peer: WSChiaConnection
40+
) -> None:
41+
"""Handle peer response."""
42+
43+
@metadata.request(peer_required=True)
44+
async def respond_peers_introducer(
45+
self, request: introducer_protocol.RespondPeersIntroducer, peer: WSChiaConnection
46+
) -> None:
47+
"""Handle introducer peer response."""
48+
49+
@metadata.request(peer_required=True, execute_task=True)
50+
async def new_peak(self, request: full_node_protocol.NewPeak, peer: WSChiaConnection) -> None:
51+
"""Handle new peak."""
52+
53+
@metadata.request(peer_required=True)
54+
async def new_transaction(
55+
self, transaction: full_node_protocol.NewTransaction, peer: WSChiaConnection
56+
) -> None:
57+
"""Handle new transaction."""
58+
59+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_transaction])
60+
async def request_transaction(self, request: full_node_protocol.RequestTransaction) -> Optional[Message]:
61+
"""Handle transaction request."""
62+
return None
63+
64+
@metadata.request(peer_required=True, bytes_required=True)
65+
async def respond_transaction(
66+
self,
67+
response: full_node_protocol.RespondTransaction,
68+
peer: WSChiaConnection,
69+
tx_bytes: bytes = b"",
70+
) -> None:
71+
"""Handle transaction response."""
72+
73+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_proof_of_weight])
74+
async def request_proof_of_weight(self, request: full_node_protocol.RequestProofOfWeight) -> Optional[Message]:
75+
"""Handle proof of weight request."""
76+
return None
77+
78+
@metadata.request()
79+
async def respond_proof_of_weight(self, request: full_node_protocol.RespondProofOfWeight) -> Optional[Message]:
80+
"""Handle proof of weight response."""
81+
return None
82+
83+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_block, ProtocolMessageTypes.reject_block])
84+
async def request_block(self, request: full_node_protocol.RequestBlock) -> Optional[Message]:
85+
"""Handle block request."""
86+
return None
87+
88+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_blocks, ProtocolMessageTypes.reject_blocks])
89+
async def request_blocks(self, request: full_node_protocol.RequestBlocks) -> Optional[Message]:
90+
"""Handle blocks request."""
91+
return None
92+
93+
@metadata.request(peer_required=True)
94+
async def reject_block(
95+
self,
96+
reject_block: full_node_protocol.RejectBlock,
97+
peer: WSChiaConnection,
98+
) -> None:
99+
"""Handle block rejection."""
100+
101+
@metadata.request(peer_required=True)
102+
async def reject_blocks(
103+
self,
104+
reject_blocks_request: full_node_protocol.RejectBlocks,
105+
peer: WSChiaConnection,
106+
) -> None:
107+
"""Handle blocks rejection."""
108+
109+
@metadata.request(peer_required=True)
110+
async def respond_blocks(
111+
self,
112+
request: full_node_protocol.RespondBlocks,
113+
peer: WSChiaConnection,
114+
) -> None:
115+
"""Handle blocks response."""
116+
117+
@metadata.request(peer_required=True)
118+
async def respond_block(
119+
self,
120+
request: full_node_protocol.RespondBlock,
121+
peer: WSChiaConnection,
122+
) -> None:
123+
"""Handle block response."""
124+
125+
@metadata.request()
126+
async def new_unfinished_block(
127+
self, new_unfinished_block: full_node_protocol.NewUnfinishedBlock
128+
) -> Optional[Message]:
129+
"""Handle new unfinished block."""
130+
return None
131+
132+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_unfinished_block])
133+
async def request_unfinished_block(
134+
self, request_unfinished_block: full_node_protocol.RequestUnfinishedBlock
135+
) -> Optional[Message]:
136+
"""Handle unfinished block request."""
137+
return None
138+
139+
@metadata.request()
140+
async def new_unfinished_block2(
141+
self, new_unfinished_block: full_node_protocol.NewUnfinishedBlock2
142+
) -> Optional[Message]:
143+
"""Handle new unfinished block v2."""
144+
return None
145+
146+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_unfinished_block])
147+
async def request_unfinished_block2(
148+
self, request_unfinished_block: full_node_protocol.RequestUnfinishedBlock2
149+
) -> Optional[Message]:
150+
"""Handle unfinished block request v2."""
151+
return None
152+
153+
@metadata.request(peer_required=True)
154+
async def respond_unfinished_block(
155+
self,
156+
respond_unfinished_block: full_node_protocol.RespondUnfinishedBlock,
157+
peer: WSChiaConnection,
158+
) -> None:
159+
"""Handle unfinished block response."""
160+
161+
@metadata.request(peer_required=True)
162+
async def new_signage_point_or_end_of_sub_slot(
163+
self, new_sp: full_node_protocol.NewSignagePointOrEndOfSubSlot, peer: WSChiaConnection
164+
) -> Optional[Message]:
165+
"""Handle new signage point or end of sub slot."""
166+
return None
167+
168+
@metadata.request(
169+
reply_types=[ProtocolMessageTypes.respond_signage_point, ProtocolMessageTypes.respond_end_of_sub_slot]
170+
)
171+
async def request_signage_point_or_end_of_sub_slot(
172+
self, request: full_node_protocol.RequestSignagePointOrEndOfSubSlot
173+
) -> Optional[Message]:
174+
"""Handle signage point or end of sub slot request."""
175+
return None
176+
177+
@metadata.request(peer_required=True)
178+
async def respond_signage_point(
179+
self, request: full_node_protocol.RespondSignagePoint, peer: WSChiaConnection
180+
) -> None:
181+
"""Handle signage point response."""
182+
183+
@metadata.request(peer_required=True)
184+
async def respond_end_of_sub_slot(
185+
self, request: full_node_protocol.RespondEndOfSubSlot, peer: WSChiaConnection
186+
) -> Optional[Message]:
187+
"""Handle end of sub slot response."""
188+
return None
189+
190+
@metadata.request(peer_required=True)
191+
async def request_mempool_transactions(
192+
self,
193+
request: full_node_protocol.RequestMempoolTransactions,
194+
peer: WSChiaConnection,
195+
) -> None:
196+
"""Handle mempool transactions request."""
197+
198+
@metadata.request(peer_required=True)
199+
async def declare_proof_of_space(
200+
self, request: farmer_protocol.DeclareProofOfSpace, peer: WSChiaConnection
201+
) -> None:
202+
"""Handle proof of space declaration."""
203+
204+
@metadata.request(peer_required=True)
205+
async def signed_values(
206+
self, farmer_request: farmer_protocol.SignedValues, peer: WSChiaConnection
207+
) -> None:
208+
"""Handle signed values."""
209+
210+
@metadata.request(peer_required=True)
211+
async def new_infusion_point_vdf(
212+
self, request: timelord_protocol.NewInfusionPointVDF, peer: WSChiaConnection
213+
) -> None:
214+
"""Handle new infusion point VDF."""
215+
216+
@metadata.request(peer_required=True)
217+
async def new_signage_point_vdf(
218+
self, request: timelord_protocol.NewSignagePointVDF, peer: WSChiaConnection
219+
) -> None:
220+
"""Handle new signage point VDF."""
221+
222+
@metadata.request(peer_required=True)
223+
async def new_end_of_sub_slot_vdf(
224+
self, request: timelord_protocol.NewEndOfSubSlotVDF, peer: WSChiaConnection
225+
) -> Optional[Message]:
226+
"""Handle new end of sub slot VDF."""
227+
return None
228+
229+
@metadata.request()
230+
async def request_block_header(self, request: wallet_protocol.RequestBlockHeader) -> Optional[Message]:
231+
"""Handle block header request."""
232+
return None
233+
234+
@metadata.request()
235+
async def request_additions(self, request: wallet_protocol.RequestAdditions) -> Optional[Message]:
236+
"""Handle additions request."""
237+
return None
238+
239+
@metadata.request()
240+
async def request_removals(self, request: wallet_protocol.RequestRemovals) -> Optional[Message]:
241+
"""Handle removals request."""
242+
return None
243+
244+
@metadata.request()
245+
async def send_transaction(
246+
self, request: wallet_protocol.SendTransaction, *, test: bool = False
247+
) -> Optional[Message]:
248+
"""Handle send transaction."""
249+
return None
250+
251+
@metadata.request()
252+
async def request_puzzle_solution(self, request: wallet_protocol.RequestPuzzleSolution) -> Optional[Message]:
253+
"""Handle puzzle solution request."""
254+
return None
255+
256+
@metadata.request()
257+
async def request_block_headers(self, request: wallet_protocol.RequestBlockHeaders) -> Optional[Message]:
258+
"""Handle block headers request."""
259+
return None
260+
261+
@metadata.request()
262+
async def request_header_blocks(self, request: wallet_protocol.RequestHeaderBlocks) -> Optional[Message]:
263+
"""Handle header blocks request (deprecated)."""
264+
return None
265+
266+
@metadata.request(bytes_required=True, execute_task=True)
267+
async def respond_compact_proof_of_time(
268+
self, request: timelord_protocol.RespondCompactProofOfTime, request_bytes: bytes = b""
269+
) -> None:
270+
"""Handle compact proof of time response."""
271+
272+
@metadata.request(peer_required=True, bytes_required=True, execute_task=True)
273+
async def new_compact_vdf(
274+
self, request: full_node_protocol.NewCompactVDF, peer: WSChiaConnection, request_bytes: bytes = b""
275+
) -> None:
276+
"""Handle new compact VDF."""
277+
278+
@metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_compact_vdf])
279+
async def request_compact_vdf(self, request: full_node_protocol.RequestCompactVDF, peer: WSChiaConnection) -> None:
280+
"""Handle compact VDF request."""
281+
282+
@metadata.request(peer_required=True)
283+
async def respond_compact_vdf(self, request: full_node_protocol.RespondCompactVDF, peer: WSChiaConnection) -> None:
284+
"""Handle compact VDF response."""
285+
286+
@metadata.request(peer_required=True)
287+
async def register_for_ph_updates(
288+
self, request: wallet_protocol.RegisterForPhUpdates, peer: WSChiaConnection
289+
) -> Optional[Message]:
290+
"""Handle puzzle hash updates registration."""
291+
return None
292+
293+
@metadata.request(peer_required=True)
294+
async def register_for_coin_updates(
295+
self, request: wallet_protocol.RegisterForCoinUpdates, peer: WSChiaConnection
296+
) -> Optional[Message]:
297+
"""Handle coin updates registration."""
298+
return None
299+
300+
@metadata.request()
301+
async def request_children(self, request: wallet_protocol.RequestChildren) -> Optional[Message]:
302+
"""Handle children request."""
303+
return None
304+
305+
@metadata.request()
306+
async def request_ses_hashes(self, request: wallet_protocol.RequestSESInfo) -> Message:
307+
"""Handle SES hashes request."""
308+
raise NotImplementedError("Stub method should not be called")
309+
310+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_fee_estimates])
311+
async def request_fee_estimates(self, request: wallet_protocol.RequestFeeEstimates) -> Message:
312+
"""Handle fee estimates request."""
313+
raise NotImplementedError("Stub method should not be called")
314+
315+
@metadata.request(
316+
peer_required=True,
317+
reply_types=[ProtocolMessageTypes.respond_remove_puzzle_subscriptions],
318+
)
319+
async def request_remove_puzzle_subscriptions(
320+
self, request: wallet_protocol.RequestRemovePuzzleSubscriptions, peer: WSChiaConnection
321+
) -> Message:
322+
"""Handle remove puzzle subscriptions request."""
323+
raise NotImplementedError("Stub method should not be called")
324+
325+
@metadata.request(
326+
peer_required=True,
327+
reply_types=[ProtocolMessageTypes.respond_remove_coin_subscriptions],
328+
)
329+
async def request_remove_coin_subscriptions(
330+
self, request: wallet_protocol.RequestRemoveCoinSubscriptions, peer: WSChiaConnection
331+
) -> Message:
332+
"""Handle remove coin subscriptions request."""
333+
raise NotImplementedError("Stub method should not be called")
334+
335+
@metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_puzzle_state])
336+
async def request_puzzle_state(
337+
self, request: wallet_protocol.RequestPuzzleState, peer: WSChiaConnection
338+
) -> Message:
339+
"""Handle puzzle state request."""
340+
raise NotImplementedError("Stub method should not be called")
341+
342+
@metadata.request(peer_required=True, reply_types=[ProtocolMessageTypes.respond_coin_state])
343+
async def request_coin_state(self, request: wallet_protocol.RequestCoinState, peer: WSChiaConnection) -> Message:
344+
"""Handle coin state request."""
345+
raise NotImplementedError("Stub method should not be called")
346+
347+
@metadata.request(reply_types=[ProtocolMessageTypes.respond_cost_info])
348+
async def request_cost_info(self, _request: wallet_protocol.RequestCostInfo) -> Optional[Message]:
349+
"""Handle cost info request."""
350+
return None

tach.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ path = "chia.apis"
9090
depends_on = [
9191
{ path = "chia.introducer", deprecated = false },
9292
{ path = "chia.wallet", deprecated = false },
93-
{ path = "chia.full_node", deprecated = false },
9493
{ path = "chia.protocols", deprecated = false },
9594
{ path = "chia.server", deprecated = false },
9695
]

0 commit comments

Comments
 (0)