From 64f5ec01f13f5e15218b136da30ba33df13f8f38 Mon Sep 17 00:00:00 2001 From: ArpitShukla007 Date: Wed, 9 Mar 2022 09:06:45 +0000 Subject: [PATCH] Basic structuring --- .../{ => transactions}/common/__init__.py | 0 .../{ => transactions}/common/crypto.py | 0 .../{ => transactions}/common/exceptions.py | 0 planetmint/transactions/common/input.py | 117 ++++++++++++++++++ .../{ => transactions}/common/memoize.py | 0 .../common/schema/README.md | 0 .../common/schema/__init__.py | 0 ...saction_chain_migration_election_v2.0.yaml | 0 .../schema/transaction_create_v1.0.yaml | 0 .../schema/transaction_create_v2.0.yaml | 0 .../schema/transaction_transfer_v1.0.yaml | 0 .../schema/transaction_transfer_v2.0.yaml | 0 .../common/schema/transaction_v1.0.yaml | 0 .../common/schema/transaction_v2.0.yaml | 0 .../transaction_validator_election_v2.0.yaml | 0 .../common/schema/transaction_vote_v2.0.yaml | 0 .../{ => transactions}/common/transaction.py | 0 .../common/transaction_mode_types.py | 0 planetmint/{ => transactions}/common/utils.py | 0 19 files changed, 117 insertions(+) rename planetmint/{ => transactions}/common/__init__.py (100%) rename planetmint/{ => transactions}/common/crypto.py (100%) rename planetmint/{ => transactions}/common/exceptions.py (100%) create mode 100644 planetmint/transactions/common/input.py rename planetmint/{ => transactions}/common/memoize.py (100%) rename planetmint/{ => transactions}/common/schema/README.md (100%) rename planetmint/{ => transactions}/common/schema/__init__.py (100%) rename planetmint/{ => transactions}/common/schema/transaction_chain_migration_election_v2.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_create_v1.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_create_v2.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_transfer_v1.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_transfer_v2.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_v1.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_v2.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_validator_election_v2.0.yaml (100%) rename planetmint/{ => transactions}/common/schema/transaction_vote_v2.0.yaml (100%) rename planetmint/{ => transactions}/common/transaction.py (100%) rename planetmint/{ => transactions}/common/transaction_mode_types.py (100%) rename planetmint/{ => transactions}/common/utils.py (100%) diff --git a/planetmint/common/__init__.py b/planetmint/transactions/common/__init__.py similarity index 100% rename from planetmint/common/__init__.py rename to planetmint/transactions/common/__init__.py diff --git a/planetmint/common/crypto.py b/planetmint/transactions/common/crypto.py similarity index 100% rename from planetmint/common/crypto.py rename to planetmint/transactions/common/crypto.py diff --git a/planetmint/common/exceptions.py b/planetmint/transactions/common/exceptions.py similarity index 100% rename from planetmint/common/exceptions.py rename to planetmint/transactions/common/exceptions.py diff --git a/planetmint/transactions/common/input.py b/planetmint/transactions/common/input.py new file mode 100644 index 0000000..6ef058f --- /dev/null +++ b/planetmint/transactions/common/input.py @@ -0,0 +1,117 @@ +# Copyright © 2020 Interplanetary Database Association e.V., +# Planetmint and IPDB software contributors. +# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0) +# Code is Apache-2.0 and docs are CC-BY-4.0 + +class Input(object): + """A Input is used to spend assets locked by an Output. + + Wraps around a Crypto-condition Fulfillment. + + Attributes: + fulfillment (:class:`cryptoconditions.Fulfillment`): A Fulfillment + to be signed with a private key. + owners_before (:obj:`list` of :obj:`str`): A list of owners after a + Transaction was confirmed. + fulfills (:class:`~planetmint.common.transaction. TransactionLink`, + optional): A link representing the input of a `TRANSFER` + Transaction. + """ + + def __init__(self, fulfillment, owners_before, fulfills=None): + """Create an instance of an :class:`~.Input`. + + Args: + fulfillment (:class:`cryptoconditions.Fulfillment`): A + Fulfillment to be signed with a private key. + owners_before (:obj:`list` of :obj:`str`): A list of owners + after a Transaction was confirmed. + fulfills (:class:`~planetmint.common.transaction. + TransactionLink`, optional): A link representing the input + of a `TRANSFER` Transaction. + """ + if fulfills is not None and not isinstance(fulfills, TransactionLink): + raise TypeError('`fulfills` must be a TransactionLink instance') + if not isinstance(owners_before, list): + raise TypeError('`owners_before` must be a list instance') + + self.fulfillment = fulfillment + self.fulfills = fulfills + self.owners_before = owners_before + + def __eq__(self, other): + # TODO: If `other !== Fulfillment` return `False` + return self.to_dict() == other.to_dict() + + # NOTE: This function is used to provide a unique key for a given + # Input to suppliment memoization + def __hash__(self): + return hash((self.fulfillment, self.fulfills)) + + def to_dict(self): + """Transforms the object to a Python dictionary. + + Note: + If an Input hasn't been signed yet, this method returns a + dictionary representation. + + Returns: + dict: The Input as an alternative serialization format. + """ + try: + fulfillment = self.fulfillment.serialize_uri() + except (TypeError, AttributeError, ASN1EncodeError, ASN1DecodeError): + fulfillment = _fulfillment_to_details(self.fulfillment) + + try: + # NOTE: `self.fulfills` can be `None` and that's fine + fulfills = self.fulfills.to_dict() + except AttributeError: + fulfills = None + + input_ = { + 'owners_before': self.owners_before, + 'fulfills': fulfills, + 'fulfillment': fulfillment, + } + return input_ + + @classmethod + def generate(cls, public_keys): + # TODO: write docstring + # The amount here does not really matter. It is only use on the + # output data model but here we only care about the fulfillment + output = Output.generate(public_keys, 1) + return cls(output.fulfillment, public_keys) + + @classmethod + def from_dict(cls, data): + """Transforms a Python dictionary to an Input object. + + Note: + Optionally, this method can also serialize a Cryptoconditions- + Fulfillment that is not yet signed. + + Args: + data (dict): The Input to be transformed. + + Returns: + :class:`~planetmint.common.transaction.Input` + + Raises: + InvalidSignature: If an Input's URI couldn't be parsed. + """ + fulfillment = data['fulfillment'] + if not isinstance(fulfillment, (Fulfillment, type(None))): + try: + fulfillment = Fulfillment.from_uri(data['fulfillment']) + except ASN1DecodeError: + # TODO Remove as it is legacy code, and simply fall back on + # ASN1DecodeError + raise InvalidSignature("Fulfillment URI couldn't been parsed") + except TypeError: + # NOTE: See comment about this special case in + # `Input.to_dict` + fulfillment = _fulfillment_from_details(data['fulfillment']) + fulfills = TransactionLink.from_dict(data['fulfills']) + return cls(fulfillment, data['owners_before'], fulfills) diff --git a/planetmint/common/memoize.py b/planetmint/transactions/common/memoize.py similarity index 100% rename from planetmint/common/memoize.py rename to planetmint/transactions/common/memoize.py diff --git a/planetmint/common/schema/README.md b/planetmint/transactions/common/schema/README.md similarity index 100% rename from planetmint/common/schema/README.md rename to planetmint/transactions/common/schema/README.md diff --git a/planetmint/common/schema/__init__.py b/planetmint/transactions/common/schema/__init__.py similarity index 100% rename from planetmint/common/schema/__init__.py rename to planetmint/transactions/common/schema/__init__.py diff --git a/planetmint/common/schema/transaction_chain_migration_election_v2.0.yaml b/planetmint/transactions/common/schema/transaction_chain_migration_election_v2.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_chain_migration_election_v2.0.yaml rename to planetmint/transactions/common/schema/transaction_chain_migration_election_v2.0.yaml diff --git a/planetmint/common/schema/transaction_create_v1.0.yaml b/planetmint/transactions/common/schema/transaction_create_v1.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_create_v1.0.yaml rename to planetmint/transactions/common/schema/transaction_create_v1.0.yaml diff --git a/planetmint/common/schema/transaction_create_v2.0.yaml b/planetmint/transactions/common/schema/transaction_create_v2.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_create_v2.0.yaml rename to planetmint/transactions/common/schema/transaction_create_v2.0.yaml diff --git a/planetmint/common/schema/transaction_transfer_v1.0.yaml b/planetmint/transactions/common/schema/transaction_transfer_v1.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_transfer_v1.0.yaml rename to planetmint/transactions/common/schema/transaction_transfer_v1.0.yaml diff --git a/planetmint/common/schema/transaction_transfer_v2.0.yaml b/planetmint/transactions/common/schema/transaction_transfer_v2.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_transfer_v2.0.yaml rename to planetmint/transactions/common/schema/transaction_transfer_v2.0.yaml diff --git a/planetmint/common/schema/transaction_v1.0.yaml b/planetmint/transactions/common/schema/transaction_v1.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_v1.0.yaml rename to planetmint/transactions/common/schema/transaction_v1.0.yaml diff --git a/planetmint/common/schema/transaction_v2.0.yaml b/planetmint/transactions/common/schema/transaction_v2.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_v2.0.yaml rename to planetmint/transactions/common/schema/transaction_v2.0.yaml diff --git a/planetmint/common/schema/transaction_validator_election_v2.0.yaml b/planetmint/transactions/common/schema/transaction_validator_election_v2.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_validator_election_v2.0.yaml rename to planetmint/transactions/common/schema/transaction_validator_election_v2.0.yaml diff --git a/planetmint/common/schema/transaction_vote_v2.0.yaml b/planetmint/transactions/common/schema/transaction_vote_v2.0.yaml similarity index 100% rename from planetmint/common/schema/transaction_vote_v2.0.yaml rename to planetmint/transactions/common/schema/transaction_vote_v2.0.yaml diff --git a/planetmint/common/transaction.py b/planetmint/transactions/common/transaction.py similarity index 100% rename from planetmint/common/transaction.py rename to planetmint/transactions/common/transaction.py diff --git a/planetmint/common/transaction_mode_types.py b/planetmint/transactions/common/transaction_mode_types.py similarity index 100% rename from planetmint/common/transaction_mode_types.py rename to planetmint/transactions/common/transaction_mode_types.py diff --git a/planetmint/common/utils.py b/planetmint/transactions/common/utils.py similarity index 100% rename from planetmint/common/utils.py rename to planetmint/transactions/common/utils.py