mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2026-08-29 02:24:35 -05:00
* Enable PEP604 Ruff rules * Fix harcoded signature in test * Hack CLVMStreamable test with note to fast follow
355 lines
10 KiB
Python
355 lines
10 KiB
Python
# Package: utils
|
|
|
|
from __future__ import annotations
|
|
|
|
from enum import Enum
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from click import ClickException
|
|
|
|
|
|
class Err(Enum):
|
|
# temporary errors. Don't blacklist
|
|
DOES_NOT_EXTEND = -1
|
|
BAD_HEADER_SIGNATURE = -2
|
|
MISSING_FROM_STORAGE = -3
|
|
INVALID_PROTOCOL_MESSAGE = -4 # We WILL ban for a protocol violation.
|
|
SELF_CONNECTION = -5
|
|
INVALID_HANDSHAKE = -6
|
|
INVALID_ACK = -7
|
|
INCOMPATIBLE_PROTOCOL_VERSION = -8
|
|
DUPLICATE_CONNECTION = -9
|
|
BLOCK_NOT_IN_BLOCKCHAIN = -10
|
|
NO_PROOF_OF_SPACE_FOUND = -11
|
|
PEERS_DONT_HAVE_BLOCK = -12
|
|
MAX_INBOUND_CONNECTIONS_REACHED = -13
|
|
|
|
UNKNOWN = 1
|
|
|
|
# permanent errors. Block is un-salvageable garbage.
|
|
INVALID_BLOCK_SOLUTION = 2
|
|
INVALID_COIN_SOLUTION = 3
|
|
DUPLICATE_OUTPUT = 4
|
|
DOUBLE_SPEND = 5
|
|
UNKNOWN_UNSPENT = 6
|
|
BAD_AGGREGATE_SIGNATURE = 7
|
|
WRONG_PUZZLE_HASH = 8
|
|
BAD_FARMER_COIN_AMOUNT = 9
|
|
INVALID_CONDITION = 10
|
|
ASSERT_MY_COIN_ID_FAILED = 11
|
|
ASSERT_ANNOUNCE_CONSUMED_FAILED = 12
|
|
ASSERT_HEIGHT_RELATIVE_FAILED = 13
|
|
ASSERT_HEIGHT_ABSOLUTE_FAILED = 14
|
|
ASSERT_SECONDS_ABSOLUTE_FAILED = 15
|
|
COIN_AMOUNT_EXCEEDS_MAXIMUM = 16
|
|
|
|
SEXP_ERROR = 17
|
|
INVALID_FEE_LOW_FEE = 18
|
|
MEMPOOL_CONFLICT = 19
|
|
MINTING_COIN = 20
|
|
EXTENDS_UNKNOWN_BLOCK = 21
|
|
COINBASE_NOT_YET_SPENDABLE = 22
|
|
BLOCK_COST_EXCEEDS_MAX = 23
|
|
BAD_ADDITION_ROOT = 24
|
|
BAD_REMOVAL_ROOT = 25
|
|
|
|
INVALID_POSPACE_HASH = 26
|
|
INVALID_COINBASE_SIGNATURE = 27
|
|
INVALID_PLOT_SIGNATURE = 28
|
|
TIMESTAMP_TOO_FAR_IN_PAST = 29
|
|
TIMESTAMP_TOO_FAR_IN_FUTURE = 30
|
|
INVALID_TRANSACTIONS_FILTER_HASH = 31
|
|
INVALID_POSPACE_CHALLENGE = 32
|
|
INVALID_POSPACE = 33
|
|
INVALID_HEIGHT = 34
|
|
INVALID_COINBASE_AMOUNT = 35
|
|
INVALID_MERKLE_ROOT = 36
|
|
INVALID_BLOCK_FEE_AMOUNT = 37
|
|
INVALID_WEIGHT = 38
|
|
INVALID_TOTAL_ITERS = 39
|
|
BLOCK_IS_NOT_FINISHED = 40
|
|
INVALID_NUM_ITERATIONS = 41
|
|
INVALID_POT = 42
|
|
INVALID_POT_CHALLENGE = 43
|
|
INVALID_TRANSACTIONS_GENERATOR_HASH = 44
|
|
INVALID_POOL_TARGET = 45
|
|
|
|
INVALID_COINBASE_PARENT = 46
|
|
INVALID_FEES_COIN_PARENT = 47
|
|
RESERVE_FEE_CONDITION_FAILED = 48
|
|
|
|
NOT_BLOCK_BUT_HAS_DATA = 49
|
|
IS_TRANSACTION_BLOCK_BUT_NO_DATA = 50
|
|
INVALID_PREV_BLOCK_HASH = 51
|
|
INVALID_TRANSACTIONS_INFO_HASH = 52
|
|
INVALID_FOLIAGE_BLOCK_HASH = 53
|
|
INVALID_REWARD_COINS = 54
|
|
INVALID_BLOCK_COST = 55
|
|
NO_END_OF_SLOT_INFO = 56
|
|
INVALID_PREV_CHALLENGE_SLOT_HASH = 57
|
|
INVALID_SUB_EPOCH_SUMMARY_HASH = 58
|
|
NO_SUB_EPOCH_SUMMARY_HASH = 59
|
|
SHOULD_NOT_MAKE_CHALLENGE_BLOCK = 60
|
|
SHOULD_MAKE_CHALLENGE_BLOCK = 61
|
|
INVALID_CHALLENGE_CHAIN_DATA = 62
|
|
INVALID_CC_EOS_VDF = 65
|
|
INVALID_RC_EOS_VDF = 66
|
|
INVALID_CHALLENGE_SLOT_HASH_RC = 67
|
|
INVALID_PRIOR_POINT_RC = 68
|
|
INVALID_DEFICIT = 69
|
|
INVALID_SUB_EPOCH_SUMMARY = 70
|
|
INVALID_PREV_SUB_EPOCH_SUMMARY_HASH = 71
|
|
INVALID_REWARD_CHAIN_HASH = 72
|
|
INVALID_SUB_EPOCH_OVERFLOW = 73
|
|
INVALID_NEW_DIFFICULTY = 74
|
|
INVALID_NEW_SUB_SLOT_ITERS = 75
|
|
INVALID_CC_SP_VDF = 76
|
|
INVALID_RC_SP_VDF = 77
|
|
INVALID_CC_SIGNATURE = 78
|
|
INVALID_RC_SIGNATURE = 79
|
|
CANNOT_MAKE_CC_BLOCK = 80
|
|
INVALID_RC_SP_PREV_IP = 81
|
|
INVALID_RC_IP_PREV_IP = 82
|
|
INVALID_IS_TRANSACTION_BLOCK = 83
|
|
INVALID_URSB_HASH = 84
|
|
OLD_POOL_TARGET = 85
|
|
INVALID_POOL_SIGNATURE = 86
|
|
INVALID_FOLIAGE_BLOCK_PRESENCE = 87
|
|
INVALID_CC_IP_VDF = 88
|
|
INVALID_RC_IP_VDF = 89
|
|
IP_SHOULD_BE_NONE = 90
|
|
INVALID_REWARD_BLOCK_HASH = 91
|
|
INVALID_MADE_NON_OVERFLOW_INFUSIONS = 92
|
|
NO_OVERFLOWS_IN_FIRST_SUB_SLOT_NEW_EPOCH = 93
|
|
|
|
MEMPOOL_NOT_INITIALIZED = 94
|
|
SHOULD_NOT_HAVE_ICC = 95
|
|
SHOULD_HAVE_ICC = 96
|
|
INVALID_ICC_VDF = 97
|
|
INVALID_ICC_HASH_CC = 98
|
|
INVALID_ICC_HASH_RC = 99
|
|
INVALID_ICC_EOS_VDF = 100
|
|
INVALID_SP_INDEX = 101
|
|
TOO_MANY_BLOCKS = 102
|
|
INVALID_CC_CHALLENGE = 103
|
|
INVALID_PREFARM = 104
|
|
ASSERT_SECONDS_RELATIVE_FAILED = 105
|
|
BAD_COINBASE_SIGNATURE = 106
|
|
|
|
# INITIAL_TRANSACTION_FREEZE = 107 # removed
|
|
NO_TRANSACTIONS_WHILE_SYNCING = 108
|
|
ALREADY_INCLUDING_TRANSACTION = 109
|
|
INCOMPATIBLE_NETWORK_ID = 110
|
|
PRE_SOFT_FORK_MAX_GENERATOR_SIZE = 111 # Size in bytes
|
|
INVALID_REQUIRED_ITERS = 112
|
|
TOO_MANY_GENERATOR_REFS = 113 # Number of uint32 entries in the List
|
|
|
|
ASSERT_MY_PARENT_ID_FAILED = 114
|
|
ASSERT_MY_PUZZLEHASH_FAILED = 115
|
|
ASSERT_MY_AMOUNT_FAILED = 116
|
|
GENERATOR_RUNTIME_ERROR = 117
|
|
|
|
INVALID_COST_RESULT = 118
|
|
INVALID_TRANSACTIONS_GENERATOR_REFS_ROOT = 119
|
|
FUTURE_GENERATOR_REFS = 120 # All refs must be to blocks in the past
|
|
GENERATOR_REF_HAS_NO_GENERATOR = 121
|
|
DOUBLE_SPEND_IN_FORK = 122
|
|
|
|
INVALID_FEE_TOO_CLOSE_TO_ZERO = 123
|
|
COIN_AMOUNT_NEGATIVE = 124
|
|
INTERNAL_PROTOCOL_ERROR = 125
|
|
INVALID_SPEND_BUNDLE = 126
|
|
FAILED_GETTING_GENERATOR_MULTIPROCESSING = 127
|
|
|
|
ASSERT_BEFORE_SECONDS_ABSOLUTE_FAILED = 128
|
|
ASSERT_BEFORE_SECONDS_RELATIVE_FAILED = 129
|
|
ASSERT_BEFORE_HEIGHT_ABSOLUTE_FAILED = 130
|
|
ASSERT_BEFORE_HEIGHT_RELATIVE_FAILED = 131
|
|
ASSERT_CONCURRENT_SPEND_FAILED = 132
|
|
ASSERT_CONCURRENT_PUZZLE_FAILED = 133
|
|
|
|
IMPOSSIBLE_SECONDS_RELATIVE_CONSTRAINTS = 134
|
|
IMPOSSIBLE_SECONDS_ABSOLUTE_CONSTRAINTS = 135
|
|
IMPOSSIBLE_HEIGHT_RELATIVE_CONSTRAINTS = 136
|
|
IMPOSSIBLE_HEIGHT_ABSOLUTE_CONSTRAINTS = 137
|
|
|
|
ASSERT_MY_BIRTH_SECONDS_FAILED = 138
|
|
ASSERT_MY_BIRTH_HEIGHT_FAILED = 139
|
|
|
|
ASSERT_EPHEMERAL_FAILED = 140
|
|
EPHEMERAL_RELATIVE_CONDITION = 141
|
|
# raised if a SOFTFORK condition invokes an unknown extension in mempool
|
|
# mode
|
|
INVALID_SOFTFORK_CONDITION = 142
|
|
# raised if the first argument to the SOFTFORK condition is not a valid
|
|
# cost. e.g. negative or > UINT64 MAX
|
|
INVALID_SOFTFORK_COST = 143
|
|
# raised if a spend issues too many assert spend, assert puzzle,
|
|
# assert announcement or create announcement
|
|
TOO_MANY_ANNOUNCEMENTS = 144
|
|
# the message mode in SEND_MESSAGE or RECEIVE_MESSAGE condition is not valid
|
|
INVALID_MESSAGE_MODE = 145
|
|
# the specified coin ID is not valid
|
|
INVALID_COIN_ID = 146
|
|
# message not sent/received
|
|
MESSAGE_NOT_SENT_OR_RECEIVED = 147
|
|
# the transactions generator uses overlong encoding of CLVM atoms in its
|
|
# serialization
|
|
INVALID_TRANSACTIONS_GENERATOR_ENCODING = 148
|
|
|
|
|
|
class ValidationError(Exception):
|
|
def __init__(self, code: Err, error_msg: str = ""):
|
|
super().__init__(f"Error code: {code.name} {error_msg}")
|
|
self.code = code
|
|
self.error_msg = error_msg
|
|
|
|
|
|
class TimestampError(Exception):
|
|
def __init__(self) -> None:
|
|
self.code = Err.TIMESTAMP_TOO_FAR_IN_FUTURE
|
|
super().__init__(f"Error code: {self.code}")
|
|
|
|
|
|
class ConsensusError(Exception):
|
|
def __init__(self, code: Err, errors: list[Any] = []):
|
|
super().__init__(f"Error code: {code.name} {errors}")
|
|
self.code = code
|
|
self.errors = errors
|
|
|
|
|
|
class ProtocolError(Exception):
|
|
def __init__(self, code: Err, errors: list[Any] = []):
|
|
super().__init__(f"Error code: {code.name} {errors}")
|
|
self.code = code
|
|
self.errors = errors
|
|
|
|
|
|
class ApiError(Exception):
|
|
def __init__(self, code: Err, message: str, data: bytes | None = None):
|
|
super().__init__(f"{code.name}: {message}")
|
|
self.code: Err = code
|
|
self.message: str = message
|
|
self.data: bytes | None = data
|
|
|
|
|
|
##
|
|
# Keychain errors
|
|
##
|
|
|
|
|
|
class KeychainException(Exception):
|
|
pass
|
|
|
|
|
|
class KeychainKeyDataMismatch(KeychainException):
|
|
def __init__(self, data_type: str):
|
|
super().__init__(f"KeyData mismatch for: {data_type}")
|
|
|
|
|
|
class KeychainIsLocked(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainSecretsMissing(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainCurrentPassphraseIsInvalid(KeychainException):
|
|
def __init__(self) -> None:
|
|
super().__init__("Invalid current passphrase")
|
|
|
|
|
|
class KeychainMaxUnlockAttempts(KeychainException):
|
|
def __init__(self) -> None:
|
|
super().__init__("maximum passphrase attempts reached")
|
|
|
|
|
|
class KeychainNotSet(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainIsEmpty(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainKeyNotFound(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainMalformedRequest(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainMalformedResponse(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainProxyConnectionFailure(KeychainException):
|
|
def __init__(self) -> None:
|
|
super().__init__("Failed to connect to keychain service")
|
|
|
|
|
|
class KeychainLockTimeout(KeychainException):
|
|
pass
|
|
|
|
|
|
class KeychainProxyConnectionTimeout(KeychainException):
|
|
def __init__(self) -> None:
|
|
super().__init__("Could not reconnect to keychain service in 30 seconds.")
|
|
|
|
|
|
class KeychainUserNotFound(KeychainException):
|
|
def __init__(self, service: str, user: str) -> None:
|
|
super().__init__(f"user {user!r} not found for service {service!r}")
|
|
|
|
|
|
class KeychainFingerprintError(KeychainException):
|
|
def __init__(self, fingerprint: int, message: str) -> None:
|
|
self.fingerprint = fingerprint
|
|
super().__init__(f"fingerprint {str(fingerprint)!r} {message}")
|
|
|
|
|
|
class KeychainFingerprintNotFound(KeychainFingerprintError):
|
|
def __init__(self, fingerprint: int) -> None:
|
|
super().__init__(fingerprint, "not found")
|
|
|
|
|
|
class KeychainFingerprintExists(KeychainFingerprintError):
|
|
def __init__(self, fingerprint: int) -> None:
|
|
super().__init__(fingerprint, "already exists")
|
|
|
|
|
|
class KeychainLabelError(KeychainException):
|
|
def __init__(self, label: str, error: str):
|
|
super().__init__(error)
|
|
self.label = label
|
|
|
|
|
|
class KeychainLabelInvalid(KeychainLabelError):
|
|
pass
|
|
|
|
|
|
class KeychainLabelExists(KeychainLabelError):
|
|
def __init__(self, label: str, fingerprint: int) -> None:
|
|
super().__init__(label, f"label {label!r} already exists for fingerprint {str(fingerprint)!r}")
|
|
self.fingerprint = fingerprint
|
|
|
|
|
|
##
|
|
# Miscellaneous errors
|
|
##
|
|
|
|
|
|
class InvalidPathError(Exception):
|
|
def __init__(self, path: Path, error_message: str):
|
|
super().__init__(f"{error_message}: {str(path)!r}")
|
|
self.path = path
|
|
|
|
|
|
class CliRpcConnectionError(ClickException):
|
|
"""
|
|
This error is raised when a rpc server cant be reached by the cli async generator
|
|
"""
|