Skip to content

Commit b69a9d4

Browse files
committed
improve v2-plot support in plot-sync
1 parent ab53414 commit b69a9d4

File tree

6 files changed

+34
-23
lines changed

6 files changed

+34
-23
lines changed

chia/_tests/plot_sync/test_plot_sync.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,7 @@ async def plot_sync_callback(self, peer_id: bytes32, delta: Optional[Delta]) ->
195195
plot = harvester.plot_manager.plots.get(Path(path), None)
196196
assert plot is not None
197197
assert plot.prover.get_filename() == delta.valid.additions[path].filename
198-
# TODO: todo_v2_plots support v2 plots
199-
assert plot.prover.get_param().size_v1 == delta.valid.additions[path].size
198+
assert plot.prover.get_param() == delta.valid.additions[path].param()
200199
assert plot.prover.get_id() == delta.valid.additions[path].plot_id
201200
assert plot.prover.get_compression_level() == delta.valid.additions[path].compression_level
202201
assert plot.pool_public_key == delta.valid.additions[path].pool_public_key
@@ -257,8 +256,7 @@ async def run_sync_test(self) -> None:
257256
for path, plot_info in plot_manager.plots.items():
258257
assert str(path) in receiver.plots()
259258
assert plot_info.prover.get_filename() == receiver.plots()[str(path)].filename
260-
# TODO: todo_v2_plots support v2 plots
261-
assert plot_info.prover.get_param().size_v1 == receiver.plots()[str(path)].size
259+
assert plot_info.prover.get_param() == receiver.plots()[str(path)].param()
262260
assert plot_info.prover.get_id() == receiver.plots()[str(path)].plot_id
263261
assert plot_info.prover.get_compression_level() == receiver.plots()[str(path)].compression_level
264262
assert plot_info.pool_public_key == receiver.plots()[str(path)].pool_public_key

chia/_tests/plot_sync/test_receiver.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typing import Any, Callable, Union
88

99
import pytest
10-
from chia_rs import G1Element, PlotParam
10+
from chia_rs import G1Element
1111
from chia_rs.sized_bytes import bytes32
1212
from chia_rs.sized_ints import uint8, uint32, uint64
1313

@@ -189,7 +189,7 @@ def plot_sync_setup(seeded_random: random.Random) -> tuple[Receiver, list[SyncSt
189189
# TODO: todo_v2_plots support v2 plots
190190
receiver._total_effective_plot_size = int(
191191
sum(
192-
UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(PlotParam.make_v1(plot.size), DEFAULT_CONSTANTS))
192+
UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(plot.param(), DEFAULT_CONSTANTS))
193193
for plot in receiver.plots().values()
194194
)
195195
)
@@ -272,9 +272,8 @@ async def test_to_dict(counts_only: bool, seeded_random: random.Random) -> None:
272272
assert get_list_or_len(plot_sync_dict_1["duplicates"], not counts_only) == 0
273273
assert plot_sync_dict_1["total_plot_size"] == sum(plot.file_size for plot in receiver.plots().values())
274274
assert plot_sync_dict_1["total_effective_plot_size"] == int(
275-
# TODO: todo_v2_plots support v2 plots
276275
sum(
277-
UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(PlotParam.make_v1(plot.size), DEFAULT_CONSTANTS))
276+
UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(plot.param(), DEFAULT_CONSTANTS))
278277
for plot in receiver.plots().values()
279278
)
280279
)
@@ -322,10 +321,9 @@ async def test_to_dict(counts_only: bool, seeded_random: random.Random) -> None:
322321
assert get_list_or_len(sync_steps[State.duplicates].args[0], counts_only) == plot_sync_dict_3["duplicates"]
323322

324323
assert plot_sync_dict_3["total_plot_size"] == sum(plot.file_size for plot in receiver.plots().values())
325-
# TODO: todo_v2_plots support v2 plots
326324
assert plot_sync_dict_3["total_effective_plot_size"] == int(
327325
sum(
328-
UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(PlotParam.make_v1(plot.size), DEFAULT_CONSTANTS))
326+
UI_ACTUAL_SPACE_CONSTANT_FACTOR * int(_expected_plot_size(plot.param(), DEFAULT_CONSTANTS))
329327
for plot in receiver.plots().values()
330328
)
331329
)

chia/harvester/harvester.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from typing import TYPE_CHECKING, Any, ClassVar, Optional, cast
1212

1313
from chia_rs import ConsensusConstants
14-
from chia_rs.sized_ints import uint32
14+
from chia_rs.sized_ints import uint8, uint32
1515
from typing_extensions import Literal
1616

