Skip to content

Commit c4ce5ec

Browse files
committed
name change, fix comments
1 parent 63fb5f2 commit c4ce5ec

File tree

6 files changed

+42
-52
lines changed

6 files changed

+42
-52
lines changed

chia/_tests/farmer_harvester/test_farmer_harvester.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -326,15 +326,15 @@ async def test_harvester_has_no_server(
326326

327327

328328
@pytest.mark.anyio
329-
async def test_v2_qualities_new_sp_hash(
329+
async def test_v2_quality_chains_new_sp_hash(
330330
farmer_one_harvester_solver: tuple[list[HarvesterService], FarmerService, SolverService, BlockTools],
331331
) -> None:
332332
_, farmer_service, _solver_service, _bt = farmer_one_harvester_solver
333333
farmer_api = farmer_service._api
334334
farmer = farmer_api.farmer
335335

336336
sp_hash = bytes32(b"1" * 32)
337-
v2_qualities = harvester_protocol.V2Qualities(
337+
v2_quality_chains = harvester_protocol.V2QualityChains(
338338
challenge_hash=bytes32(b"2" * 32),
339339
sp_hash=sp_hash,
340340
plot_identifier="test_plot_id",
@@ -348,23 +348,23 @@ async def test_v2_qualities_new_sp_hash(
348348
)
349349

350350
harvester_peer = await get_harvester_peer(farmer)
351-
await farmer_api.v2_qualities(v2_qualities, harvester_peer)
351+
await farmer_api.v2_quality_chains(v2_quality_chains, harvester_peer)
352352

353353
assert sp_hash in farmer.number_of_responses
354354
assert farmer.number_of_responses[sp_hash] == 0
355355
assert sp_hash in farmer.cache_add_time
356356

357357

358358
@pytest.mark.anyio
359-
async def test_v2_qualities_missing_sp_hash(
359+
async def test_v2_quality_chains_missing_sp_hash(
360360
caplog: pytest.LogCaptureFixture,
361361
farmer_one_harvester_solver: tuple[list[HarvesterService], FarmerService, SolverService, BlockTools],
362362
) -> None:
363363
_, farmer_service, _, _ = farmer_one_harvester_solver
364364
farmer_api = farmer_service._api
365365

366366
sp_hash = bytes32(b"1" * 32)
367-
v2_qualities = harvester_protocol.V2Qualities(
367+
v2_quality_chains = harvester_protocol.V2QualityChains(
368368
challenge_hash=bytes32(b"2" * 32),
369369
sp_hash=sp_hash,
370370
plot_identifier="test_plot_id",
@@ -378,13 +378,13 @@ async def test_v2_qualities_missing_sp_hash(
378378
)
379379

380380
harvester_peer = await get_harvester_peer(farmer_api.farmer)
381-
await farmer_api.v2_qualities(v2_qualities, harvester_peer)
381+
await farmer_api.v2_quality_chains(v2_quality_chains, harvester_peer)
382382

383383
assert f"Received V2 quality collection for a signage point that we do not have {sp_hash}" in caplog.text
384384

385385

386386
@pytest.mark.anyio
387-
async def test_v2_qualities_with_existing_sp(
387+
async def test_v2_quality_chains_with_existing_sp(
388388
farmer_one_harvester_solver: tuple[list[HarvesterService], FarmerService, SolverService, BlockTools],
389389
) -> None:
390390
_, farmer_service, _, _ = farmer_one_harvester_solver
@@ -407,7 +407,7 @@ async def test_v2_qualities_with_existing_sp(
407407

408408
farmer.sps[sp_hash] = [sp]
409409

410-
v2_qualities = harvester_protocol.V2Qualities(
410+
v2_quality_chains = harvester_protocol.V2QualityChains(
411411
challenge_hash=challenge_hash,
412412
sp_hash=sp_hash,
413413
plot_identifier="test_plot_id",
@@ -421,7 +421,7 @@ async def test_v2_qualities_with_existing_sp(
421421
)
422422

423423
harvester_peer = await get_harvester_peer(farmer)
424-
await farmer_api.v2_qualities(v2_qualities, harvester_peer)
424+
await farmer_api.v2_quality_chains(v2_quality_chains, harvester_peer)
425425

426426
# should store 2 pending requests (one per quality)
427427
assert len(farmer.pending_solver_requests) == 2
@@ -441,7 +441,7 @@ async def test_solution_response_handler(
441441
sp_hash = bytes32(b"1" * 32)
442442
challenge_hash = bytes32(b"2" * 32)
443443

444-
v2_qualities = harvester_protocol.V2Qualities(
444+
v2_quality_chains = harvester_protocol.V2QualityChains(
445445
challenge_hash=challenge_hash,
446446
sp_hash=sp_hash,
447447
plot_identifier="test_plot_id",
@@ -458,7 +458,7 @@ async def test_solution_response_handler(
458458

459459
# manually add pending request
460460
farmer.pending_solver_requests[quality] = {
461-
"quality_data": v2_qualities,
461+
"quality_data": v2_quality_chains,
462462
"peer": harvester_peer,
463463
}
464464

@@ -509,7 +509,7 @@ async def test_solution_response_unknown_quality(
509509
async def test_solution_response_empty_proof(
510510
farmer_one_harvester_solver: tuple[list[HarvesterService], FarmerService, SolverService, BlockTools],
511511
) -> None:
512-
"""Test solution_response with empty proof (line 555-556)."""
512+
"""Test solution_response with empty proof."""
513513
_, farmer_service, _solver_service, _ = farmer_one_harvester_solver
514514
farmer_api = farmer_service._api
515515
farmer = farmer_api.farmer
@@ -519,7 +519,7 @@ async def test_solution_response_empty_proof(
519519
sp_hash = bytes32(b"1" * 32)
520520
challenge_hash = bytes32(b"2" * 32)
521521

522-
v2_qualities = harvester_protocol.V2Qualities(
522+
v2_quality_chains = harvester_protocol.V2QualityChains(
523523
challenge_hash=challenge_hash,
524524
sp_hash=sp_hash,
525525
plot_identifier="test_plot_id",
@@ -537,7 +537,7 @@ async def test_solution_response_empty_proof(
537537

538538
# manually add pending request
539539
farmer.pending_solver_requests[quality] = {
540-
"quality_data": v2_qualities,
540+
"quality_data": v2_quality_chains,
541541
"peer": harvester_peer,
542542
}
543543

@@ -558,10 +558,10 @@ async def test_solution_response_empty_proof(
558558

559559

560560
@pytest.mark.anyio
561-
async def test_v2_qualities_solver_exception(
561+
async def test_v2_quality_chains_solver_exception(
562562
farmer_one_harvester_solver: tuple[list[HarvesterService], FarmerService, SolverService, BlockTools],
563563
) -> None:
564-
"""Test v2_qualities with solver service exception (lines 526-527, 529-530)."""
564+
"""Test v2_quality_chains with solver service exception."""
565565
_, farmer_service, _solver_service, _ = farmer_one_harvester_solver
566566
farmer_api = farmer_service._api
567567
farmer = farmer_api.farmer
@@ -582,7 +582,7 @@ async def test_v2_qualities_solver_exception(
582582

583583
farmer.sps[sp_hash] = [sp]
584584

585-
v2_qualities = harvester_protocol.V2Qualities(
585+
v2_quality_chains = harvester_protocol.V2QualityChains(
586586
challenge_hash=challenge_hash,
587587
sp_hash=sp_hash,
588588
plot_identifier="test_plot_id",
@@ -599,7 +599,7 @@ async def test_v2_qualities_solver_exception(
599599

600600
# Mock send_to_all to raise an exception
601601
with unittest.mock.patch.object(farmer.server, "send_to_all", side_effect=Exception("Solver connection failed")):
602-
await farmer_api.v2_qualities(v2_qualities, harvester_peer)
602+
await farmer_api.v2_quality_chains(v2_quality_chains, harvester_peer)
603603

604604
# verify pending request was cleaned up after exception
605605
quality = bytes32(b"3" * 32)

chia/_tests/util/test_network_protocol_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ def test_missing_messages() -> None:
189189
"RequestSignatures",
190190
"RespondPlots",
191191
"RespondSignatures",
192-
"V2Qualities",
192+
"V2QualityChains",
193193
}
194194

195195
introducer_msgs = {"RequestPeersIntroducer", "RespondPeersIntroducer"}

chia/farmer/farmer_api.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
PoolDifficulty,
2525
SignatureRequestSourceData,
2626
SigningDataKind,
27-
V2Qualities,
27+
V2QualityChains,
2828
)
2929
from chia.protocols.outbound_message import Message, NodeType, make_msg
3030
from chia.protocols.pool_protocol import (
@@ -481,10 +481,10 @@ async def new_proof_of_space(
481481
return
482482

483483
@metadata.request(peer_required=True)
484-
async def v2_qualities(self, quality_data: V2Qualities, peer: WSChiaConnection) -> None:
484+
async def v2_quality_chains(self, quality_data: V2QualityChains, peer: WSChiaConnection) -> None:
485485
"""
486-
This is a response from the harvester for V2 plots, containing only qualities.
487-
We store these qualities and will later use solver service to generate proofs when needed.
486+
This is a response from the harvester for V2 plots, containing only quality chains (partial proof bytes).
487+
We send these to the solver service and wait for a response with the full proof.
488488
"""
489489
if quality_data.sp_hash not in self.farmer.number_of_responses:
490490
self.farmer.number_of_responses[quality_data.sp_hash] = 0

chia/harvester/harvester_api.py

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from chia.plotting.util import PlotInfo, parse_plot_info
2020
from chia.protocols import harvester_protocol
2121
from chia.protocols.farmer_protocol import FarmingInfo
22-
from chia.protocols.harvester_protocol import Plot, PlotSyncResponse, V2Qualities
22+
from chia.protocols.harvester_protocol import Plot, PlotSyncResponse, V2QualityChains
2323
from chia.protocols.outbound_message import Message, make_msg
2424
from chia.protocols.protocol_message_types import ProtocolMessageTypes
2525
from chia.server.api_protocol import ApiMetadata
@@ -98,8 +98,8 @@ async def new_signage_point_harvester(
9898

9999
loop = asyncio.get_running_loop()
100100

101-
def blocking_lookup_v2_qualities(filename: Path, plot_info: PlotInfo) -> Optional[V2Qualities]:
102-
# Uses the V2 Prover object to lookup qualities only. No full proofs generated.
101+
def blocking_lookup_v2_quality_chains(filename: Path, plot_info: PlotInfo) -> Optional[V2QualityChains]:
102+
# Uses the V2 Prover object to lookup qualitie_chains (partial proofs).
103103
try:
104104
plot_id = plot_info.prover.get_id()
105105
sp_challenge_hash = calculate_pos_challenge(
@@ -128,7 +128,7 @@ def blocking_lookup_v2_qualities(filename: Path, plot_info: PlotInfo) -> Optiona
128128
if len(quality_chains) > 0:
129129
size = plot_info.prover.get_size().size_v2
130130
assert size is not None
131-
return V2Qualities(
131+
return V2QualityChains(
132132
new_challenge.challenge_hash,
133133
new_challenge.sp_hash,
134134
quality_chains[0].hex() + str(filename.resolve()),
@@ -263,14 +263,6 @@ def blocking_lookup(filename: Path, plot_info: PlotInfo) -> list[tuple[bytes32,
263263
self.harvester.log.error(f"Unknown error: {e}")
264264
return []
265265

266-
async def lookup_v2_qualities(filename: Path, plot_info: PlotInfo) -> tuple[Path, Optional[V2Qualities]]:
267-
# Executes V2 quality lookup in a thread pool
268-
if self.harvester._shut_down:
269-
return filename, None
270-
qualities: Optional[V2Qualities] = await loop.run_in_executor(
271-
self.harvester.executor, blocking_lookup_v2_qualities, filename, plot_info
272-
)
273-
return filename, qualities
274266

275267
async def lookup_challenge(
276268
filename: Path, plot_info: PlotInfo
@@ -309,7 +301,11 @@ async def lookup_challenge(
309301
total += 1
310302
if try_plot_info.prover.get_version() == PlotVersion.V2:
311303
# TODO: todo_v2_plots need to check v2 filter
312-
v2_awaitables.append(lookup_v2_qualities(try_plot_filename, try_plot_info))
304+
v2_awaitables.append(
305+
loop.run_in_executor(
306+
self.harvester.executor, blocking_lookup_v2_quality_chains, try_plot_filename, try_plot_info
307+
)
308+
)
313309
passed += 1
314310
else:
315311
filter_prefix_bits = calculate_prefix_bits(
@@ -330,7 +326,7 @@ async def lookup_challenge(
330326
# Concurrently executes all lookups on disk, to take advantage of multiple disk parallelism
331327
time_taken = time.monotonic() - start
332328
total_proofs_found = 0
333-
total_v2_qualities_found = 0
329+
total_v2_quality_chains_found = 0
334330

335331
# Process V1 plot responses (existing flow)
336332
for filename_sublist_awaitable in asyncio.as_completed(awaitables):
@@ -350,17 +346,11 @@ async def lookup_challenge(
350346
await peer.send_message(msg)
351347

352348
# Process V2 plot quality collections (new flow)
353-
for filename_quality_awaitable in asyncio.as_completed(v2_awaitables):
354-
filename, v2_qualities = await filename_quality_awaitable
355-
time_taken = time.monotonic() - start
356-
if time_taken > 8:
357-
self.harvester.log.warning(
358-
f"Looking up V2 qualities on {filename} took: {time_taken}. This should be below 8 seconds"
359-
f" to minimize risk of losing rewards."
360-
)
361-
if v2_qualities is not None:
362-
total_v2_qualities_found += len(v2_qualities.quality_chains)
363-
msg = make_msg(ProtocolMessageTypes.v2_qualities, v2_qualities)
349+
for quality_awaitable in asyncio.as_completed(v2_awaitables):
350+
v2_quality_chains = await quality_awaitable
351+
if v2_quality_chains is not None:
352+
total_v2_quality_chains_found += len(v2_quality_chains.quality_chains)
353+
msg = make_msg(ProtocolMessageTypes.v2_quality_chains, v2_quality_chains)
364354
await peer.send_message(msg)
365355

366356
now = uint64(time.time())
@@ -380,7 +370,7 @@ async def lookup_challenge(
380370
self.harvester.log.info(
381371
f"challenge_hash: {new_challenge.challenge_hash.hex()[:10]} ..."
382372
f"{len(awaitables) + len(v2_awaitables)} plots were eligible for farming challenge"
383-
f"Found {total_proofs_found} V1 proofs and {total_v2_qualities_found} V2 qualities."
373+
f"Found {total_proofs_found} V1 proofs and {total_v2_quality_chains_found} V2 qualities."
384374
f" Time: {time_taken:.5f} s. Total {self.harvester.plot_manager.plot_count()} plots"
385375
)
386376
self.harvester.state_changed(
@@ -389,7 +379,7 @@ async def lookup_challenge(
389379
"challenge_hash": new_challenge.challenge_hash.hex(),
390380
"total_plots": self.harvester.plot_manager.plot_count(),
391381
"found_proofs": total_proofs_found,
392-
"found_v2_qualities": total_v2_qualities_found,
382+
"found_v2_quality_chains": total_v2_quality_chains_found,
393383
"eligible_plots": len(awaitables) + len(v2_awaitables),
394384
"time": time_taken,
395385
},

chia/protocols/harvester_protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class NewProofOfSpace(Streamable):
6565

6666
@streamable
6767
@dataclass(frozen=True)
68-
class V2Qualities(Streamable):
68+
class V2QualityChains(Streamable):
6969
challenge_hash: bytes32
7070
sp_hash: bytes32
7171
plot_identifier: str

chia/protocols/protocol_message_types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ProtocolMessageTypes(Enum):
1313
new_proof_of_space = 5
1414
request_signatures = 6
1515
respond_signatures = 7
16-
v2_qualities = 110
16+
v2_quality_chains = 110
1717

1818
# Farmer protocol (farmer <-> full_node)
1919
new_signage_point = 8

0 commit comments

Comments
 (0)