Skip to content

Commit cc1e06b

Browse files
committed
wire service evrywhear
1 parent 27209c8 commit cc1e06b

File tree

13 files changed

+112
-20
lines changed

13 files changed

+112
-20
lines changed

chia/_tests/conftest.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
FarmerService,
5959
FullNodeService,
6060
HarvesterService,
61+
SolverService,
6162
TimelordService,
6263
WalletService,
6364
)
@@ -70,6 +71,7 @@
7071
setup_full_node,
7172
setup_introducer,
7273
setup_seeder,
74+
setup_solver,
7375
setup_timelord,
7476
)
7577
from chia.simulator.start_simulator import SimulatorFullNodeService
@@ -1115,6 +1117,12 @@ async def seeder_service(root_path_populated_with_config: Path, database_uri: st
11151117
yield seeder
11161118

11171119

1120+
@pytest.fixture(scope="function")
1121+
async def solver_service(bt: BlockTools) -> AsyncIterator[SolverService]:
1122+
async with setup_solver(bt.root_path, bt.constants) as _:
1123+
yield _
1124+
1125+
11181126
@pytest.fixture(scope="function")
11191127
def tmp_chia_root(tmp_path):
11201128
"""

chia/_tests/solver/__init__.py

Whitespace-only changes.

chia/_tests/solver/test_solver.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
from chia_rs.sized_bytes import bytes32
5+
from chia_rs.sized_ints import uint8, uint64
6+
7+
from chia.protocols.solver_protocol import SolverInfo
8+
from chia.server.aliases import SolverService
9+
10+
11+
@pytest.mark.anyio
12+
async def test_solver_solve(solver_service: SolverService) -> None:
13+
"""Test that the solver service can process a solve request."""
14+
solver = solver_service._node
15+
solver_api = solver_service._api
16+
17+
# Create test SolverInfo
18+
test_info = SolverInfo(plot_size=uint8(32), plot_diffculty=uint64(1000), quality_string=bytes32.zeros)
19+
20+
# Call solve directly on the solver
21+
result = solver.solve(test_info)
22+
23+
# Should return None since it's not implemented
24+
assert result is None
25+
26+
# Test through the API
27+
api_result = await solver_api.solve(test_info)
28+
29+
# Should return None since solver.solve returns None
30+
assert api_result is None

chia/_tests/util/setup_nodes.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
setup_full_node,
3434
setup_harvester,
3535
setup_introducer,
36+
setup_solver,
3637
setup_timelord,
3738
setup_vdf_client,
3839
setup_vdf_clients,
@@ -469,6 +470,16 @@ async def setup_full_system_inner(
469470

470471
await asyncio.sleep(backoff)
471472

473+
setup_solver(
474+
b_tools,
475+
shared_b_tools.root_path / "harvester",
476+
UnresolvedPeerInfo(self_hostname, farmer_service._server.get_port()),
477+
consensus_constants,
478+
)
479+
# solver_service = await async_exit_stack.enter_async_context(
480+
481+
# )
482+
472483
full_system = FullSystem(
473484
node_1=node_1,
474485
node_2=node_2,

chia/protocols/shared_protocol.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ class Capability(IntEnum):
6565
NodeType.INTRODUCER: _capabilities,
6666
NodeType.WALLET: _capabilities,
6767
NodeType.DATA_LAYER: _capabilities,
68+
NodeType.SOLVER: [],
6869
}
6970

7071

chia/protocols/solver_protocol.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22

33
from dataclasses import dataclass
44

5-
from chia_rs import PlotSize
65
from chia_rs.sized_bytes import bytes32
7-
from chia_rs.sized_ints import uint64
6+
from chia_rs.sized_ints import uint8, uint64
87

98
from chia.util.streamable import Streamable, streamable
109

1110

1211
@streamable
1312
@dataclass(frozen=True)
1413
class SolverInfo(Streamable):
15-
plot_size: PlotSize
14+
plot_size: uint8
1615
plot_diffculty: uint64
1716
quality_string: bytes32

chia/server/aliases.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
from chia.seeder.crawler_api import CrawlerAPI
1919
from chia.seeder.crawler_rpc_api import CrawlerRpcApi
2020
from chia.server.start_service import Service
21+
from chia.solver.solver import Solver
22+
from chia.solver.solver_api import SolverAPI
2123
from chia.timelord.timelord import Timelord
2224
from chia.timelord.timelord_api import TimelordAPI
2325
from chia.timelord.timelord_rpc_api import TimelordRpcApi
@@ -33,3 +35,4 @@
3335
IntroducerService = Service[Introducer, IntroducerAPI, FullNodeRpcApi]
3436
TimelordService = Service[Timelord, TimelordAPI, TimelordRpcApi]
3537
WalletService = Service[WalletNode, WalletNodeAPI, WalletRpcApi]
38+
SolverService = Service[Solver, SolverAPI, FullNodeRpcApi]

chia/server/server.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,14 @@ def create(
172172
private_cert_path, private_key_path = None, None
173173
public_cert_path, public_key_path = None, None
174174

175-
authenticated_client_types = {NodeType.HARVESTER}
176-
authenticated_server_types = {NodeType.HARVESTER, NodeType.FARMER, NodeType.WALLET, NodeType.DATA_LAYER}
175+
authenticated_client_types = {NodeType.HARVESTER, NodeType.SOLVER}
176+
authenticated_server_types = {
177+
NodeType.HARVESTER,
178+
NodeType.FARMER,
179+
NodeType.WALLET,
180+
NodeType.DATA_LAYER,
181+
NodeType.SOLVER,
182+
}
177183

178184
if local_type in authenticated_client_types:
179185
# Authenticated clients

chia/server/start_solver.py

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
from chia.apis import ApiProtocolRegistry
1313
from chia.consensus.constants import replace_str_to_bytes
1414
from chia.consensus.default_constants import DEFAULT_CONSTANTS, update_testnet_overrides
15-
from chia.full_node.full_node import FullNode
16-
from chia.full_node.full_node_api import FullNodeAPI
1715
from chia.full_node.full_node_rpc_api import FullNodeRpcApi
1816
from chia.protocols.outbound_message import NodeType
19-
from chia.server.aliases import FullNodeService
17+
from chia.server.aliases import SolverService
2018
from chia.server.signal_handlers import SignalHandlers
21-
from chia.server.start_service import RpcInfo, Service, async_run
19+
from chia.server.start_service import Service, async_run
20+
from chia.solver.solver import Solver
21+
from chia.solver.solver_api import SolverAPI
2222
from chia.util.chia_logging import initialize_service_logging
2323
from chia.util.config import load_config, load_config_cli
2424
from chia.util.default_root import resolve_root_path
@@ -30,28 +30,24 @@
3030
SERVICE_NAME = "solver"
3131

3232

33-
async def create_solver_service(
33+
def create_solver_service(
3434
root_path: pathlib.Path,
3535
config: dict[str, Any],
3636
consensus_constants: ConsensusConstants,
3737
connect_to_daemon: bool = True,
3838
override_capabilities: Optional[list[tuple[uint16, str]]] = None,
39-
) -> FullNodeService:
39+
) -> SolverService:
4040
service_config = config[SERVICE_NAME]
4141

4242
network_id = service_config["selected_network"]
4343
upnp_list = []
4444
if service_config["enable_upnp"]:
4545
upnp_list = [service_config["port"]]
4646

47-
node = await FullNode.create(
48-
service_config,
49-
root_path=root_path,
50-
consensus_constants=consensus_constants,
51-
)
52-
peer_api = FullNodeAPI(node)
47+
node = Solver(root_path, service_config, consensus_constants)
48+
peer_api = SolverAPI(node)
49+
network_id = service_config["selected_network"]
5350

54-
rpc_info: Optional[RpcInfo[FullNodeRpcApi]] = None
5551
if service_config.get("start_rpc_server", True):
5652
rpc_info = (FullNodeRpcApi, service_config["rpc_port"])
5753

@@ -64,7 +60,6 @@ async def create_solver_service(
6460
advertised_port=service_config["port"],
6561
service_name=SERVICE_NAME,
6662
upnp_ports=upnp_list,
67-
# connect_peers=get_unresolved_peer_infos(service_config, NodeType.SOLVER),
6863
on_connect_callback=node.on_connect,
6964
network_id=network_id,
7065
rpc_info=rpc_info,
@@ -84,7 +79,7 @@ async def async_main(service_config: dict[str, Any], root_path: pathlib.Path) ->
8479
updated_constants = replace_str_to_bytes(DEFAULT_CONSTANTS, **overrides)
8580
initialize_service_logging(service_name=SERVICE_NAME, config=config, root_path=root_path)
8681

87-
service = await create_solver_service(root_path, config, updated_constants)
82+
service = create_solver_service(root_path, config, updated_constants)
8883
async with SignalHandlers.manage() as signal_handlers:
8984
await service.setup_process_global_state(signal_handlers=signal_handlers)
9085
await service.run()

chia/simulator/setup_services.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
FullNodeService,
2929
HarvesterService,
3030
IntroducerService,
31+
SolverService,
3132
TimelordService,
3233
WalletService,
3334
)
@@ -37,6 +38,7 @@
3738
from chia.server.start_full_node import create_full_node_service
3839
from chia.server.start_harvester import create_harvester_service
3940
from chia.server.start_introducer import create_introducer_service
41+
from chia.server.start_solver import create_solver_service
4042
from chia.server.start_timelord import create_timelord_service
4143
from chia.server.start_wallet import create_wallet_service
4244
from chia.simulator.block_tools import BlockTools, test_constants
@@ -506,3 +508,27 @@ async def setup_timelord(
506508

507509
async with service.manage():
508510
yield service
511+
512+
513+
@asynccontextmanager
514+
async def setup_solver(
515+
root_path: Path,
516+
consensus_constants: ConsensusConstants,
517+
start_service: bool = True,
518+
) -> AsyncGenerator[SolverService, None]:
519+
with create_lock_and_load_config(root_path / "config" / "ssl" / "ca", root_path) as config:
520+
config["logging"]["log_stdout"] = True
521+
config["solver"]["enable_upnp"] = True
522+
config["solver"]["selected_network"] = "testnet0"
523+
config["solver"]["port"] = 0
524+
config["solver"]["rpc_port"] = 0
525+
config["solver"]["num_threads"] = 1
526+
save_config(root_path, "config.yaml", config)
527+
service = create_solver_service(
528+
root_path,
529+
config,
530+
consensus_constants,
531+
)
532+
533+
async with service.manage(start=start_service):
534+
yield service

0 commit comments

Comments
 (0)