1717
from chia.plot_sync.sender import Sender
@@ -195,9 +195,10 @@ def get_plots(self) -> tuple[list[dict[str, Any]], list[str], list[str]]:
195195
prover = plot_info.prover
196196
param = prover.get_param()
197197
if param.size_v1 is not None:
198-
k = param.size_v1
198+
k = uint8(param.size_v1)
199199
else:
200-
k = self.constants.PLOT_SIZE_V2
200+
assert param.strength_v2 is not None
201+
k = uint8(0x80 | param.strength_v2)
201202
response_plots.append(
202203
{
203204
"filename": str(path),

chia/plot_sync/receiver.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from dataclasses import dataclass, field
77
from typing import Any, Callable, Optional, Union
88

9-
from chia_rs import ConsensusConstants, PlotParam
9+
from chia_rs import ConsensusConstants
1010
from chia_rs.sized_bytes import bytes32
1111
from chia_rs.sized_ints import int16, uint32, uint64
1212
from typing_extensions import Protocol
@@ -354,10 +354,8 @@ async def _sync_done(self, data: PlotSyncDone) -> None:
354354
self._total_plot_size = sum(plot.file_size for plot in self._plots.values())
355355

356356
self._total_effective_plot_size = int(
357-
# TODO: todo_v2_plots support v2 plots
358357
sum(
359-
UI_ACTUAL_SPACE_CONSTANT_FACTOR
360-
* int(_expected_plot_size(PlotParam.make_v1(plot.size), self._constants))
358+
UI_ACTUAL_SPACE_CONSTANT_FACTOR * _expected_plot_size(plot.param(), self._constants)
361359
for plot in self._plots.values()
362360
)
363361
)

chia/plot_sync/sender.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from pathlib import Path
1010
from typing import Any, Generic, Optional, TypeVar
1111

12-
from chia_rs.sized_ints import int16, uint32, uint64
12+
from chia_rs.sized_ints import int16, uint8, uint32, uint64
1313
from typing_extensions import Protocol
1414

1515
from chia.plot_sync.exceptions import AlreadyStartedError, InvalidConnectionTypeError
@@ -37,13 +37,18 @@
3737
def _convert_plot_info_list(plot_infos: list[PlotInfo]) -> list[Plot]:
3838
converted: list[Plot] = []
3939
for plot_info in plot_infos:
40-
# TODO: todo_v2_plots support v2 plots
41-
k = plot_info.prover.get_param().size_v1
42-
assert k is not None
40+
param = plot_info.prover.get_param()
41+
k: uint8
42+
if param.size_v1 is not None:
43+
k = param.size_v1
44+
else:
45+
assert param.strength_v2 is not None
46+
k = uint8(0x80 | param.strength_v2)
47+
4348
converted.append(
4449
Plot(
4550
filename=plot_info.prover.get_filename(),
46-
size=k,
51+
size=uint8(k),
4752
plot_id=plot_info.prover.get_id(),
4853
pool_public_key=plot_info.pool_public_key,
4954
pool_contract_puzzle_hash=plot_info.pool_contract_puzzle_hash,

chia/protocols/harvester_protocol.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from enum import IntEnum
55
from typing import Optional
66

7-
from chia_rs import G1Element, G2Element, PartialProof, ProofOfSpace, RewardChainBlockUnfinished
7+
from chia_rs import G1Element, G2Element, PartialProof, PlotParam, ProofOfSpace, RewardChainBlockUnfinished
88
from chia_rs.sized_bytes import bytes32
99
from chia_rs.sized_ints import int16, uint8, uint32, uint64
1010

@@ -142,6 +142,11 @@ class RespondSignatures(Streamable):
142142
@dataclass(frozen=True)
143143
class Plot(Streamable):
144144
filename: str
145+
# for backwards compatibility with previous harvester (e.g. DrPlotter)
146+
# this field is either k-size (for v1 plots) or strength (for v2 plots).
147+
# the most significant bit is set for v2 plots
148+
# TODO: after the phase-out, v1 harvester won't be relevant anymore and we
149+
# can clean this up with a new protocol version
145150
size: uint8
146151
plot_id: bytes32
147152
pool_public_key: Optional[G1Element]
@@ -151,6 +156,12 @@ class Plot(Streamable):
151156
time_modified: uint64
152157
compression_level: Optional[uint8]
153158

159+
def param(self) -> PlotParam:
160+
if (self.size & 0x80) != 0:
161+
return PlotParam.make_v2(self.size & 0x7F)
162+
else:
163+
return PlotParam.make_v1(self.size)
164+
154165

155166
@streamable
156167
@dataclass(frozen=True)

0 commit comments

Comments
 (0)