Skip to content

Commit ecb54a5

Browse files
arvidnAmineKhaldi
andauthored
support previous harvester protocol (#19994)
* support previous harvester protocol * Update chia/protocols/harvester_protocol.py Co-authored-by: Amine Khaldi <[email protected]> --------- Co-authored-by: Amine Khaldi <[email protected]>
1 parent c7aafcf commit ecb54a5

10 files changed

+175
-96
lines changed

chia/_tests/util/build_network_protocol_files.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ def visit_harvester_protocol(visitor: Callable[[Any, str], None]) -> None:
117117
visitor(pool_difficulty, "pool_difficulty")
118118
visitor(harvester_handhsake, "harvester_handhsake")
119119
visitor(new_signage_point_harvester, "new_signage_point_harvester")
120+
visitor(new_signage_point_harvester2, "new_signage_point_harvester2")
120121
visitor(new_proof_of_space, "new_proof_of_space")
121122
visitor(request_signatures, "request_signatures")
122123
visitor(respond_signatures, "respond_signatures")

chia/_tests/util/network_protocol_data.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,16 @@
789789
)
790790

791791
new_signage_point_harvester = harvester_protocol.NewSignagePointHarvester(
792+
bytes32(bytes.fromhex("e342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb")),
793+
uint64(15615706268399948682),
794+
uint64(10520767421667792980),
795+
uint8(148),
796+
bytes32(bytes.fromhex("b78c9fca155e9742df835cbe84bb7e518bee70d78b6be6e39996c0a02e0cfe4c")),
797+
[pool_difficulty],
798+
uint8(3),
799+
)
800+
801+
new_signage_point_harvester2 = harvester_protocol.NewSignagePointHarvester2(
792802
bytes32(bytes.fromhex("e342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb")),
793803
uint64(15615706268399948682),
794804
uint64(10520767421667792980),
@@ -799,6 +809,7 @@
799809
uint32(0),
800810
)
801811

812+
802813
new_proof_of_space = harvester_protocol.NewProofOfSpace(
803814
bytes32.fromhex("1b64ec6bf3fe33bb80eca5b64ff1c88be07771eaed1e98a7199510522087e56e"),
804815
bytes32.fromhex("ad1f8a74376ce8c5c93b7fbb355c2fb6d689ae4f4a7134166593d95265a3da30"),
138 Bytes
Binary file not shown.

chia/_tests/util/protocol_messages_json.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2148,6 +2148,22 @@
21482148
}
21492149

