Skip to content
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

Stuff #194

Merged
merged 10 commits into from
Feb 12, 2025
Merged

Stuff #194

Show file tree
Hide file tree
Changes from all commits
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 .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -346,3 +346,4 @@ jobs:
with:
servicenode-path: ${{ env.PANTOS_SERVICE_NODE }}
servicenode-version: 'local'

2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#syntax=docker/dockerfile:1.7.0-labs
# SPDX-License-Identifier: GPL-3.0-only
FROM python:3.12-bookworm AS dev
FROM python:3.13-bookworm AS dev

RUN apt-get update && \
apt-get install build-essential debhelper devscripts \
Expand Down
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,13 @@ coverage-postgres:
coverage-all:
poetry run python3 -m pytest --cov-report term-missing --cov=pantos tests

.PHONY: tar
tar: dist/pantos_service_node-$(PANTOS_SERVICE_NODE_VERSION).tar.gz

.PHONY: openapi-docs
openapi-docs:
poetry run python3 -m openapi $(OPENAPI_FILE_LOCATION)

.PHONY: tar
tar: dist/pantos_service_node-$(PANTOS_SERVICE_NODE_VERSION).tar.gz

dist/pantos_service_node-$(PANTOS_SERVICE_NODE_VERSION).tar.gz: pantos/ service-node-config.yml service-node-config.env bids.yml alembic.ini pantos-service-node.sh pantos-service-node-worker.sh
cp service-node-config.yml pantos/service-node-config.yml
cp service-node-config.env pantos/service-node-config.env
Expand Down
2 changes: 1 addition & 1 deletion debian/rules
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ DH_VERBOSE=1

export DH_VIRTUALENV_INSTALL_ROOT=/opt/pantos
export POETRY_VIRTUALENVS_CREATE=false
PYTHON_VERSION = 3.12.4
PYTHON_VERSION = 3.13
SNAKE=debian/$(PACKAGE)$(DH_VIRTUALENV_INSTALL_ROOT)/$(PACKAGE)/bin/python3
EXTRA_REQUIREMENTS=--upgrade-pip --preinstall "setuptools>=38" --preinstall "poetry<2.0.0" --preinstall "dh-poetry"
DH_VENV_ARGS=--builtin-venv --python=$(SNAKE) $(EXTRA_REQUIREMENTS) \
Expand Down
2 changes: 1 addition & 1 deletion environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ channels:
- defaults
- conda-forge
dependencies:
- python=3.12
- python=3.13
2 changes: 1 addition & 1 deletion linux/scripts/pantos-service-node-celery
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ fi

while true; do
echo "Starting the celery worker"
$PROGRAM -m celery -A pantos.servicenode worker $EXTRA_ARGS -l INFO -n pantos.servicenode -Q transfers,bids
$PROGRAM -m celery -A pantos.servicenode worker $EXTRA_ARGS -l INFO -n pantos.servicenode -Q transfers,bids,transactions
PYTHON_EXIT_CODE=$?

if [ "$PANTOS_CELERY_AUTORESTART" != "true" ]; then
Expand Down
2 changes: 1 addition & 1 deletion pantos-service-node-worker.sh
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#! /bin/sh

celery -A pantos.servicenode worker -l INFO -n pantos.servicenode -Q transfers,bids
celery -A pantos.servicenode worker -l INFO -n pantos.servicenode -Q transfers,bids,transactions
4 changes: 0 additions & 4 deletions pantos/servicenode/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import flask
import semantic_version # type: ignore
from pantos.common.blockchains.enums import Blockchain
from pantos.common.health import initialize_blockchain_nodes
from pantos.common.logging import LogFile
from pantos.common.logging import LogFormat
from pantos.common.logging import initialize_logger
Expand All @@ -20,7 +19,6 @@
from pantos.servicenode.business.node import NodeInteractor
from pantos.servicenode.configuration import config
from pantos.servicenode.configuration import get_blockchain_config
from pantos.servicenode.configuration import get_blockchains_rpc_nodes
from pantos.servicenode.configuration import get_signer_config
from pantos.servicenode.configuration import load_config
from pantos.servicenode.database import \
Expand Down Expand Up @@ -95,8 +93,6 @@ def initialize_application(is_flask_app: bool = False) -> None:
exc_info=True)
sys.exit(1)
check_protocol_version_compatibility()
blockchain_rpc_nodes = get_blockchains_rpc_nodes()
initialize_blockchain_nodes(blockchain_rpc_nodes)


def check_protocol_version_compatibility() -> None:
Expand Down
139 changes: 139 additions & 0 deletions pantos/servicenode/blockchains/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import uuid

import semantic_version # type: ignore
from hexbytes import HexBytes
from pantos.common.blockchains.base import BlockchainHandler
from pantos.common.blockchains.base import BlockchainUtilities
from pantos.common.blockchains.base import BlockchainUtilitiesError
Expand All @@ -17,6 +18,8 @@
from pantos.common.blockchains.enums import ContractAbi
from pantos.common.blockchains.factory import get_blockchain_utilities
from pantos.common.blockchains.factory import initialize_blockchain_utilities
from pantos.common.blockchains.tasks import \
_dependent_transaction_submission_task
from pantos.common.entities import TransactionStatus
from pantos.common.exceptions import ErrorCreator
from pantos.common.types import BlockchainAddress
Expand Down Expand Up @@ -646,6 +649,43 @@ def cancel_unregistration(self) -> None:
"""
pass # pragma: no cover

@abc.abstractmethod
def calculate_commitment(self, abi_types: list[str],
values: list[typing.Any]) -> HexBytes:
"""Calculate the commitment hash for the given ABI types and
values.

