xch-blockchain/chia/protocols/harvester_protocol.py

177 lines
4.2 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from typing import List, Optional, Tuple
from blspy import G1Element, G2Element
from chia.types.blockchain_format.proof_of_space import ProofOfSpace
from chia.types.blockchain_format.sized_bytes import bytes32
from chia.util.ints import int16, uint8, uint32, uint64
from chia.util.streamable import Streamable, streamable
"""
Protocol between harvester and farmer.
Note: When changing this file, also change protocol_message_types.py, and the protocol version in shared_protocol.py
"""
@streamable
@dataclass(frozen=True)
class PoolDifficulty(Streamable):
difficulty: uint64
sub_slot_iters: uint64
pool_contract_puzzle_hash: bytes32
@streamable
@dataclass(frozen=True)
class HarvesterHandshake(Streamable):
farmer_public_keys: List[G1Element]
pool_public_keys: List[G1Element]
@streamable
@dataclass(frozen=True)
class NewSignagePointHarvester(Streamable):
challenge_hash: bytes32
difficulty: uint64
sub_slot_iters: uint64
signage_point_index: uint8
sp_hash: bytes32
pool_difficulties: List[PoolDifficulty]
@streamable
@dataclass(frozen=True)
class NewProofOfSpace(Streamable):
challenge_hash: bytes32
sp_hash: bytes32
plot_identifier: str
proof: ProofOfSpace
signage_point_index: uint8
@streamable
@dataclass(frozen=True)
class RequestSignatures(Streamable):
plot_identifier: str
challenge_hash: bytes32
sp_hash: bytes32
messages: List[bytes32]
@streamable
@dataclass(frozen=True)
class RespondSignatures(Streamable):
plot_identifier: str
challenge_hash: bytes32
sp_hash: bytes32
local_pk: G1Element
farmer_pk: G1Element
message_signatures: List[Tuple[bytes32, G2Element]]
@streamable
@dataclass(frozen=True)
class Plot(Streamable):
filename: str
size: uint8
plot_id: bytes32
pool_public_key: Optional[G1Element]
pool_contract_puzzle_hash: Optional[bytes32]
plot_public_key: G1Element
file_size: uint64
time_modified: uint64
@streamable
@dataclass(frozen=True)
class RequestPlots(Streamable):
pass
@streamable
@dataclass(frozen=True)
class RespondPlots(Streamable):
plots: List[Plot]
failed_to_open_filenames: List[str]
no_key_filenames: List[str]
@streamable
@dataclass(frozen=True)
class PlotSyncIdentifier(Streamable):
timestamp: uint64
sync_id: uint64
message_id: uint64
@streamable
@dataclass(frozen=True)
class PlotSyncStart(Streamable):
identifier: PlotSyncIdentifier
initial: bool
last_sync_id: uint64
plot_file_count: uint32
def __str__(self) -> str:
return (
f"PlotSyncStart: identifier {self.identifier}, initial {self.initial}, "
f"last_sync_id {self.last_sync_id}, plot_file_count {self.plot_file_count}"
)
@streamable
@dataclass(frozen=True)
class PlotSyncPathList(Streamable):
identifier: PlotSyncIdentifier
data: List[str]
final: bool
def __str__(self) -> str:
return f"PlotSyncPathList: identifier {self.identifier}, count {len(self.data)}, final {self.final}"
@streamable
@dataclass(frozen=True)
class PlotSyncPlotList(Streamable):
identifier: PlotSyncIdentifier
data: List[Plot]
final: bool
def __str__(self) -> str:
return f"PlotSyncPlotList: identifier {self.identifier}, count {len(self.data)}, final {self.final}"
@streamable
@dataclass(frozen=True)
class PlotSyncDone(Streamable):
identifier: PlotSyncIdentifier
duration: uint64
def __str__(self) -> str:
return f"PlotSyncDone: identifier {self.identifier}, duration {self.duration}"
@streamable
@dataclass(frozen=True)
class PlotSyncError(Streamable):
code: int16
message: str
expected_identifier: Optional[PlotSyncIdentifier]
def __str__(self) -> str:
return f"PlotSyncError: code {self.code}, count {self.message}, expected_identifier {self.expected_identifier}"
@streamable
@dataclass(frozen=True)
class PlotSyncResponse(Streamable):
identifier: PlotSyncIdentifier
message_type: int16
error: Optional[PlotSyncError]
def __str__(self) -> str:
return f"PlotSyncResponse: identifier {self.identifier}, message_type {self.message_type}, error {self.error}"