21502150
new_signage_point_harvester_json: dict[str, Any] = {
2151+
"challenge_hash": "0xe342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb",
2152+
"difficulty": 15615706268399948682,
2153+
"sub_slot_iters": 10520767421667792980,
2154+
"signage_point_index": 148,
2155+
"sp_hash": "0xb78c9fca155e9742df835cbe84bb7e518bee70d78b6be6e39996c0a02e0cfe4c",
2156+
"pool_difficulties": [
2157+
{
2158+
"difficulty": 14819251421858580996,
2159+
"sub_slot_iters": 12852879676624401630,
2160+
"pool_contract_puzzle_hash": "0xc9423123ea65e6923e973b95531b4874570dae942cb757a2daec4a6971753886",
2161+
}
2162+
],
2163+
"filter_prefix_bits": 3,
2164+
}
2165+
2166+
new_signage_point_harvester2_json: dict[str, Any] = {
21512167
"challenge_hash": "0xe342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb",
21522168
"difficulty": 15615706268399948682,
21532169
"sub_slot_iters": 10520767421667792980,

chia/_tests/util/test_network_protocol_files.py

Lines changed: 95 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -426,153 +426,158 @@ def test_protocol_bytes() -> None:
426426
assert bytes(message_79) == bytes(new_signage_point_harvester)
427427

428428
message_bytes, input_bytes = parse_blob(input_bytes)
429-
message_80 = type(new_proof_of_space).from_bytes(message_bytes)
430-
assert message_80 == new_proof_of_space
431-
assert bytes(message_80) == bytes(new_proof_of_space)
429+
message_80 = type(new_signage_point_harvester2).from_bytes(message_bytes)
430+
assert message_80 == new_signage_point_harvester2
431+
assert bytes(message_80) == bytes(new_signage_point_harvester2)
432432

433433
message_bytes, input_bytes = parse_blob(input_bytes)
434-
message_81 = type(request_signatures).from_bytes(message_bytes)
435-
assert message_81 == request_signatures
436-
assert bytes(message_81) == bytes(request_signatures)
434+
message_81 = type(new_proof_of_space).from_bytes(message_bytes)
435+
assert message_81 == new_proof_of_space
436+
assert bytes(message_81) == bytes(new_proof_of_space)
437437

438438
message_bytes, input_bytes = parse_blob(input_bytes)
439-
message_82 = type(respond_signatures).from_bytes(message_bytes)
440-
assert message_82 == respond_signatures
441-
assert bytes(message_82) == bytes(respond_signatures)
439+
message_82 = type(request_signatures).from_bytes(message_bytes)
440+
assert message_82 == request_signatures
441+
assert bytes(message_82) == bytes(request_signatures)
442442

443443
message_bytes, input_bytes = parse_blob(input_bytes)
444-
message_83 = type(plot).from_bytes(message_bytes)
445-
assert message_83 == plot
446-
assert bytes(message_83) == bytes(plot)
444+
message_83 = type(respond_signatures).from_bytes(message_bytes)
445+
assert message_83 == respond_signatures
446+
assert bytes(message_83) == bytes(respond_signatures)
447447

448448
message_bytes, input_bytes = parse_blob(input_bytes)
449-
message_84 = type(request_plots).from_bytes(message_bytes)
450-
assert message_84 == request_plots
451-
assert bytes(message_84) == bytes(request_plots)
449+
message_84 = type(plot).from_bytes(message_bytes)
450+
assert message_84 == plot
451+
assert bytes(message_84) == bytes(plot)
452452

453453
message_bytes, input_bytes = parse_blob(input_bytes)
454-
message_85 = type(respond_plots).from_bytes(message_bytes)
455-
assert message_85 == respond_plots
456-
assert bytes(message_85) == bytes(respond_plots)
454+
message_85 = type(request_plots).from_bytes(message_bytes)
455+
assert message_85 == request_plots
456+
assert bytes(message_85) == bytes(request_plots)
457457

458458
message_bytes, input_bytes = parse_blob(input_bytes)
459-
message_86 = type(request_peers_introducer).from_bytes(message_bytes)
460-
assert message_86 == request_peers_introducer
461-
assert bytes(message_86) == bytes(request_peers_introducer)
459+
message_86 = type(respond_plots).from_bytes(message_bytes)
460+
assert message_86 == respond_plots
461+
assert bytes(message_86) == bytes(respond_plots)
462462

463463
message_bytes, input_bytes = parse_blob(input_bytes)
464-
message_87 = type(respond_peers_introducer).from_bytes(message_bytes)
465-
assert message_87 == respond_peers_introducer
466-
assert bytes(message_87) == bytes(respond_peers_introducer)
464+
message_87 = type(request_peers_introducer).from_bytes(message_bytes)
465+
assert message_87 == request_peers_introducer
466+
assert bytes(message_87) == bytes(request_peers_introducer)
467467

468468
message_bytes, input_bytes = parse_blob(input_bytes)
469-
message_88 = type(authentication_payload).from_bytes(message_bytes)
470-
assert message_88 == authentication_payload
471-
assert bytes(message_88) == bytes(authentication_payload)
469+
message_88 = type(respond_peers_introducer).from_bytes(message_bytes)
470+
assert message_88 == respond_peers_introducer
471+
assert bytes(message_88) == bytes(respond_peers_introducer)
472472

473473
message_bytes, input_bytes = parse_blob(input_bytes)
474-
message_89 = type(get_pool_info_response).from_bytes(message_bytes)
475-
assert message_89 == get_pool_info_response
476-
assert bytes(message_89) == bytes(get_pool_info_response)
474+
message_89 = type(authentication_payload).from_bytes(message_bytes)
475+
assert message_89 == authentication_payload
476+
assert bytes(message_89) == bytes(authentication_payload)
477477

478478
message_bytes, input_bytes = parse_blob(input_bytes)
479-
message_90 = type(post_partial_payload).from_bytes(message_bytes)
480-
assert message_90 == post_partial_payload
481-
assert bytes(message_90) == bytes(post_partial_payload)
479+
message_90 = type(get_pool_info_response).from_bytes(message_bytes)
480+
assert message_90 == get_pool_info_response
481+
assert bytes(message_90) == bytes(get_pool_info_response)
482482

483483
message_bytes, input_bytes = parse_blob(input_bytes)
484-
message_91 = type(post_partial_request).from_bytes(message_bytes)
485-
assert message_91 == post_partial_request
486-
assert bytes(message_91) == bytes(post_partial_request)
484+
message_91 = type(post_partial_payload).from_bytes(message_bytes)
485+
assert message_91 == post_partial_payload
486+
assert bytes(message_91) == bytes(post_partial_payload)
487487

488488
message_bytes, input_bytes = parse_blob(input_bytes)
489-
message_92 = type(post_partial_response).from_bytes(message_bytes)
490-
assert message_92 == post_partial_response
491-
assert bytes(message_92) == bytes(post_partial_response)
489+
message_92 = type(post_partial_request).from_bytes(message_bytes)
490+
assert message_92 == post_partial_request
491+
assert bytes(message_92) == bytes(post_partial_request)
492492

493493
message_bytes, input_bytes = parse_blob(input_bytes)
494-
message_93 = type(get_farmer_response).from_bytes(message_bytes)
495-
assert message_93 == get_farmer_response
496-
assert bytes(message_93) == bytes(get_farmer_response)
494+
message_93 = type(post_partial_response).from_bytes(message_bytes)
495+
assert message_93 == post_partial_response
496+
assert bytes(message_93) == bytes(post_partial_response)
497497

498498
message_bytes, input_bytes = parse_blob(input_bytes)
499-
message_94 = type(post_farmer_payload).from_bytes(message_bytes)
500-
assert message_94 == post_farmer_payload
501-
assert bytes(message_94) == bytes(post_farmer_payload)
499+
message_94 = type(get_farmer_response).from_bytes(message_bytes)
500+
assert message_94 == get_farmer_response
501+
assert bytes(message_94) == bytes(get_farmer_response)
502502

503503
message_bytes, input_bytes = parse_blob(input_bytes)
504-
message_95 = type(post_farmer_request).from_bytes(message_bytes)
505-
assert message_95 == post_farmer_request
506-
assert bytes(message_95) == bytes(post_farmer_request)
504+
message_95 = type(post_farmer_payload).from_bytes(message_bytes)
505+
assert message_95 == post_farmer_payload
506+
assert bytes(message_95) == bytes(post_farmer_payload)
507507

508508
message_bytes, input_bytes = parse_blob(input_bytes)
509-
message_96 = type(post_farmer_response).from_bytes(message_bytes)
510-
assert message_96 == post_farmer_response
511-
assert bytes(message_96) == bytes(post_farmer_response)
509+
message_96 = type(post_farmer_request).from_bytes(message_bytes)
510+
assert message_96 == post_farmer_request
511+
assert bytes(message_96) == bytes(post_farmer_request)
512512

513513
message_bytes, input_bytes = parse_blob(input_bytes)
514-
message_97 = type(put_farmer_payload).from_bytes(message_bytes)
515-
assert message_97 == put_farmer_payload
516-
assert bytes(message_97) == bytes(put_farmer_payload)
514+
message_97 = type(post_farmer_response).from_bytes(message_bytes)
515+
assert message_97 == post_farmer_response
516+
assert bytes(message_97) == bytes(post_farmer_response)
517517

518518
message_bytes, input_bytes = parse_blob(input_bytes)
519-
message_98 = type(put_farmer_request).from_bytes(message_bytes)
520-
assert message_98 == put_farmer_request
521-
assert bytes(message_98) == bytes(put_farmer_request)
519+
message_98 = type(put_farmer_payload).from_bytes(message_bytes)
520+
assert message_98 == put_farmer_payload
521+
assert bytes(message_98) == bytes(put_farmer_payload)
522522

523523
message_bytes, input_bytes = parse_blob(input_bytes)
524-
message_99 = type(put_farmer_response).from_bytes(message_bytes)
525-
assert message_99 == put_farmer_response
526-
assert bytes(message_99) == bytes(put_farmer_response)
524+
message_99 = type(put_farmer_request).from_bytes(message_bytes)
525+
assert message_99 == put_farmer_request
526+
assert bytes(message_99) == bytes(put_farmer_request)
527527

528528
message_bytes, input_bytes = parse_blob(input_bytes)
529-
message_100 = type(error_response).from_bytes(message_bytes)
530-
assert message_100 == error_response
531-
assert bytes(message_100) == bytes(error_response)
529+
message_100 = type(put_farmer_response).from_bytes(message_bytes)
530+
assert message_100 == put_farmer_response
531+
assert bytes(message_100) == bytes(put_farmer_response)
532532

533533
message_bytes, input_bytes = parse_blob(input_bytes)
534-
message_101 = type(new_peak_timelord).from_bytes(message_bytes)
535-
assert message_101 == new_peak_timelord
536-
assert bytes(message_101) == bytes(new_peak_timelord)
534+
message_101 = type(error_response).from_bytes(message_bytes)
535+
assert message_101 == error_response
536+
assert bytes(message_101) == bytes(error_response)
537537

538538
message_bytes, input_bytes = parse_blob(input_bytes)
539-
message_102 = type(new_unfinished_block_timelord).from_bytes(message_bytes)
540-
assert message_102 == new_unfinished_block_timelord
541-
assert bytes(message_102) == bytes(new_unfinished_block_timelord)
539+
message_102 = type(new_peak_timelord).from_bytes(message_bytes)
540+
assert message_102 == new_peak_timelord
541+
assert bytes(message_102) == bytes(new_peak_timelord)
542542

543543
message_bytes, input_bytes = parse_blob(input_bytes)
544-
message_103 = type(new_infusion_point_vdf).from_bytes(message_bytes)
545-
assert message_103 == new_infusion_point_vdf
546-
assert bytes(message_103) == bytes(new_infusion_point_vdf)
544+
message_103 = type(new_unfinished_block_timelord).from_bytes(message_bytes)
545+
assert message_103 == new_unfinished_block_timelord
546+
assert bytes(message_103) == bytes(new_unfinished_block_timelord)
547547

548548
message_bytes, input_bytes = parse_blob(input_bytes)
549-
message_104 = type(new_signage_point_vdf).from_bytes(message_bytes)
550-
assert message_104 == new_signage_point_vdf
551-
assert bytes(message_104) == bytes(new_signage_point_vdf)
549+
message_104 = type(new_infusion_point_vdf).from_bytes(message_bytes)
550+
assert message_104 == new_infusion_point_vdf
551+
assert bytes(message_104) == bytes(new_infusion_point_vdf)
552552

553553
message_bytes, input_bytes = parse_blob(input_bytes)
554-
message_105 = type(new_end_of_sub_slot_bundle).from_bytes(message_bytes)
555-
assert message_105 == new_end_of_sub_slot_bundle
556-
assert bytes(message_105) == bytes(new_end_of_sub_slot_bundle)
554+
message_105 = type(new_signage_point_vdf).from_bytes(message_bytes)
555+
assert message_105 == new_signage_point_vdf
556+
assert bytes(message_105) == bytes(new_signage_point_vdf)
557557

558558
message_bytes, input_bytes = parse_blob(input_bytes)
559-
message_106 = type(request_compact_proof_of_time).from_bytes(message_bytes)
560-
assert message_106 == request_compact_proof_of_time
561-
assert bytes(message_106) == bytes(request_compact_proof_of_time)
559+
message_106 = type(new_end_of_sub_slot_bundle).from_bytes(message_bytes)
560+
assert message_106 == new_end_of_sub_slot_bundle
561+
assert bytes(message_106) == bytes(new_end_of_sub_slot_bundle)
562562

563563
message_bytes, input_bytes = parse_blob(input_bytes)
564-
message_107 = type(respond_compact_proof_of_time).from_bytes(message_bytes)
565-
assert message_107 == respond_compact_proof_of_time
566-
assert bytes(message_107) == bytes(respond_compact_proof_of_time)
564+
message_107 = type(request_compact_proof_of_time).from_bytes(message_bytes)
565+
assert message_107 == request_compact_proof_of_time
566+
assert bytes(message_107) == bytes(request_compact_proof_of_time)
567567

568568
message_bytes, input_bytes = parse_blob(input_bytes)
569-
message_108 = type(error_without_data).from_bytes(message_bytes)
570-
assert message_108 == error_without_data
571-
assert bytes(message_108) == bytes(error_without_data)
569+
message_108 = type(respond_compact_proof_of_time).from_bytes(message_bytes)
570+
assert message_108 == respond_compact_proof_of_time
571+
assert bytes(message_108) == bytes(respond_compact_proof_of_time)
572572

573573
message_bytes, input_bytes = parse_blob(input_bytes)
574-
message_109 = type(error_with_data).from_bytes(message_bytes)
575-
assert message_109 == error_with_data
576-
assert bytes(message_109) == bytes(error_with_data)
574+
message_109 = type(error_without_data).from_bytes(message_bytes)
575+
assert message_109 == error_without_data
576+
assert bytes(message_109) == bytes(error_without_data)
577+
578+
message_bytes, input_bytes = parse_blob(input_bytes)
579+
message_110 = type(error_with_data).from_bytes(message_bytes)
580+
assert message_110 == error_with_data
581+
assert bytes(message_110) == bytes(error_with_data)
577582

578583
assert input_bytes == b""

chia/_tests/util/test_network_protocol_json.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@ def test_protocol_json() -> None:
194194
type(new_signage_point_harvester).from_json_dict(new_signage_point_harvester_json)
195195
== new_signage_point_harvester
196196
)
197+
assert str(new_signage_point_harvester2_json) == str(new_signage_point_harvester2.to_json_dict())
198+
assert (
199+
type(new_signage_point_harvester2).from_json_dict(new_signage_point_harvester2_json)
200+
== new_signage_point_harvester2
201+
)
197202
assert str(new_proof_of_space_json) == str(new_proof_of_space.to_json_dict())
198203
assert type(new_proof_of_space).from_json_dict(new_proof_of_space_json) == new_proof_of_space
199204
assert str(request_signatures_json) == str(request_signatures.to_json_dict())