Parameters
----------
abi_types : list[str]
The ABI types of the values.
values : list[typing.Any]
The values to be hashed.

Returns
-------
web3.HexBytes
The commitment hash.
"""
pass # pragma: no cover

@abc.abstractmethod
def get_commitment_wait_period(self, blockchain: Blockchain) -> int:
"""Get the commitment wait period for the service node.

Returns
-------
int
The commitment wait period in blocks.

Raises
------
BlockchainClientError
If the commitment wait period cannot be obtained.

"""
pass

@abc.abstractmethod
def get_validator_fee_factor(self, blockchain: Blockchain) -> int:
"""Get the validator fee factor of the given blockchain.
Expand Down Expand Up @@ -805,6 +845,105 @@ def _start_transaction_submission(
return self._get_utilities().start_transaction_submission(
request_, node_connections)

@dataclasses.dataclass
class _DependingTransactionSubmissionStartRequest:
"""Request data for starting a depending transaction submission.

Attributes
----------
prerequisite_transaction: _TransactionSubmissionStartRequest
Transaction submission request data for the transaction to be
send before the depending transaction.
dependent_transaction: _TransactionSubmissionStartRequest
Transaction submission request data for the depending
transaction.
blocks_to_wait: int
The number of blocks to wait before submitting the depending
transaction.
"""
# Forward Reference: Python postpones the evaluation for Python >v3.10
# automatically
prerequisite_transaction: \
"BlockchainClient._TransactionSubmissionStartRequest"
dependent_transaction: \
"BlockchainClient._TransactionSubmissionStartRequest"
blocks_to_wait: int

def _start_depending_transactions_submission(
self, request: _DependingTransactionSubmissionStartRequest,
node_connections: NodeConnections) -> uuid.UUID:
"""Start a depending transaction submission. The dependent
transaction is automatically submitted as soon as the prerequisite
transaction is included and reaches a given number of blocks.

Parameters
----------
request : _DependingTransactionSubmissionStartRequest
The request data for starting a depending transaction
submission.
node_connections : NodeConnections
The NodeConnections instance to be used when interacting
with blockchain nodes.

Returns
-------
uuid.UUID
The unique internal transaction ID, which can be used later
to retrieve the status of the transaction submission.
"""
contract_abi = \
request.prerequisite_transaction \
.versioned_contract_abi.contract_abi
if contract_abi is ContractAbi.PANTOS_HUB:
contract_address = self._get_config()['hub']
elif contract_abi is ContractAbi.PANTOS_TOKEN:
contract_address = self._get_config()['pan_token']
else:
raise NotImplementedError
min_adaptable_fee_per_gas = \
self._get_config()['min_adaptable_fee_per_gas']
max_total_fee_per_gas = self._get_config().get('max_total_fee_per_gas')
if max_total_fee_per_gas == 0:
# Since YAML Tag directives do not support the `or` operation
max_total_fee_per_gas = None
adaptable_fee_increase_factor = \
self._get_config()['adaptable_fee_increase_factor']
blocks_until_resubmission = \
self._get_config()['blocks_until_resubmission']
prerequisite_request = \
BlockchainUtilities.TransactionSubmissionStartRequest(
contract_address,
request.prerequisite_transaction.versioned_contract_abi,
request.prerequisite_transaction.function_selector,
request.prerequisite_transaction.function_args,
request.prerequisite_transaction.gas,
min_adaptable_fee_per_gas,
max_total_fee_per_gas, request.prerequisite_transaction.amount,
request.prerequisite_transaction.nonce,
adaptable_fee_increase_factor, blocks_until_resubmission)

prerequisite_internal_id = self._get_utilities(
).start_transaction_submission(prerequisite_request, node_connections)

dependent_request = \
BlockchainUtilities.TransactionSubmissionStartRequest(
contract_address,
request.dependent_transaction.versioned_contract_abi,
request.dependent_transaction.function_selector,
request.dependent_transaction.function_args,
request.dependent_transaction.gas, min_adaptable_fee_per_gas,
max_total_fee_per_gas, request.dependent_transaction.amount,
request.dependent_transaction.nonce,
adaptable_fee_increase_factor,
blocks_until_resubmission)

return _dependent_transaction_submission_task.delay(
blockchain_id=self.get_blockchain().value,
prerequisite_internal_id=str(prerequisite_internal_id),
blocks_to_wait=request.blocks_to_wait,
average_block_time=self._get_config()['average_block_time'],
request=dependent_request.to_dict())

@property
def _versioned_pantos_forwarder_abi(self) -> VersionedContractAbi:
return VersionedContractAbi(ContractAbi.PANTOS_FORWARDER,
Expand Down
Loading