From d224877a97f0246b525fec054580da81704d7c52 Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger Date: Thu, 31 Mar 2022 10:33:49 +0200 Subject: [PATCH 1/2] moved transaction schemas to version folders Signed-off-by: Lorenz Herzberger --- .../transactions/common/schema/__init__.py | 17 +- .../transaction.yaml} | 0 .../transaction_create.yaml} | 0 .../transaction_transfer.yaml} | 0 .../transaction.yaml} | 0 ...transaction_chain_migration_election.yaml} | 0 .../transaction_create.yaml} | 0 .../transaction_transfer.yaml} | 0 .../transaction_validator_election.yaml} | 0 .../transaction_vote.yaml} | 0 .../common/schema/v3.0/transaction.yaml | 174 ++++++++++++++++++ 11 files changed, 183 insertions(+), 8 deletions(-) rename planetmint/transactions/common/schema/{transaction_v1.0.yaml => v1.0/transaction.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_create_v1.0.yaml => v1.0/transaction_create.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_transfer_v1.0.yaml => v1.0/transaction_transfer.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_v2.0.yaml => v2.0/transaction.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_chain_migration_election_v2.0.yaml => v2.0/transaction_chain_migration_election.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_create_v2.0.yaml => v2.0/transaction_create.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_transfer_v2.0.yaml => v2.0/transaction_transfer.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_validator_election_v2.0.yaml => v2.0/transaction_validator_election.yaml} (100%) rename planetmint/transactions/common/schema/{transaction_vote_v2.0.yaml => v2.0/transaction_vote.yaml} (100%) create mode 100644 planetmint/transactions/common/schema/v3.0/transaction.yaml diff --git a/planetmint/transactions/common/schema/__init__.py b/planetmint/transactions/common/schema/__init__.py index 0b4b20b..51e092c 100644 --- a/planetmint/transactions/common/schema/__init__.py +++ b/planetmint/transactions/common/schema/__init__.py @@ -17,31 +17,32 @@ from planetmint.transactions.common.exceptions import SchemaValidationError logger = logging.getLogger(__name__) -def _load_schema(name, path=__file__): +def _load_schema(name, version, path=__file__): """Load a schema from disk""" - path = os.path.join(os.path.dirname(path), name + '.yaml') + path = os.path.join(os.path.dirname(path), version, name + '.yaml') with open(path) as handle: schema = yaml.safe_load(handle) fast_schema = rapidjson.Validator(rapidjson.dumps(schema)) return path, (schema, fast_schema) +# TODO: make this an env var from a config file TX_SCHEMA_VERSION = 'v2.0' -TX_SCHEMA_PATH, TX_SCHEMA_COMMON = _load_schema('transaction_' + +TX_SCHEMA_PATH, TX_SCHEMA_COMMON = _load_schema('transaction', TX_SCHEMA_VERSION) -_, TX_SCHEMA_CREATE = _load_schema('transaction_create_' + +_, TX_SCHEMA_CREATE = _load_schema('transaction_create', TX_SCHEMA_VERSION) -_, TX_SCHEMA_TRANSFER = _load_schema('transaction_transfer_' + +_, TX_SCHEMA_TRANSFER = _load_schema('transaction_transfer', TX_SCHEMA_VERSION) -_, TX_SCHEMA_VALIDATOR_ELECTION = _load_schema('transaction_validator_election_' + +_, TX_SCHEMA_VALIDATOR_ELECTION = _load_schema('transaction_validator_election', TX_SCHEMA_VERSION) -_, TX_SCHEMA_CHAIN_MIGRATION_ELECTION = _load_schema('transaction_chain_migration_election_' + +_, TX_SCHEMA_CHAIN_MIGRATION_ELECTION = _load_schema('transaction_chain_migration_election', TX_SCHEMA_VERSION) -_, TX_SCHEMA_VOTE = _load_schema('transaction_vote_' + TX_SCHEMA_VERSION) +_, TX_SCHEMA_VOTE = _load_schema('transaction_vote', TX_SCHEMA_VERSION) def _validate_schema(schema, body): diff --git a/planetmint/transactions/common/schema/transaction_v1.0.yaml b/planetmint/transactions/common/schema/v1.0/transaction.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_v1.0.yaml rename to planetmint/transactions/common/schema/v1.0/transaction.yaml diff --git a/planetmint/transactions/common/schema/transaction_create_v1.0.yaml b/planetmint/transactions/common/schema/v1.0/transaction_create.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_create_v1.0.yaml rename to planetmint/transactions/common/schema/v1.0/transaction_create.yaml diff --git a/planetmint/transactions/common/schema/transaction_transfer_v1.0.yaml b/planetmint/transactions/common/schema/v1.0/transaction_transfer.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_transfer_v1.0.yaml rename to planetmint/transactions/common/schema/v1.0/transaction_transfer.yaml diff --git a/planetmint/transactions/common/schema/transaction_v2.0.yaml b/planetmint/transactions/common/schema/v2.0/transaction.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_v2.0.yaml rename to planetmint/transactions/common/schema/v2.0/transaction.yaml diff --git a/planetmint/transactions/common/schema/transaction_chain_migration_election_v2.0.yaml b/planetmint/transactions/common/schema/v2.0/transaction_chain_migration_election.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_chain_migration_election_v2.0.yaml rename to planetmint/transactions/common/schema/v2.0/transaction_chain_migration_election.yaml diff --git a/planetmint/transactions/common/schema/transaction_create_v2.0.yaml b/planetmint/transactions/common/schema/v2.0/transaction_create.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_create_v2.0.yaml rename to planetmint/transactions/common/schema/v2.0/transaction_create.yaml diff --git a/planetmint/transactions/common/schema/transaction_transfer_v2.0.yaml b/planetmint/transactions/common/schema/v2.0/transaction_transfer.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_transfer_v2.0.yaml rename to planetmint/transactions/common/schema/v2.0/transaction_transfer.yaml diff --git a/planetmint/transactions/common/schema/transaction_validator_election_v2.0.yaml b/planetmint/transactions/common/schema/v2.0/transaction_validator_election.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_validator_election_v2.0.yaml rename to planetmint/transactions/common/schema/v2.0/transaction_validator_election.yaml diff --git a/planetmint/transactions/common/schema/transaction_vote_v2.0.yaml b/planetmint/transactions/common/schema/v2.0/transaction_vote.yaml similarity index 100% rename from planetmint/transactions/common/schema/transaction_vote_v2.0.yaml rename to planetmint/transactions/common/schema/v2.0/transaction_vote.yaml diff --git a/planetmint/transactions/common/schema/v3.0/transaction.yaml b/planetmint/transactions/common/schema/v3.0/transaction.yaml new file mode 100644 index 0000000..ca64ce9 --- /dev/null +++ b/planetmint/transactions/common/schema/v3.0/transaction.yaml @@ -0,0 +1,174 @@ +# 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 + +--- +"$schema": "http://json-schema.org/draft-04/schema#" +type: object +additionalProperties: false +title: Transaction Schema +required: +- id +- inputs +- outputs +- operation +- metadata +- assets +- version +properties: + id: + anyOf: + - "$ref": "#/definitions/sha3_hexdigest" + - type: 'null' + operation: + "$ref": "#/definitions/operation" + assets: + type: array + items: + "$ref": "#/definitions/asset" + inputs: + type: array + title: "Transaction inputs" + items: + "$ref": "#/definitions/input" + outputs: + type: array + items: + "$ref": "#/definitions/output" + metadata: + "$ref": "#/definitions/metadata" + version: + type: string + pattern: "^2\\.0$" +definitions: + offset: + type: integer + minimum: 0 + base58: + pattern: "[1-9a-zA-Z^OIl]{43,44}" + type: string + public_keys: + anyOf: + - type: array + items: + "$ref": "#/definitions/base58" + - type: 'null' + sha3_hexdigest: + pattern: "[0-9a-f]{64}" + type: string + uuid4: + pattern: "[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}" + type: string + operation: + type: string + enum: + - CREATE + - TRANSFER + - VALIDATOR_ELECTION + - CHAIN_MIGRATION_ELECTION + - VOTE + - COMPOSE + - DECOMPOSE + asset: + type: object + additionalProperties: false + properties: + id: + "$ref": "#/definitions/sha3_hexdigest" + data: + anyOf: + - type: object + additionalProperties: true + - type: 'null' + output: + type: object + additionalProperties: false + required: + - amount + - condition + - public_keys + properties: + amount: + type: string + pattern: "^[0-9]{1,20}$" + condition: + type: object + additionalProperties: false + required: + - details + - uri + properties: + details: + "$ref": "#/definitions/condition_details" + uri: + type: string + pattern: "^ni:///sha-256;([a-zA-Z0-9_-]{0,86})[?]\ + (fpt=(ed25519|threshold)-sha-256(&)?|cost=[0-9]+(&)?|\ + subtypes=ed25519-sha-256(&)?){2,3}$" + public_keys: + "$ref": "#/definitions/public_keys" + input: + type: "object" + additionalProperties: false + required: + - owners_before + - fulfillment + properties: + owners_before: + "$ref": "#/definitions/public_keys" + fulfillment: + anyOf: + - type: string + pattern: "^[a-zA-Z0-9_-]*$" + - "$ref": "#/definitions/condition_details" + fulfills: + anyOf: + - type: 'object' + additionalProperties: false + required: + - output_index + - transaction_id + properties: + output_index: + "$ref": "#/definitions/offset" + transaction_id: + "$ref": "#/definitions/sha3_hexdigest" + - type: 'null' + metadata: + anyOf: + - type: object + additionalProperties: true + minProperties: 1 + - type: 'null' + condition_details: + anyOf: + - type: object + additionalProperties: false + required: + - type + - public_key + properties: + type: + type: string + pattern: "^ed25519-sha-256$" + public_key: + "$ref": "#/definitions/base58" + - type: object + additionalProperties: false + required: + - type + - threshold + - subconditions + properties: + type: + type: "string" + pattern: "^threshold-sha-256$" + threshold: + type: integer + minimum: 1 + maximum: 100 + subconditions: + type: array + items: + "$ref": "#/definitions/condition_details" From 167d97051129ab175dda15752d21fd82f06dd88e Mon Sep 17 00:00:00 2001 From: Lorenz Herzberger Date: Thu, 31 Mar 2022 11:09:32 +0200 Subject: [PATCH 2/2] updated asset definition on v3.0 transaction types Signed-off-by: Lorenz Herzberger --- .../transaction_chain_migration_election.yaml | 51 +++++++++++++ .../schema/v3.0/transaction_create.yaml | 42 +++++++++++ .../schema/v3.0/transaction_transfer.yaml | 39 ++++++++++ .../v3.0/transaction_validator_election.yaml | 74 +++++++++++++++++++ .../common/schema/v3.0/transaction_vote.yaml | 34 +++++++++ 5 files changed, 240 insertions(+) create mode 100644 planetmint/transactions/common/schema/v3.0/transaction_chain_migration_election.yaml create mode 100644 planetmint/transactions/common/schema/v3.0/transaction_create.yaml create mode 100644 planetmint/transactions/common/schema/v3.0/transaction_transfer.yaml create mode 100644 planetmint/transactions/common/schema/v3.0/transaction_validator_election.yaml create mode 100644 planetmint/transactions/common/schema/v3.0/transaction_vote.yaml diff --git a/planetmint/transactions/common/schema/v3.0/transaction_chain_migration_election.yaml b/planetmint/transactions/common/schema/v3.0/transaction_chain_migration_election.yaml new file mode 100644 index 0000000..932c7b1 --- /dev/null +++ b/planetmint/transactions/common/schema/v3.0/transaction_chain_migration_election.yaml @@ -0,0 +1,51 @@ +# 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 + +--- +"$schema": "http://json-schema.org/draft-04/schema#" +type: object +title: Chain Migration Election Schema - Propose a halt in block production to allow for a version change +required: +- operation +- assets +- outputs +properties: + operation: + type: string + value: "CHAIN_MIGRATION_ELECTION" + assets: + type: array + minItems: 1 + maxItems: 1 + items: + "$ref": "#/definitions/asset" + outputs: + type: array + items: + "$ref": "#/definitions/output" +definitions: + asset: + additionalProperties: false + properties: + data: + additionalProperties: false + properties: + seed: + type: string + required: + - data + output: + type: object + properties: + condition: + type: object + required: + - uri + properties: + uri: + type: string + pattern: "^ni:///sha-256;([a-zA-Z0-9_-]{0,86})[?]\ + (fpt=ed25519-sha-256(&)?|cost=[0-9]+(&)?|\ + subtypes=ed25519-sha-256(&)?){2,3}$" diff --git a/planetmint/transactions/common/schema/v3.0/transaction_create.yaml b/planetmint/transactions/common/schema/v3.0/transaction_create.yaml new file mode 100644 index 0000000..3a34a46 --- /dev/null +++ b/planetmint/transactions/common/schema/v3.0/transaction_create.yaml @@ -0,0 +1,42 @@ +# 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 + +--- +"$schema": "http://json-schema.org/draft-04/schema#" +type: object +title: Transaction Schema - CREATE specific constraints +required: +- assets +- inputs +properties: + assets: + type: array + minItems: 1 + maxItems: 1 + items: + "$ref": "#/definitions/asset" + inputs: + type: array + title: "Transaction inputs" + maxItems: 1 + minItems: 1 + items: + type: "object" + required: + - fulfills + properties: + fulfills: + type: "null" +definitions: + asset: + additionalProperties: false + properties: + data: + anyOf: + - type: object + additionalProperties: true + - type: 'null' + required: + - data \ No newline at end of file diff --git a/planetmint/transactions/common/schema/v3.0/transaction_transfer.yaml b/planetmint/transactions/common/schema/v3.0/transaction_transfer.yaml new file mode 100644 index 0000000..1bc74e5 --- /dev/null +++ b/planetmint/transactions/common/schema/v3.0/transaction_transfer.yaml @@ -0,0 +1,39 @@ +# 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 + +--- +"$schema": "http://json-schema.org/draft-04/schema#" +type: object +title: Transaction Schema - TRANSFER specific properties +required: +- assets +properties: + assets: + type: array + minItems: 1 + items: + "$ref": "#/definitions/asset" + inputs: + type: array + title: "Transaction inputs" + minItems: 1 + items: + type: "object" + required: + - fulfills + properties: + fulfills: + type: "object" +definitions: + sha3_hexdigest: + pattern: "[0-9a-f]{64}" + type: string + asset: + additionalProperties: false + properties: + id: + "$ref": "#/definitions/sha3_hexdigest" + required: + - id diff --git a/planetmint/transactions/common/schema/v3.0/transaction_validator_election.yaml b/planetmint/transactions/common/schema/v3.0/transaction_validator_election.yaml new file mode 100644 index 0000000..0d7c93b --- /dev/null +++ b/planetmint/transactions/common/schema/v3.0/transaction_validator_election.yaml @@ -0,0 +1,74 @@ +# 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 + +--- +"$schema": "http://json-schema.org/draft-04/schema#" +type: object +title: Validator Election Schema - Propose a change to validator set +required: +- operation +- assets +- outputs +properties: + operation: + type: string + value: "VALIDATOR_ELECTION" + assets: + type: array + minItems: 1 + maxItems: 1 + items: + "$ref": "#/definitions/asset" + outputs: + type: array + items: + "$ref": "#/definitions/output" +definitions: + output: + type: object + properties: + condition: + type: object + required: + - uri + properties: + uri: + type: string + pattern: "^ni:///sha-256;([a-zA-Z0-9_-]{0,86})[?]\ + (fpt=ed25519-sha-256(&)?|cost=[0-9]+(&)?|\ + subtypes=ed25519-sha-256(&)?){2,3}$" + asset: + additionalProperties: false + properties: + data: + additionalProperties: false + properties: + node_id: + type: string + seed: + type: string + public_key: + type: object + additionalProperties: false + required: + - value + - type + properties: + value: + type: string + type: + type: string + enum: + - ed25519-base16 + - ed25519-base32 + - ed25519-base64 + power: + "$ref": "#/definitions/positiveInteger" + required: + - node_id + - public_key + - power + required: + - data diff --git a/planetmint/transactions/common/schema/v3.0/transaction_vote.yaml b/planetmint/transactions/common/schema/v3.0/transaction_vote.yaml new file mode 100644 index 0000000..64ed6ee --- /dev/null +++ b/planetmint/transactions/common/schema/v3.0/transaction_vote.yaml @@ -0,0 +1,34 @@ +# 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 + +--- +"$schema": "http://json-schema.org/draft-04/schema#" +type: object +title: Vote Schema - Vote on an election +required: +- operation +- outputs +properties: + operation: + type: string + value: "VOTE" + outputs: + type: array + items: + "$ref": "#/definitions/output" +definitions: + output: + type: object + properties: + condition: + type: object + required: + - uri + properties: + uri: + type: string + pattern: "^ni:///sha-256;([a-zA-Z0-9_-]{0,86})[?]\ + (fpt=ed25519-sha-256(&)?|cost=[0-9]+(&)?|\ + subtypes=ed25519-sha-256(&)?){2,3}$"