Skip to content

Release v0.58.0 #899

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 95 commits into from
Dec 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
59903bc
test: Use INFO as default log level to reduce amount of logs
msbrogli Oct 17, 2023
6b039c1
test(simulation): Fix flaky test test_many_miners_since_beginning
msbrogli Oct 17, 2023
3c9bac8
test(sync): Improve test_sync_rotate to prevent false positives
msbrogli Oct 17, 2023
dbfb9ec
test(sync-v2): Fix seed in some sync-v2 tests while it's under testing
msbrogli Oct 18, 2023
a9ca730
chore(ci): use cancel-in-progress to prevent useless CI runs
jansegre Oct 18, 2023
4f2da10
Merge pull request #818 from HathorNetwork/chore/ci-cancel-in-progress
jansegre Oct 18, 2023
f515f6d
feat[healthcheck]: new health endpoint (#807)
luislhl Oct 19, 2023
613d0ac
tests: fix flaky log test
glevco Oct 20, 2023
4adb93f
fix(mining): Fix block template not checking for MAX_FUTURE_TIMESTAMP…
msbrogli Oct 20, 2023
9cee806
fix(sysctl): Fix deserializer
msbrogli Oct 19, 2023
25b3983
fix(mining): Wrong timestamp sent to _make_block_template
msbrogli Oct 20, 2023
d8e1964
Merge branch 'release' into master
jansegre Oct 24, 2023
86e908c
tests(verification): implement tests to improve refactor reliability …
glevco Oct 24, 2023
3365e4b
refactor(verification): move verification methods signatures (#797)
glevco Oct 24, 2023
05f7228
refactor(verification): move block-only verification methods (#798)
glevco Oct 24, 2023
bd11bc4
refactor(verification): move transaction-only verification methods (#…
glevco Oct 25, 2023
deaaaf6
fix(sync-v2): Fix unhandled case caused by reorg during sync of blocks
msbrogli Oct 24, 2023
0a78bb9
refactor(verification): finish moving all verification methods
glevco Oct 24, 2023
a27e9a4
fix(sync-v2): Fix streamer sending more blocks than expected
msbrogli Oct 27, 2023
20474fd
tests(reliable-integration): remove timestamp assertion from event sc…
glevco Oct 27, 2023
89d347e
refactor(sync-v2): Refactor sync_v2 agent to hold (block_height, bloc…
msbrogli Oct 26, 2023
ab1a6ca
chore: update dependencies (#840)
glevco Oct 28, 2023
ac435e0
fix(feature-activation): add missing metadata migration (#828)
glevco Oct 28, 2023
bf0d0bc
feat(reliable-integration): update peer metadata schema (#804)
glevco Oct 28, 2023
b3d41ed
feat(feature-activation): implement must signal (#785)
glevco Nov 1, 2023
c47f06e
fix(sync-v2): Fix n-ary search to handle reorgs during its execution
msbrogli Oct 27, 2023
b0642e2
chore(custom_checks): Skip binary files when checking for deprecated …
msbrogli Nov 3, 2023
98121c4
feat(sync-v2): Improve sync-v2 reliability
msbrogli Oct 27, 2023
a289460
tests: Fix a flaky protocol test
msbrogli Nov 3, 2023
4b04c9c
feat(sync-v2): Wait for sync internal methods to finish before initia…
msbrogli Oct 31, 2023
eab8986
feat(sync-v2): Add both BlockchainStreamingClient and TransactionStre…
msbrogli Nov 3, 2023
2bcbc81
refactor(settings): change daa to use injected settings
glevco Nov 3, 2023
9150878
refactor(daa): remove global daa test mode (#802)
glevco Nov 3, 2023
3c8698e
refactor(cpu-mining): create CpuMiningService (#803)
glevco Nov 6, 2023
769d255
refactor(scripts): modularize script files (#811)
glevco Nov 7, 2023
8671304
refactor: move simulator utils functions (#772)
glevco Nov 7, 2023
f528a06
refactor(verification): organization and typing improvements (#830)
glevco Nov 7, 2023
d0a1ff2
feat(sync-v2): Implement new protocol for synchronizing transactions
msbrogli Nov 3, 2023
db38db4
feat(sync-v2): Improve overall logging
msbrogli Nov 9, 2023
9fff604
feat(sync-v2): Fix issue when a reorg occurs during a streaming of tr…
msbrogli Nov 9, 2023
45281a2
feat(sync-v2): Watchdog to detect stale syncing
msbrogli Nov 9, 2023
c987aae
chore: bump version to v0.58.0
jansegre Nov 9, 2023
f111466
Merge pull request #860 from HathorNetwork/chore/v0.58.0
jansegre Nov 9, 2023
d5be7b9
feat(sync-v2): Always relay vertices in real-time if the peer request…
msbrogli Nov 9, 2023
27b07b1
fix(verification): avoid validation downgrade by not running it twice
jansegre Nov 9, 2023
bce9f71
Merge pull request #853 from HathorNetwork/fix/validation-downgrade
jansegre Nov 9, 2023
382cc38
feat(sync-v2): Stop streaming of transactions if an unexpected vertex…
msbrogli Nov 9, 2023
07f34ee
refactor(sync): remove legacy sync-v1.0
jansegre Nov 9, 2023
1171e10
Merge pull request #864 from HathorNetwork/refactor/remove-legacy-syn…
jansegre Nov 10, 2023
e85ad70
refactor(sync-v2): Modify TransactionStreamingClient to process verti…
msbrogli Nov 9, 2023
9fa42cd
fix(sync-v2): do not consider existing vertex as unexpected
jansegre Nov 10, 2023
0b32a31
Merge pull request #866 from HathorNetwork/fix/sync-v2-not-unexpected…
jansegre Nov 10, 2023
830da1e
refactor(p2p): have two internal tiers for sync: available and enabled
jansegre Nov 10, 2023
d50a2be
Merge pull request #867 from HathorNetwork/refactor/available-sync-ve…
jansegre Nov 10, 2023
3cf94e1
feat(sysctl): add controls for enabling/disabling sync versions
jansegre Nov 10, 2023
dde78a2
Merge pull request #869 from HathorNetwork/feat/sysctl-enable-sync-ve…
jansegre Nov 10, 2023
090bd71
fix(sync-v2): Fix stream end messages for both blockchains and transa…
msbrogli Nov 10, 2023
59b291c
fix(sync-v2): Fix issues caused by concurrent syncing peers
msbrogli Nov 10, 2023
0ce1dda
feat(sync-v2): Stop running callLater when a block is voided in handl…
msbrogli Nov 11, 2023
13e49bf
fix(storage): Fix wrong update to the best_block_tips_cache
msbrogli Nov 11, 2023
351e4d3
refactor(verification): refactor verify_sum (#831)
glevco Nov 16, 2023
29a622f
refactor(verification): move token info (#858)
glevco Nov 16, 2023
aa5109f
feat(feature-activation): configure new NOP features on testnet (#879)
glevco Nov 23, 2023
448a560
refactor(verification): implement verify_minted_tokens (#832)
glevco Nov 23, 2023
0643529
fix(sync-v2): adjust init assertion
jansegre Nov 14, 2023
2a86be0
Merge pull request #875 from HathorNetwork/fix/sync-v2-tx-streaming-c…
jansegre Nov 24, 2023
7b6eb34
feat(simulator): Add StopWhenSendLineMatch trigger
msbrogli Nov 3, 2023
59bdf45
feat(reliable-integration): change ordering to send voided txs first
glevco Nov 20, 2023
ffd1cd1
fix(sync-v2): stop _process_transaction on error
jansegre Nov 20, 2023
965fba3
Merge pull request #877 from HathorNetwork/fix/stop-process-tx-on-error
jansegre Nov 24, 2023
b8c2f12
Merge pull request #863 from HathorNetwork/master
jansegre Nov 24, 2023
cffe172
refactor(verification): remove BlockVerifier inheritance (#833)
glevco Nov 24, 2023
573c054
refactor(scripts): implement ScriptContext (#851)
glevco Nov 28, 2023
11a84eb
refactor(verification): remove TransactionVerifier inheritance (#834)
glevco Nov 29, 2023
a575945
refactor(verification): remove VertexVerifier inheritance (#835)
glevco Dec 4, 2023
f326512
refactor(p2p): use async/await syntax on peer discovery
glevco Nov 29, 2023
3b5a3b8
Merge pull request #883 from HathorNetwork/refactor/p2p/async-peer-di…
jansegre Dec 5, 2023
353c6c4
refactor(verification): remove VertexVerifier from BlockVerifier (#836)
glevco Dec 6, 2023
db91e96
refactor(verification): remove VertexVerifier from TransactionVerifie…
glevco Dec 7, 2023
4a97f92
refactor(verification): remove token info duplication (#868)
glevco Dec 7, 2023
628f3ad
fix: add health endpoint to openapi (#891)
luislhl Dec 8, 2023
61327ba
feat(sync-v1): remove SendDataPush queue
jansegre Dec 8, 2023
ca1d829
Merge pull request #892 from HathorNetwork/feat/remove-data-push
jansegre Dec 8, 2023
5526455
chore: refactor python healthcheck lib (#826)
luislhl Dec 12, 2023
c4bd15a
fix(pubsub): Event queue becoming too long
msbrogli Dec 2, 2023
7dded42
Merge pull request #886 from HathorNetwork/fix/long-queues
jansegre Dec 14, 2023
802f121
Merge pull request #893 from HathorNetwork/master
jansegre Dec 15, 2023
27381c1
chore(custom-checks): add check to prevent circular imports (#887)
glevco Dec 18, 2023
71a0d72
refactor(reactor): remove module-level global reactor (#888)
glevco Dec 18, 2023
e84f95d
refactor(reactor): implement option to use asyncio reactor
glevco Dec 18, 2023
92c400e
Merge pull request #889 from HathorNetwork/refactor/reactor/asyncio-r…
jansegre Dec 19, 2023
8261720
fix(sync-v2): Fix dependencies update for the first block
msbrogli Dec 20, 2023
d2d8e32
Merge pull request #898 from HathorNetwork/master
jansegre Dec 20, 2023
7eab19b
fix: remove unused NOP features (#901)
glevco Dec 21, 2023
3aab1fd
Merge pull request #902 from HathorNetwork/master
jansegre Dec 21, 2023
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
3 changes: 3 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ on: # yamllint disable-line rule:truthy
tags:
- v*
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
matrix:
runs-on: ubuntu-latest
Expand Down
38 changes: 37 additions & 1 deletion extras/custom_checks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,19 +72,55 @@ function check_do_not_use_builtin_random_in_tests() {
}

function check_deprecated_typing() {
if grep -R '\<typing .*\<import .*\<\(Tuple\|List\|Dict\|Set\|FrozenSet\|AbstractSet\|DefaultDict\|OrderedDict\)\>' "${SOURCE_DIRS[@]}"; then
if grep -RI '\<typing .*\<import .*\<\(Tuple\|List\|Dict\|Set\|FrozenSet\|AbstractSet\|DefaultDict\|OrderedDict\)\>' "${SOURCE_DIRS[@]}"; then
echo 'do not use typing.List/Tuple/Dict/... for type annotations use builtin list/tuple/dict/... instead'
echo 'for more info check the PEP 585 doc: https://peps.python.org/pep-0585/'
return 1
fi
return 0
}

function check_do_not_import_tests_in_hathor() {
if grep -R '\<.*import .*tests.*\>\|\<.*from .*tests.* import\>' "hathor"; then
echo 'do not import test definitions in the hathor module'
echo 'move them from tests to hathor instead'
return 1
fi
return 0
}

function check_do_not_import_from_hathor_in_entrypoints() {
PATTERN='^import .*hathor.*\|^from .*hathor.* import'

if grep -R "$PATTERN" "hathor/cli" | grep -v 'from hathor.cli.run_node import RunNode' | grep -v '# skip-cli-import-custom-check'; then
echo 'do not import from `hathor` in the module-level of a CLI entrypoint.'
echo 'instead, import locally inside the function that uses the import.'
echo 'alternatively, comment `# skip-cli-import-custom-check` to exclude a line.'
return 1
fi
return 0
}

function check_do_not_import_twisted_reactor_directly() {
EXCLUDES="--exclude=reactor.py --exclude=conftest.py"
PATTERN='\<.*from .*twisted.internet import .*reactor\>'

if grep -R $EXCLUDES "$PATTERN" "${SOURCE_DIRS[@]}"; then
echo 'do not use `from twisted.internet import reactor` directly.'
echo 'instead, use `hathor.reactor.get_global_reactor()`.'
return 1
fi
return 0
}

# List of functions to be executed
checks=(
check_version_match
check_do_not_use_builtin_random_in_tests
check_deprecated_typing
check_do_not_import_tests_in_hathor
check_do_not_import_from_hathor_in_entrypoints
check_do_not_import_twisted_reactor_directly
)

# Initialize a variable to track if any check fails
Expand Down
126 changes: 94 additions & 32 deletions hathor/builder/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@
# limitations under the License.

from enum import Enum
from typing import Any, NamedTuple, Optional
from typing import Any, Callable, NamedTuple, Optional, TypeAlias

from structlog import get_logger

from hathor.checkpoint import Checkpoint
from hathor.conf.get_settings import get_settings
from hathor.conf.settings import HathorSettings as HathorSettingsType
from hathor.consensus import ConsensusAlgorithm
from hathor.daa import DifficultyAdjustmentAlgorithm
from hathor.event import EventManager
from hathor.event.storage import EventMemoryStorage, EventRocksDBStorage, EventStorage
from hathor.event.websocket import EventWebsocketFactory
Expand All @@ -29,9 +30,11 @@
from hathor.feature_activation.feature_service import FeatureService
from hathor.indexes import IndexesManager, MemoryIndexesManager, RocksDBIndexesManager
from hathor.manager import HathorManager
from hathor.mining.cpu_mining_service import CpuMiningService
from hathor.p2p.manager import ConnectionsManager
from hathor.p2p.peer_id import PeerId
from hathor.pubsub import PubSubManager
from hathor.reactor import ReactorProtocol as Reactor
from hathor.storage import RocksDBStorage
from hathor.stratum import StratumFactory
from hathor.transaction.storage import (
Expand All @@ -40,7 +43,7 @@
TransactionRocksDBStorage,
TransactionStorage,
)
from hathor.util import Random, Reactor, get_environment_info
from hathor.util import Random, get_environment_info, not_none
from hathor.verification.verification_service import VerificationService, VertexVerifiers
from hathor.wallet import BaseWallet, Wallet

Expand All @@ -63,12 +66,19 @@ class BuildArtifacts(NamedTuple):
pubsub: PubSubManager
consensus: ConsensusAlgorithm
tx_storage: TransactionStorage
feature_service: FeatureService
indexes: Optional[IndexesManager]
wallet: Optional[BaseWallet]
rocksdb_storage: Optional[RocksDBStorage]
stratum_factory: Optional[StratumFactory]


_VertexVerifiersBuilder: TypeAlias = Callable[
[HathorSettingsType, DifficultyAdjustmentAlgorithm, FeatureService],
VertexVerifiers
]


class Builder:
"""Builder builds the core objects to run a full node.

Expand Down Expand Up @@ -102,7 +112,11 @@ def __init__(self) -> None:
self._feature_service: Optional[FeatureService] = None
self._bit_signaling_service: Optional[BitSignalingService] = None

self._daa: Optional[DifficultyAdjustmentAlgorithm] = None
self._cpu_mining_service: Optional[CpuMiningService] = None

self._vertex_verifiers: Optional[VertexVerifiers] = None
self._vertex_verifiers_builder: _VertexVerifiersBuilder | None = None
self._verification_service: Optional[VerificationService] = None

self._rocksdb_path: Optional[str] = None
Expand All @@ -127,8 +141,7 @@ def __init__(self) -> None:
self._enable_tokens_index: bool = False
self._enable_utxo_index: bool = False

self._enable_sync_v1: bool = False
self._enable_sync_v1_1: bool = True
self._enable_sync_v1: bool = True
self._enable_sync_v2: bool = False

self._enable_stratum_server: Optional[bool] = None
Expand Down Expand Up @@ -158,10 +171,12 @@ def build(self) -> BuildArtifacts:
wallet = self._get_or_create_wallet()
event_manager = self._get_or_create_event_manager()
indexes = self._get_or_create_indexes_manager()
tx_storage = self._get_or_create_tx_storage(indexes)
feature_service = self._get_or_create_feature_service(tx_storage)
bit_signaling_service = self._get_or_create_bit_signaling_service(tx_storage)
tx_storage = self._get_or_create_tx_storage()
feature_service = self._get_or_create_feature_service()
bit_signaling_service = self._get_or_create_bit_signaling_service()
verification_service = self._get_or_create_verification_service()
daa = self._get_or_create_daa()
cpu_mining_service = self._get_or_create_cpu_mining_service()

if self._enable_address_index:
indexes.enable_address_index(pubsub)
Expand All @@ -186,6 +201,7 @@ def build(self) -> BuildArtifacts:
network=self._network,
pubsub=pubsub,
consensus_algorithm=consensus_algorithm,
daa=daa,
peer_id=peer_id,
tx_storage=tx_storage,
p2p_manager=p2p_manager,
Expand All @@ -198,6 +214,7 @@ def build(self) -> BuildArtifacts:
feature_service=feature_service,
bit_signaling_service=bit_signaling_service,
verification_service=verification_service,
cpu_mining_service=cpu_mining_service,
**kwargs
)

Expand All @@ -221,6 +238,7 @@ def build(self) -> BuildArtifacts:
wallet=wallet,
rocksdb_storage=self._rocksdb_storage,
stratum_factory=stratum_factory,
feature_service=feature_service,
)

return self.artifacts
Expand Down Expand Up @@ -265,6 +283,7 @@ def set_peer_id(self, peer_id: PeerId) -> 'Builder':
return self

def _get_or_create_settings(self) -> HathorSettingsType:
"""Return the HathorSettings instance set on this builder, or a new one if not set."""
if self._settings is None:
self._settings = get_settings()
return self._settings
Expand Down Expand Up @@ -293,7 +312,7 @@ def _get_or_create_pubsub(self) -> PubSubManager:
return self._pubsub

def _create_stratum_server(self, manager: HathorManager) -> StratumFactory:
stratum_factory = StratumFactory(manager=manager)
stratum_factory = StratumFactory(manager=manager, reactor=self._get_reactor())
manager.stratum_factory = stratum_factory
manager.metrics.stratum_factory = stratum_factory
return stratum_factory
Expand All @@ -316,6 +335,10 @@ def _get_or_create_rocksdb_storage(self) -> RocksDBStorage:
return self._rocksdb_storage

def _get_p2p_manager(self) -> ConnectionsManager:
from hathor.p2p.sync_v1.factory import SyncV11Factory
from hathor.p2p.sync_v2.factory import SyncV2Factory
from hathor.p2p.sync_version import SyncVersion

enable_ssl = True
reactor = self._get_reactor()
my_peer = self._get_peer_id()
Expand All @@ -330,10 +353,13 @@ def _get_p2p_manager(self) -> ConnectionsManager:
ssl=enable_ssl,
whitelist_only=False,
rng=self._rng,
enable_sync_v1=self._enable_sync_v1,
enable_sync_v1_1=self._enable_sync_v1_1,
enable_sync_v2=self._enable_sync_v2,
)
p2p_manager.add_sync_factory(SyncVersion.V1_1, SyncV11Factory(p2p_manager))
p2p_manager.add_sync_factory(SyncVersion.V2, SyncV2Factory(p2p_manager))
if self._enable_sync_v1:
p2p_manager.enable_sync_version(SyncVersion.V1_1)
if self._enable_sync_v2:
p2p_manager.enable_sync_version(SyncVersion.V2)
return p2p_manager

def _get_or_create_indexes_manager(self) -> IndexesManager:
Expand All @@ -352,7 +378,9 @@ def _get_or_create_indexes_manager(self) -> IndexesManager:

return self._indexes_manager

def _get_or_create_tx_storage(self, indexes: IndexesManager) -> TransactionStorage:
def _get_or_create_tx_storage(self) -> TransactionStorage:
indexes = self._get_or_create_indexes_manager()

if self._tx_storage is not None:
# If a tx storage is provided, set the indexes manager to it.
self._tx_storage.indexes = indexes
Expand Down Expand Up @@ -396,9 +424,16 @@ def _get_or_create_event_storage(self) -> EventStorage:

def _get_or_create_event_manager(self) -> EventManager:
if self._event_manager is None:
peer_id = self._get_peer_id()
settings = self._get_or_create_settings()
reactor = self._get_reactor()
storage = self._get_or_create_event_storage()
factory = EventWebsocketFactory(reactor, storage)
factory = EventWebsocketFactory(
peer_id=not_none(peer_id.id),
network=settings.NETWORK_NAME,
reactor=reactor,
event_storage=storage,
)
self._event_manager = EventManager(
reactor=reactor,
pubsub=self._get_or_create_pubsub(),
Expand All @@ -408,22 +443,26 @@ def _get_or_create_event_manager(self) -> EventManager:

return self._event_manager

def _get_or_create_feature_service(self, tx_storage: TransactionStorage) -> FeatureService:
def _get_or_create_feature_service(self) -> FeatureService:
"""Return the FeatureService instance set on this builder, or a new one if not set."""
if self._feature_service is None:
settings = self._get_or_create_settings()
tx_storage = self._get_or_create_tx_storage()
self._feature_service = FeatureService(
feature_settings=settings.FEATURE_ACTIVATION,
tx_storage=tx_storage
)

return self._feature_service

def _get_or_create_bit_signaling_service(self, tx_storage: TransactionStorage) -> BitSignalingService:
def _get_or_create_bit_signaling_service(self) -> BitSignalingService:
if self._bit_signaling_service is None:
settings = self._get_or_create_settings()
tx_storage = self._get_or_create_tx_storage()
feature_service = self._get_or_create_feature_service()
self._bit_signaling_service = BitSignalingService(
feature_settings=settings.FEATURE_ACTIVATION,
feature_service=self._get_or_create_feature_service(tx_storage),
feature_service=feature_service,
tx_storage=tx_storage,
support_features=self._support_features,
not_support_features=self._not_support_features,
Expand All @@ -441,10 +480,33 @@ def _get_or_create_verification_service(self) -> VerificationService:
def _get_or_create_vertex_verifiers(self) -> VertexVerifiers:
if self._vertex_verifiers is None:
settings = self._get_or_create_settings()
self._vertex_verifiers = VertexVerifiers.create_defaults(settings=settings)
feature_service = self._get_or_create_feature_service()
daa = self._get_or_create_daa()

if self._vertex_verifiers_builder:
self._vertex_verifiers = self._vertex_verifiers_builder(settings, daa, feature_service)
else:
self._vertex_verifiers = VertexVerifiers.create_defaults(
settings=settings,
daa=daa,
feature_service=feature_service,
)

return self._vertex_verifiers

def _get_or_create_daa(self) -> DifficultyAdjustmentAlgorithm:
if self._daa is None:
settings = self._get_or_create_settings()
self._daa = DifficultyAdjustmentAlgorithm(settings=settings)

return self._daa

def _get_or_create_cpu_mining_service(self) -> CpuMiningService:
if self._cpu_mining_service is None:
self._cpu_mining_service = CpuMiningService()

return self._cpu_mining_service

def use_memory(self) -> 'Builder':
self.check_if_can_modify()
self._storage_type = StorageType.MEMORY
Expand Down Expand Up @@ -547,6 +609,21 @@ def set_vertex_verifiers(self, vertex_verifiers: VertexVerifiers) -> 'Builder':
self._vertex_verifiers = vertex_verifiers
return self

def set_vertex_verifiers_builder(self, builder: _VertexVerifiersBuilder) -> 'Builder':
self.check_if_can_modify()
self._vertex_verifiers_builder = builder
return self

def set_daa(self, daa: DifficultyAdjustmentAlgorithm) -> 'Builder':
self.check_if_can_modify()
self._daa = daa
return self

def set_cpu_mining_service(self, cpu_mining_service: CpuMiningService) -> 'Builder':
self.check_if_can_modify()
self._cpu_mining_service = cpu_mining_service
return self

def set_reactor(self, reactor: Reactor) -> 'Builder':
self.check_if_can_modify()
self._reactor = reactor
Expand All @@ -567,11 +644,6 @@ def set_enable_sync_v1(self, enable_sync_v1: bool) -> 'Builder':
self._enable_sync_v1 = enable_sync_v1
return self

def set_enable_sync_v1_1(self, enable_sync_v1_1: bool) -> 'Builder':
self.check_if_can_modify()
self._enable_sync_v1_1 = enable_sync_v1_1
return self

def set_enable_sync_v2(self, enable_sync_v2: bool) -> 'Builder':
self.check_if_can_modify()
self._enable_sync_v2 = enable_sync_v2
Expand All @@ -587,16 +659,6 @@ def disable_sync_v1(self) -> 'Builder':
self._enable_sync_v1 = False
return self

def enable_sync_v1_1(self) -> 'Builder':
self.check_if_can_modify()
self._enable_sync_v1_1 = True
return self

def disable_sync_v1_1(self) -> 'Builder':
self.check_if_can_modify()
self._enable_sync_v1_1 = False
return self

def enable_sync_v2(self) -> 'Builder':
self.check_if_can_modify()
self._enable_sync_v2 = True
Expand Down
Loading