Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions chia/_tests/util/build_network_protocol_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ def visit_harvester_protocol(visitor: Callable[[Any, str], None]) -> None:
visitor(pool_difficulty, "pool_difficulty")
visitor(harvester_handhsake, "harvester_handhsake")
visitor(new_signage_point_harvester, "new_signage_point_harvester")
visitor(new_signage_point_harvester2, "new_signage_point_harvester2")
visitor(new_proof_of_space, "new_proof_of_space")
visitor(request_signatures, "request_signatures")
visitor(respond_signatures, "respond_signatures")
Expand Down
11 changes: 11 additions & 0 deletions chia/_tests/util/network_protocol_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,16 @@
)

new_signage_point_harvester = harvester_protocol.NewSignagePointHarvester(
bytes32(bytes.fromhex("e342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb")),
uint64(15615706268399948682),
uint64(10520767421667792980),
uint8(148),
bytes32(bytes.fromhex("b78c9fca155e9742df835cbe84bb7e518bee70d78b6be6e39996c0a02e0cfe4c")),
[pool_difficulty],
uint8(3),
)

new_signage_point_harvester2 = harvester_protocol.NewSignagePointHarvester2(
bytes32(bytes.fromhex("e342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb")),
uint64(15615706268399948682),
uint64(10520767421667792980),
Expand All @@ -799,6 +809,7 @@
uint32(0),
)


new_proof_of_space = harvester_protocol.NewProofOfSpace(
bytes32.fromhex("1b64ec6bf3fe33bb80eca5b64ff1c88be07771eaed1e98a7199510522087e56e"),
bytes32.fromhex("ad1f8a74376ce8c5c93b7fbb355c2fb6d689ae4f4a7134166593d95265a3da30"),
Expand Down
Binary file modified chia/_tests/util/protocol_messages_bytes-v1.0
Binary file not shown.
16 changes: 16 additions & 0 deletions chia/_tests/util/protocol_messages_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -2148,6 +2148,22 @@
}

new_signage_point_harvester_json: dict[str, Any] = {
"challenge_hash": "0xe342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb",
"difficulty": 15615706268399948682,
"sub_slot_iters": 10520767421667792980,
"signage_point_index": 148,
"sp_hash": "0xb78c9fca155e9742df835cbe84bb7e518bee70d78b6be6e39996c0a02e0cfe4c",
"pool_difficulties": [
{
"difficulty": 14819251421858580996,
"sub_slot_iters": 12852879676624401630,
"pool_contract_puzzle_hash": "0xc9423123ea65e6923e973b95531b4874570dae942cb757a2daec4a6971753886",
}
],
"filter_prefix_bits": 3,
}

