Skip to content

Commit e9718c9

Browse files
committed
rename to partial proof
1 parent cbe39bb commit e9718c9

File tree

13 files changed

+124
-100
lines changed

13 files changed

+124
-100
lines changed

chia/_tests/farmer_harvester/test_farmer_harvester.py

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

327327

328328
@pytest.mark.anyio
329-
async def test_v2_quality_chains_new_sp_hash(
329+
async def test_v2_partial_proofs_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_quality_chains = harvester_protocol.V2QualityChains(
337+
partial_proofs = harvester_protocol.PartialProofsData(
338338
challenge_hash=bytes32(b"2" * 32),
339339
sp_hash=sp_hash,
340340
plot_identifier="test_plot_id",
341-
quality_chains=[b"test_quality_chain_1"],
341+
partial_proofs=[b"test_partial_proof_1"],
342342
signage_point_index=uint8(0),
343343
plot_size=uint8(32),
344344
difficulty=uint64(1000),
@@ -348,27 +348,27 @@ async def test_v2_quality_chains_new_sp_hash(
348348
)
349349

350350
harvester_peer = await get_harvester_peer(farmer)
351-
await farmer_api.v2_quality_chains(v2_quality_chains, harvester_peer)
351+
await farmer_api.partial_proofs(partial_proofs, 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_quality_chains_missing_sp_hash(
359+
async def test_v2_partial_proofs_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_quality_chains = harvester_protocol.V2QualityChains(
367+
partial_proofs = harvester_protocol.PartialProofsData(
368368
challenge_hash=bytes32(b"2" * 32),
369369
sp_hash=sp_hash,
370370
plot_identifier="test_plot_id",
371-
quality_chains=[b"test_quality_chain_1"],
371+
partial_proofs=[b"test_partial_proof_1"],
372372
signage_point_index=uint8(0),
373373
plot_size=uint8(32),
374374
difficulty=uint64(1000),
@@ -378,13 +378,13 @@ async def test_v2_quality_chains_missing_sp_hash(
378378
)
379379

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

383-
assert f"Received V2 quality collection for a signage point that we do not have {sp_hash}" in caplog.text
383+
assert f"Received partial proofs 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_quality_chains_with_existing_sp(
387+
async def test_v2_partial_proofs_with_existing_sp(
388388
farmer_one_harvester_solver: tuple[list[HarvesterService], FarmerService, SolverService, BlockTools],
389389
) -> None:
390390
_, farmer_service, _, _ = farmer_one_harvester_solver
@@ -407,11 +407,11 @@ async def test_v2_quality_chains_with_existing_sp(
407407

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

410-
v2_quality_chains = harvester_protocol.V2QualityChains(
410+
partial_proofs = harvester_protocol.PartialProofsData(
411411
challenge_hash=challenge_hash,
412412
sp_hash=sp_hash,
413413
plot_identifier="test_plot_id",
414-
quality_chains=[b"test_quality_chain_1", b"test_quality_chain_2"],
414+
partial_proofs=[b"test_partial_proof_1", b"test_partial_proof_2"],
415415
signage_point_index=uint8(0),
416416
plot_size=uint8(32),
417417
difficulty=uint64(1000),
@@ -421,7 +421,7 @@ async def test_v2_quality_chains_with_existing_sp(
421421
)
422422

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

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

444-
v2_quality_chains = harvester_protocol.V2QualityChains(
444+
partial_proofs = harvester_protocol.PartialProofsData(
445445
challenge_hash=challenge_hash,
446446
sp_hash=sp_hash,
447447
plot_identifier="test_plot_id",
448-
quality_chains=[b"test_quality_chain_for_quality"],
448+
partial_proofs=[b"test_partial_proof_for_quality"],
449449
signage_point_index=uint8(0),
450450
plot_size=uint8(32),
451451
difficulty=uint64(1000),
@@ -458,12 +458,12 @@ async def test_solution_response_handler(
458458

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

465465
# create solution response
466-
solution_response = solver_protocol.SolverResponse(quality_chain=quality, proof=b"test_proof_from_solver")
466+
solution_response = solver_protocol.SolverResponse(partial_proof=quality, proof=b"test_proof_from_solver")
467467
solver_peer = Mock()
468468
solver_peer.peer_node_id = "solver_peer"
469469

@@ -495,7 +495,7 @@ async def test_solution_response_unknown_quality(
495495
solver_peer = await get_solver_peer(farmer)
496496

497497
# create solution response with unknown quality
498-
solution_response = solver_protocol.SolverResponse(quality_chain=bytes(b"1" * 32), proof=b"test_proof")
498+
solution_response = solver_protocol.SolverResponse(partial_proof=bytes(b"1" * 32), proof=b"test_proof")
499499

500500
with unittest.mock.patch.object(farmer_api, "new_proof_of_space", new_callable=AsyncMock) as mock_new_proof:
501501
await farmer_api.solution_response(solution_response, solver_peer)
@@ -509,7 +509,6 @@ 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."""
513512
_, farmer_service, _solver_service, _ = farmer_one_harvester_solver
514513
farmer_api = farmer_service._api
515514
farmer = farmer_api.farmer
@@ -519,11 +518,11 @@ async def test_solution_response_empty_proof(
519518
sp_hash = bytes32(b"1" * 32)
520519
challenge_hash = bytes32(b"2" * 32)
521520

522-
v2_quality_chains = harvester_protocol.V2QualityChains(
521+
partial_proofs = harvester_protocol.PartialProofsData(
523522
challenge_hash=challenge_hash,
524523
sp_hash=sp_hash,
525524
plot_identifier="test_plot_id",
526-
quality_chains=[b"test_quality_chain_for_quality"],
525+
partial_proofs=[b"test_partial_proof_for_quality"],
527526
signage_point_index=uint8(0),
528527
plot_size=uint8(32),
529528
difficulty=uint64(1000),
@@ -537,15 +536,15 @@ async def test_solution_response_empty_proof(
537536

538537
# manually add pending request
539538
farmer.pending_solver_requests[quality] = {
540-
"quality_data": v2_quality_chains,
539+
"proof_data": partial_proofs,
541540
"peer": harvester_peer,
542541
}
543542

544543
# get real solver peer connection
545544
solver_peer = await get_solver_peer(farmer)
546545

547546
# create solution response with empty proof
548-
solution_response = solver_protocol.SolverResponse(quality_chain=quality, proof=b"")
547+
solution_response = solver_protocol.SolverResponse(partial_proof=quality, proof=b"")
549548

550549
with unittest.mock.patch.object(farmer_api, "new_proof_of_space", new_callable=AsyncMock) as mock_new_proof:
551550
await farmer_api.solution_response(solution_response, solver_peer)
@@ -558,10 +557,9 @@ async def test_solution_response_empty_proof(
558557

559558

560559
@pytest.mark.anyio
561-
async def test_v2_quality_chains_solver_exception(
560+
async def test_v2_partial_proofs_solver_exception(
562561
farmer_one_harvester_solver: tuple[list[HarvesterService], FarmerService, SolverService, BlockTools],
563562
) -> None:
564-
"""Test v2_quality_chains with solver service exception."""
565563
_, farmer_service, _solver_service, _ = farmer_one_harvester_solver
566564
farmer_api = farmer_service._api
567565
farmer = farmer_api.farmer
@@ -582,11 +580,11 @@ async def test_v2_quality_chains_solver_exception(
582580

583581
farmer.sps[sp_hash] = [sp]
584582

585-
v2_quality_chains = harvester_protocol.V2QualityChains(
583+
partial_proofs = harvester_protocol.PartialProofsData(
586584
challenge_hash=challenge_hash,
587585
sp_hash=sp_hash,
588586
plot_identifier="test_plot_id",
589-
quality_chains=[b"test_quality_chain_1"],
587+
partial_proofs=[b"test_partial_proof_1"],
590588
signage_point_index=uint8(0),
591589
plot_size=uint8(32),
592590
difficulty=uint64(1000),
@@ -599,7 +597,7 @@ async def test_v2_quality_chains_solver_exception(
599597

600598
# Mock send_to_all to raise an exception
601599
with unittest.mock.patch.object(farmer.server, "send_to_all", side_effect=Exception("Solver connection failed")):
602-
await farmer_api.v2_quality_chains(v2_quality_chains, harvester_peer)
600+
await farmer_api.partial_proofs(partial_proofs, harvester_peer)
603601

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

chia/_tests/solver/test_solver_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ async def test_solver_api_methods(blockchain_constants: ConsensusConstants, tmp_
2323
solver = solver_service._node
2424
solver_api = solver_service._api
2525
assert solver_api.ready() is True
26-
test_info = SolverInfo(plot_difficulty=uint64(1500), quality_chain=b"test_quality_chain_42")
26+
test_info = SolverInfo(plot_difficulty=uint64(1500), partial_proof=b"test_partial_proof_42")
2727
expected_proof = b"test_proof_data_12345"
2828
with patch.object(solver, "solve", return_value=expected_proof):
2929
api_result = await solver_api.solve(test_info)
@@ -49,7 +49,7 @@ async def test_solver_error_handling(
4949
pass # expected
5050
# test solver handles exception in solve method
5151
solver = solver_service._node
52-
test_info = SolverInfo(plot_difficulty=uint64(1000), quality_chain=b"test_quality_chain_zeros")
52+
test_info = SolverInfo(plot_difficulty=uint64(1000), partial_proof=b"test_partial_proof_zeros")
5353
with patch.object(solver, "solve", side_effect=RuntimeError("test error")):
5454
# solver api should handle exceptions gracefully
5555
result = await solver_service._api.solve(test_info)

chia/consensus/pos_quality.py

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

33
from chia_rs import PlotSize
4+
from chia_rs.sized_bytes import bytes32
45
from chia_rs.sized_ints import uint64
56

67
# The actual space in bytes of a plot, is _expected_plot_size(k) * UI_ACTUAL_SPACE_CONSTANT_FACTO
@@ -15,6 +16,11 @@
1516
}
1617

1718

19+
def quality_for_partial_proof(partial_proof: bytes, challenge: bytes32) -> bytes32:
20+
# TODO todo_v2_plots real implementaion
21+
return challenge
22+
23+
1824
def _expected_plot_size(size: PlotSize) -> uint64:
1925
"""
2026
Given the plot size parameter k (which is between 32 and 59), computes the

chia/farmer/farmer_api.py

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
from chia.protocols import farmer_protocol, harvester_protocol
1818
from chia.protocols.farmer_protocol import DeclareProofOfSpace, SignedValues
1919
from chia.protocols.harvester_protocol import (
20+
PartialProofsData,
2021
PlotSyncDone,
2122
PlotSyncPathList,
2223
PlotSyncPlotList,
2324
PlotSyncStart,
2425
PoolDifficulty,
2526
SignatureRequestSourceData,
2627
SigningDataKind,
27-
V2QualityChains,
2828
)
2929
from chia.protocols.outbound_message import Message, NodeType, make_msg
3030
from chia.protocols.pool_protocol import (
@@ -481,52 +481,52 @@ async def new_proof_of_space(
481481
return
482482

483483
@metadata.request(peer_required=True)
484-
async def v2_quality_chains(self, quality_data: V2QualityChains, peer: WSChiaConnection) -> None:
484+
async def partial_proofs(self, partial_proof_data: PartialProofsData, peer: WSChiaConnection) -> None:
485485
"""
486-
This is a response from the harvester for V2 plots, containing only quality chains (partial proof bytes).
486+
This is a response from the harvester for V2 plots, containing only partial proof data.
487487
We send these to the solver service and wait for a response with the full proof.
488488
"""
489-
if quality_data.sp_hash not in self.farmer.number_of_responses:
490-
self.farmer.number_of_responses[quality_data.sp_hash] = 0
491-
self.farmer.cache_add_time[quality_data.sp_hash] = uint64(time.time())
489+
if partial_proof_data.sp_hash not in self.farmer.number_of_responses:
490+
self.farmer.number_of_responses[partial_proof_data.sp_hash] = 0
491+
self.farmer.cache_add_time[partial_proof_data.sp_hash] = uint64(time.time())
492492

493-
if quality_data.sp_hash not in self.farmer.sps:
493+
if partial_proof_data.sp_hash not in self.farmer.sps:
494494
self.farmer.log.warning(
495-
f"Received V2 quality collection for a signage point that we do not have {quality_data.sp_hash}"
495+
f"Received partial proofs for a signage point that we do not have {partial_proof_data.sp_hash}"
496496
)
497497
return None
498498

499-
self.farmer.cache_add_time[quality_data.sp_hash] = uint64(time.time())
499+
self.farmer.cache_add_time[partial_proof_data.sp_hash] = uint64(time.time())
500500

501501
self.farmer.log.info(
502-
f"Received V2 quality collection with {len(quality_data.quality_chains)} quality chains "
503-
f"for plot {quality_data.plot_identifier[:10]}... from {peer.peer_node_id}"
502+
f"Received V2 partial proof collection with {len(partial_proof_data.partial_proofs)} partail proofs "
503+
f"for plot {partial_proof_data.plot_identifier[:10]}... from {peer.peer_node_id}"
504504
)
505505

506506
# Process each quality chain through solver service to get full proofs
507-
for quality_chain in quality_data.quality_chains:
507+
for partial_proof in partial_proof_data.partial_proofs:
508508
solver_info = SolverInfo(
509-
plot_difficulty=quality_data.difficulty,
510-
quality_chain=quality_chain,
509+
plot_difficulty=partial_proof_data.difficulty,
510+
partial_proof=partial_proof,
511511
)
512512

513513
try:
514514
# store pending request data for matching with response
515-
self.farmer.pending_solver_requests[quality_chain] = {
516-
"quality_data": quality_data,
515+
self.farmer.pending_solver_requests[partial_proof] = {
516+
"proof_data": partial_proof_data,
517517
"peer": peer,
518518
}
519519

520520
# send solve request to all solver connections
521521
msg = make_msg(ProtocolMessageTypes.solve, solver_info)
522522
await self.farmer.server.send_to_all([msg], NodeType.SOLVER)
523-
self.farmer.log.debug(f"Sent solve request for quality {quality_chain.hex()[:10]}...")
523+
self.farmer.log.debug(f"Sent solve request for quality {partial_proof.hex()[:10]}...")
524524

525525
except Exception as e:
526-
self.farmer.log.error(f"Failed to call solver service for quality {quality_chain.hex()[:10]}...: {e}")
526+
self.farmer.log.error(f"Failed to call solver service for quality {partial_proof.hex()[:10]}...: {e}")
527527
# clean up pending request
528-
if quality_chain in self.farmer.pending_solver_requests:
529-
del self.farmer.pending_solver_requests[quality_chain]
528+
if partial_proof in self.farmer.pending_solver_requests:
529+
del self.farmer.pending_solver_requests[partial_proof]
530530

531531
@metadata.request()
532532
async def solution_response(self, response: SolverResponse, peer: WSChiaConnection) -> None:
@@ -538,36 +538,36 @@ async def solution_response(self, response: SolverResponse, peer: WSChiaConnecti
538538

539539
# find the matching pending request using quality_string
540540

541-
if response.quality_chain not in self.farmer.pending_solver_requests:
542-
self.farmer.log.warning(f"Received solver response for unknown quality {response.quality_chain.hex()}")
541+
if response.partial_proof not in self.farmer.pending_solver_requests:
542+
self.farmer.log.warning(f"Received solver response for unknown quality {response.partial_proof.hex()}")
543543
return
544544

545545
# get the original request data
546-
request_data = self.farmer.pending_solver_requests.pop(response.quality_chain)
547-
quality_data = request_data["quality_data"]
546+
request_data = self.farmer.pending_solver_requests.pop(response.partial_proof)
547+
proof_data = request_data["proof_data"]
548548
original_peer = request_data["peer"]
549-
quality = response.quality_chain
549+
quality = response.partial_proof
550550

551551
# create the proof of space with the solver's proof
552552
proof_bytes = response.proof
553553
if proof_bytes is None or len(proof_bytes) == 0:
554-
self.farmer.log.warning(f"Received empty proof from solver for quality {quality.hex()}...")
554+
self.farmer.log.warning(f"Received empty proof from solver for proof {quality.hex()}...")
555555
return
556556

557-
sp_challenge_hash = quality_data.challenge_hash
557+
sp_challenge_hash = proof_data.challenge_hash
558558
new_proof_of_space = harvester_protocol.NewProofOfSpace(
559-
quality_data.challenge_hash,
560-
quality_data.sp_hash,
561-
quality_data.plot_identifier,
559+
proof_data.challenge_hash,
560+
proof_data.sp_hash,
561+
proof_data.plot_identifier,
562562
ProofOfSpace(
563563
sp_challenge_hash,
564-
quality_data.pool_public_key,
565-
quality_data.pool_contract_puzzle_hash,
566-
quality_data.plot_public_key,
567-
quality_data.plot_size,
564+
proof_data.pool_public_key,
565+
proof_data.pool_contract_puzzle_hash,
566+
proof_data.plot_public_key,
567+
proof_data.plot_size,
568568
proof_bytes,
569569
),
570-
quality_data.signage_point_index,
570+
proof_data.signage_point_index,
571571
include_source_signature_data=False,
572572
farmer_reward_address_override=None,
573573
fee_info=None,

0 commit comments

Comments
 (0)