chia/_tests/util/test_network_protocol_test.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ def test_missing_messages() -> None:
172172
"ProofOfSpaceFeeInfo",
173173
"NewProofOfSpace",
174174
"NewSignagePointHarvester",
175+
"NewSignagePointHarvester2",
175176
"Plot",
176177
"PlotSyncDone",
177178
"PlotSyncError",

chia/farmer/farmer_api.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast
77

88
import aiohttp
9-
from chia_rs import AugSchemeMPL, G2Element, PoolTarget, PrivateKey
9+
from chia_rs import AugSchemeMPL, G2Element, PlotSize, PoolTarget, PrivateKey
1010
from chia_rs.sized_bytes import bytes32
1111
from chia_rs.sized_ints import uint8, uint16, uint32, uint64
12+
from packaging.version import Version
1213

1314
from chia import __version__
1415
from chia.consensus.pot_iterations import calculate_iterations_quality, calculate_sp_interval_iters
@@ -38,6 +39,7 @@
3839
from chia.server.ws_connection import WSChiaConnection
3940
from chia.ssl.create_ssl import get_mozilla_ca_crt
4041
from chia.types.blockchain_format.proof_of_space import (
42+
calculate_prefix_bits,
4143
generate_plot_public_key,
4244
generate_taproot_sk,
4345
get_plot_id,
@@ -528,7 +530,8 @@ async def new_signage_point(self, new_signage_point: farmer_protocol.NewSignageP
528530
p2_singleton_puzzle_hash,
529531
)
530532
)
531-
message = harvester_protocol.NewSignagePointHarvester(
533+
534+
message2 = harvester_protocol.NewSignagePointHarvester2(
532535
new_signage_point.challenge_hash,
533536
new_signage_point.difficulty,
534537
new_signage_point.sub_slot_iters,
@@ -539,8 +542,31 @@ async def new_signage_point(self, new_signage_point: farmer_protocol.NewSignageP
539542
new_signage_point.last_tx_height,
540543
)
541544

542-
msg = make_msg(ProtocolMessageTypes.new_signage_point_harvester, message)
543-
await self.farmer.server.send_to_all([msg], NodeType.HARVESTER)
545+
# The plot size in the call to calculate_prefix_bits is only used
546+
# to distinguish v1 and v2 plots. The value does not matter
547+
message1 = harvester_protocol.NewSignagePointHarvester(
548+
new_signage_point.challenge_hash,
549+
new_signage_point.difficulty,
550+
new_signage_point.sub_slot_iters,
551+
new_signage_point.signage_point_index,
552+
new_signage_point.challenge_chain_sp,
553+
pool_difficulties,
554+
uint8(
555+
calculate_prefix_bits(self.farmer.constants, new_signage_point.peak_height, PlotSize.make_v1(32))
556+
),
557+
)
558+
559+
def old_harvesters(conn: WSChiaConnection) -> bool:
560+
return conn.protocol_version <= Version("0.0.36")
561+
562+
def new_harvesters(conn: WSChiaConnection) -> bool:
563+
return conn.protocol_version > Version("0.0.36")
564+
565+
msg1 = make_msg(ProtocolMessageTypes.new_signage_point_harvester, message1)
566+
await self.farmer.server.send_to_all_if([msg1], NodeType.HARVESTER, old_harvesters)
567+
568+
msg2 = make_msg(ProtocolMessageTypes.new_signage_point_harvester, message2)
569+
await self.farmer.server.send_to_all_if([msg2], NodeType.HARVESTER, new_harvesters)
544570
except Exception as exception:
545571
# Remove here, as we want to reprocess the SP should it be sent again
546572
self.farmer.sps[new_signage_point.challenge_chain_sp].remove(new_signage_point)

0 commit comments

Comments
 (0)