new_signage_point_harvester2_json: dict[str, Any] = {
"challenge_hash": "0xe342c21b4aeaa52349d42492be934692db58494ca9bce4a8697d06fdf8e583bb",
"difficulty": 15615706268399948682,
"sub_slot_iters": 10520767421667792980,
Expand Down
185 changes: 95 additions & 90 deletions chia/_tests/util/test_network_protocol_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,153 +426,158 @@ def test_protocol_bytes() -> None:
assert bytes(message_79) == bytes(new_signage_point_harvester)

message_bytes, input_bytes = parse_blob(input_bytes)
message_80 = type(new_proof_of_space).from_bytes(message_bytes)
assert message_80 == new_proof_of_space
assert bytes(message_80) == bytes(new_proof_of_space)
message_80 = type(new_signage_point_harvester2).from_bytes(message_bytes)
assert message_80 == new_signage_point_harvester2
assert bytes(message_80) == bytes(new_signage_point_harvester2)

message_bytes, input_bytes = parse_blob(input_bytes)
message_81 = type(request_signatures).from_bytes(message_bytes)
assert message_81 == request_signatures
assert bytes(message_81) == bytes(request_signatures)
message_81 = type(new_proof_of_space).from_bytes(message_bytes)
assert message_81 == new_proof_of_space
assert bytes(message_81) == bytes(new_proof_of_space)

message_bytes, input_bytes = parse_blob(input_bytes)
message_82 = type(respond_signatures).from_bytes(message_bytes)
assert message_82 == respond_signatures
assert bytes(message_82) == bytes(respond_signatures)
message_82 = type(request_signatures).from_bytes(message_bytes)
assert message_82 == request_signatures
assert bytes(message_82) == bytes(request_signatures)

message_bytes, input_bytes = parse_blob(input_bytes)
message_83 = type(plot).from_bytes(message_bytes)
assert message_83 == plot
assert bytes(message_83) == bytes(plot)
message_83 = type(respond_signatures).from_bytes(message_bytes)
assert message_83 == respond_signatures
assert bytes(message_83) == bytes(respond_signatures)

message_bytes, input_bytes = parse_blob(input_bytes)
message_84 = type(request_plots).from_bytes(message_bytes)
assert message_84 == request_plots
assert bytes(message_84) == bytes(request_plots)
message_84 = type(plot).from_bytes(message_bytes)
assert message_84 == plot
assert bytes(message_84) == bytes(plot)

message_bytes, input_bytes = parse_blob(input_bytes)
message_85 = type(respond_plots).from_bytes(message_bytes)
assert message_85 == respond_plots
assert bytes(message_85) == bytes(respond_plots)
message_85 = type(request_plots).from_bytes(message_bytes)
assert message_85 == request_plots
assert bytes(message_85) == bytes(request_plots)

message_bytes, input_bytes = parse_blob(input_bytes)
message_86 = type(request_peers_introducer).from_bytes(message_bytes)
assert message_86 == request_peers_introducer
assert bytes(message_86) == bytes(request_peers_introducer)
message_86 = type(respond_plots).from_bytes(message_bytes)
assert message_86 == respond_plots
assert bytes(message_86) == bytes(respond_plots)

message_bytes, input_bytes = parse_blob(input_bytes)
message_87 = type(respond_peers_introducer).from_bytes(message_bytes)
assert message_87 == respond_peers_introducer
assert bytes(message_87) == bytes(respond_peers_introducer)
message_87 = type(request_peers_introducer).from_bytes(message_bytes)
assert message_87 == request_peers_introducer
assert bytes(message_87) == bytes(request_peers_introducer)

message_bytes, input_bytes = parse_blob(input_bytes)
message_88 = type(authentication_payload).from_bytes(message_bytes)
assert message_88 == authentication_payload
assert bytes(message_88) == bytes(authentication_payload)
message_88 = type(respond_peers_introducer).from_bytes(message_bytes)
assert message_88 == respond_peers_introducer
assert bytes(message_88) == bytes(respond_peers_introducer)

message_bytes, input_bytes = parse_blob(input_bytes)
message_89 = type(get_pool_info_response).from_bytes(message_bytes)
assert message_89 == get_pool_info_response
assert bytes(message_89) == bytes(get_pool_info_response)
message_89 = type(authentication_payload).from_bytes(message_bytes)
assert message_89 == authentication_payload
assert bytes(message_89) == bytes(authentication_payload)

message_bytes, input_bytes = parse_blob(input_bytes)
message_90 = type(post_partial_payload).from_bytes(message_bytes)
assert message_90 == post_partial_payload
assert bytes(message_90) == bytes(post_partial_payload)
message_90 = type(get_pool_info_response).from_bytes(message_bytes)
assert message_90 == get_pool_info_response
assert bytes(message_90) == bytes(get_pool_info_response)

message_bytes, input_bytes = parse_blob(input_bytes)
message_91 = type(post_partial_request).from_bytes(message_bytes)
assert message_91 == post_partial_request
assert bytes(message_91) == bytes(post_partial_request)
message_91 = type(post_partial_payload).from_bytes(message_bytes)
assert message_91 == post_partial_payload
assert bytes(message_91) == bytes(post_partial_payload)

message_bytes, input_bytes = parse_blob(input_bytes)
message_92 = type(post_partial_response).from_bytes(message_bytes)
assert message_92 == post_partial_response
assert bytes(message_92) == bytes(post_partial_response)
message_92 = type(post_partial_request).from_bytes(message_bytes)
assert message_92 == post_partial_request
assert bytes(message_92) == bytes(post_partial_request)

message_bytes, input_bytes = parse_blob(input_bytes)
message_93 = type(get_farmer_response).from_bytes(message_bytes)
assert message_93 == get_farmer_response
assert bytes(message_93) == bytes(get_farmer_response)
message_93 = type(post_partial_response).from_bytes(message_bytes)
assert message_93 == post_partial_response
assert bytes(message_93) == bytes(post_partial_response)

message_bytes, input_bytes = parse_blob(input_bytes)
message_94 = type(post_farmer_payload).from_bytes(message_bytes)
assert message_94 == post_farmer_payload
assert bytes(message_94) == bytes(post_farmer_payload)
message_94 = type(get_farmer_response).from_bytes(message_bytes)
assert message_94 == get_farmer_response
assert bytes(message_94) == bytes(get_farmer_response)

message_bytes, input_bytes = parse_blob(input_bytes)
message_95 = type(post_farmer_request).from_bytes(message_bytes)
assert message_95 == post_farmer_request
assert bytes(message_95) == bytes(post_farmer_request)
message_95 = type(post_farmer_payload).from_bytes(message_bytes)
assert message_95 == post_farmer_payload
assert bytes(message_95) == bytes(post_farmer_payload)

message_bytes, input_bytes = parse_blob(input_bytes)
message_96 = type(post_farmer_response).from_bytes(message_bytes)
assert message_96 == post_farmer_response
assert bytes(message_96) == bytes(post_farmer_response)
message_96 = type(post_farmer_request).from_bytes(message_bytes)
assert message_96 == post_farmer_request
assert bytes(message_96) == bytes(post_farmer_request)

message_bytes, input_bytes = parse_blob(input_bytes)
message_97 = type(put_farmer_payload).from_bytes(message_bytes)
assert message_97 == put_farmer_payload
assert bytes(message_97) == bytes(put_farmer_payload)
message_97 = type(post_farmer_response).from_bytes(message_bytes)
assert message_97 == post_farmer_response
assert bytes(message_97) == bytes(post_farmer_response)

message_bytes, input_bytes = parse_blob(input_bytes)
message_98 = type(put_farmer_request).from_bytes(message_bytes)
assert message_98 == put_farmer_request
assert bytes(message_98) == bytes(put_farmer_request)
message_98 = type(put_farmer_payload).from_bytes(message_bytes)
assert message_98 == put_farmer_payload
assert bytes(message_98) == bytes(put_farmer_payload)

message_bytes, input_bytes = parse_blob(input_bytes)
message_99 = type(put_farmer_response).from_bytes(message_bytes)
assert message_99 == put_farmer_response
assert bytes(message_99) == bytes(put_farmer_response)
message_99 = type(put_farmer_request).from_bytes(message_bytes)
assert message_99 == put_farmer_request
assert bytes(message_99) == bytes(put_farmer_request)

message_bytes, input_bytes = parse_blob(input_bytes)
message_100 = type(error_response).from_bytes(message_bytes)
assert message_100 == error_response
assert bytes(message_100) == bytes(error_response)
message_100 = type(put_farmer_response).from_bytes(message_bytes)
assert message_100 == put_farmer_response
assert bytes(message_100) == bytes(put_farmer_response)

message_bytes, input_bytes = parse_blob(input_bytes)
message_101 = type(new_peak_timelord).from_bytes(message_bytes)
assert message_101 == new_peak_timelord
assert bytes(message_101) == bytes(new_peak_timelord)
message_101 = type(error_response).from_bytes(message_bytes)
assert message_101 == error_response
assert bytes(message_101) == bytes(error_response)

message_bytes, input_bytes = parse_blob(input_bytes)
message_102 = type(new_unfinished_block_timelord).from_bytes(message_bytes)
assert message_102 == new_unfinished_block_timelord
assert bytes(message_102) == bytes(new_unfinished_block_timelord)
message_102 = type(new_peak_timelord).from_bytes(message_bytes)
assert message_102 == new_peak_timelord
assert bytes(message_102) == bytes(new_peak_timelord)

message_bytes, input_bytes = parse_blob(input_bytes)
message_103 = type(new_infusion_point_vdf).from_bytes(message_bytes)
assert message_103 == new_infusion_point_vdf
assert bytes(message_103) == bytes(new_infusion_point_vdf)
message_103 = type(new_unfinished_block_timelord).from_bytes(message_bytes)
assert message_103 == new_unfinished_block_timelord
assert bytes(message_103) == bytes(new_unfinished_block_timelord)

message_bytes, input_bytes = parse_blob(input_bytes)
message_104 = type(new_signage_point_vdf).from_bytes(message_bytes)
assert message_104 == new_signage_point_vdf
assert bytes(message_104) == bytes(new_signage_point_vdf)
message_104 = type(new_infusion_point_vdf).from_bytes(message_bytes)
assert message_104 == new_infusion_point_vdf
assert bytes(message_104) == bytes(new_infusion_point_vdf)

message_bytes, input_bytes = parse_blob(input_bytes)
message_105 = type(new_end_of_sub_slot_bundle).from_bytes(message_bytes)
assert message_105 == new_end_of_sub_slot_bundle
assert bytes(message_105) == bytes(new_end_of_sub_slot_bundle)
message_105 = type(new_signage_point_vdf).from_bytes(message_bytes)
assert message_105 == new_signage_point_vdf
assert bytes(message_105) == bytes(new_signage_point_vdf)

message_bytes, input_bytes = parse_blob(input_bytes)
message_106 = type(request_compact_proof_of_time).from_bytes(message_bytes)
assert message_106 == request_compact_proof_of_time
assert bytes(message_106) == bytes(request_compact_proof_of_time)
message_106 = type(new_end_of_sub_slot_bundle).from_bytes(message_bytes)
assert message_106 == new_end_of_sub_slot_bundle
assert bytes(message_106) == bytes(new_end_of_sub_slot_bundle)

message_bytes, input_bytes = parse_blob(input_bytes)
message_107 = type(respond_compact_proof_of_time).from_bytes(message_bytes)
assert message_107 == respond_compact_proof_of_time
assert bytes(message_107) == bytes(respond_compact_proof_of_time)
message_107 = type(request_compact_proof_of_time).from_bytes(message_bytes)
assert message_107 == request_compact_proof_of_time
assert bytes(message_107) == bytes(request_compact_proof_of_time)

message_bytes, input_bytes = parse_blob(input_bytes)
message_108 = type(error_without_data).from_bytes(message_bytes)
assert message_108 == error_without_data
assert bytes(message_108) == bytes(error_without_data)
message_108 = type(respond_compact_proof_of_time).from_bytes(message_bytes)
assert message_108 == respond_compact_proof_of_time
assert bytes(message_108) == bytes(respond_compact_proof_of_time)

message_bytes, input_bytes = parse_blob(input_bytes)
message_109 = type(error_with_data).from_bytes(message_bytes)
assert message_109 == error_with_data
assert bytes(message_109) == bytes(error_with_data)
message_109 = type(error_without_data).from_bytes(message_bytes)
assert message_109 == error_without_data
assert bytes(message_109) == bytes(error_without_data)

message_bytes, input_bytes = parse_blob(input_bytes)
message_110 = type(error_with_data).from_bytes(message_bytes)
assert message_110 == error_with_data
assert bytes(message_110) == bytes(error_with_data)

assert input_bytes == b""
5 changes: 5 additions & 0 deletions chia/_tests/util/test_network_protocol_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@ def test_protocol_json() -> None:
type(new_signage_point_harvester).from_json_dict(new_signage_point_harvester_json)
== new_signage_point_harvester
)
assert str(new_signage_point_harvester2_json) == str(new_signage_point_harvester2.to_json_dict())
assert (
type(new_signage_point_harvester2).from_json_dict(new_signage_point_harvester2_json)
== new_signage_point_harvester2
)
assert str(new_proof_of_space_json) == str(new_proof_of_space.to_json_dict())
assert type(new_proof_of_space).from_json_dict(new_proof_of_space_json) == new_proof_of_space
assert str(request_signatures_json) == str(request_signatures.to_json_dict())
Expand Down
1 change: 1 addition & 0 deletions chia/_tests/util/test_network_protocol_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ def test_missing_messages() -> None:
"ProofOfSpaceFeeInfo",
"NewProofOfSpace",
"NewSignagePointHarvester",
"NewSignagePointHarvester2",
"Plot",
"PlotSyncDone",
"PlotSyncError",
Expand Down
34 changes: 30 additions & 4 deletions chia/farmer/farmer_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
from typing import TYPE_CHECKING, Any, ClassVar, Optional, Union, cast

import aiohttp
from chia_rs import AugSchemeMPL, G2Element, PoolTarget, PrivateKey
from chia_rs import AugSchemeMPL, G2Element, PlotSize, PoolTarget, PrivateKey
from chia_rs.sized_bytes import bytes32
from chia_rs.sized_ints import uint8, uint16, uint32, uint64
from packaging.version import Version

from chia import __version__
from chia.consensus.pot_iterations import calculate_iterations_quality, calculate_sp_interval_iters
Expand Down Expand Up @@ -38,6 +39,7 @@
from chia.server.ws_connection import WSChiaConnection
from chia.ssl.create_ssl import get_mozilla_ca_crt
from chia.types.blockchain_format.proof_of_space import (
calculate_prefix_bits,
generate_plot_public_key,
generate_taproot_sk,
get_plot_id,
Expand Down Expand Up @@ -528,7 +530,8 @@ async def new_signage_point(self, new_signage_point: farmer_protocol.NewSignageP
p2_singleton_puzzle_hash,
)
)
message = harvester_protocol.NewSignagePointHarvester(

message2 = harvester_protocol.NewSignagePointHarvester2(
new_signage_point.challenge_hash,
new_signage_point.difficulty,
new_signage_point.sub_slot_iters,
Expand All @@ -539,8 +542,31 @@ async def new_signage_point(self, new_signage_point: farmer_protocol.NewSignageP
new_signage_point.last_tx_height,
)

msg = make_msg(ProtocolMessageTypes.new_signage_point_harvester, message)
await self.farmer.server.send_to_all([msg], NodeType.HARVESTER)
# The plot size in the call to calculate_prefix_bits is only used
# to distinguish v1 and v2 plots. The value does not matter
message1 = harvester_protocol.NewSignagePointHarvester(
new_signage_point.challenge_hash,
new_signage_point.difficulty,
new_signage_point.sub_slot_iters,
new_signage_point.signage_point_index,
new_signage_point.challenge_chain_sp,
pool_difficulties,
uint8(
calculate_prefix_bits(self.farmer.constants, new_signage_point.peak_height, PlotSize.make_v1(32))
),
)

def old_harvesters(conn: WSChiaConnection) -> bool:
return conn.protocol_version <= Version("0.0.36")

def new_harvesters(conn: WSChiaConnection) -> bool:
return conn.protocol_version > Version("0.0.36")

msg1 = make_msg(ProtocolMessageTypes.new_signage_point_harvester, message1)
await self.farmer.server.send_to_all_if([msg1], NodeType.HARVESTER, old_harvesters)

msg2 = make_msg(ProtocolMessageTypes.new_signage_point_harvester, message2)
await self.farmer.server.send_to_all_if([msg2], NodeType.HARVESTER, new_harvesters)
except Exception as exception:
# Remove here, as we want to reprocess the SP should it be sent again
self.farmer.sps[new_signage_point.challenge_chain_sp].remove(new_signage_point)
Expand Down
Loading
Loading