From b69ef3dcbfea953fa973c4fe7bc8c0e3a689a23c Mon Sep 17 00:00:00 2001 From: jscode017 Date: Sun, 18 Apr 2021 21:26:34 +0800 Subject: [PATCH] feat(core-api): hasTransactionFinality() on connector API #354 Primary change(s): ------------------ 1. Add a feature of asking the connector at runtime whether its ledger has transaction finality guaranteed or not Fixes: #354 Signed-off-by: jscode017 --- .../plugin-ledger-connector-stub.ts | 9 +++++- .../src/main/json/openapi.json | 18 ++++++++++++ .../generated/openapi/typescript-axios/api.ts | 19 +++++++++++++ .../i-plugin-ledger-connector.ts | 1 + .../consensus-has-transaction-finality.ts | 28 +++++++++++++++++++ .../src/main/typescript/public-api.ts | 2 ++ .../plugin-ledger-connector-besu.ts | 9 +++++- .../plugin-ledger-connector-corda.ts | 7 ++++- .../plugin-ledger-connector-fabric.ts | 9 +++++- .../plugin-ledger-connector-quorum.ts | 9 +++++- 10 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 packages/cactus-core/src/main/typescript/consensus-has-transaction-finality.ts diff --git a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/plugin-ledger-connector-stub.ts b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/plugin-ledger-connector-stub.ts index b985e33873..e49c2807b6 100644 --- a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/plugin-ledger-connector-stub.ts +++ b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/plugin-ledger-connector-stub.ts @@ -14,7 +14,10 @@ import { ICactusPluginOptions, } from "@hyperledger/cactus-core-api"; -import { PluginRegistry } from "@hyperledger/cactus-core"; +import { + PluginRegistry, + consensusHasTransactionFinality, +} from "@hyperledger/cactus-core"; import { Checks, @@ -128,7 +131,11 @@ export class PluginLedgerConnectorStub > { return ConsensusAlgorithmFamily.AUTHORITY; } + public async hasTransactionFinality(): Promise { + const currentConsensusAlgorithmFamily = await this.getConsensusAlgorithmFamily(); + return consensusHasTransactionFinality(currentConsensusAlgorithmFamily); + } public async transact(req: unknown): Promise { const fnTag = `${this.className}#transact()`; Checks.truthy(req, `${fnTag} req`); diff --git a/packages/cactus-core-api/src/main/json/openapi.json b/packages/cactus-core-api/src/main/json/openapi.json index eb4d369979..2d63ef4746 100644 --- a/packages/cactus-core-api/src/main/json/openapi.json +++ b/packages/cactus-core-api/src/main/json/openapi.json @@ -68,6 +68,24 @@ "org.hyperledger.cactus.consensusalgorithm.PROOF_OF_WORK" ] }, + "ConsensusAlgorithmFamiliesWithTxFinality":{ + "type": "string", + "description": "Enumerates a list of consensus algorithm families that provide immediate finality", + "enum": [ + "org.hyperledger.cactus.consensusalgorithm.PROOF_OF_AUTHORITY", + "org.hyperledger.cactus.consensusalgorithm.PROOF_OF_STAKE" + ] + + }, + "ConsensusAlgorithmFamiliesWithOutTxFinality":{ + "description":"Enumerates a list of consensus algorithm families that do not provide immediate finality", + "type": "string", + "enum": [ + "org.hyperledger.cactus.consensusalgorithm.PROOF_OF_WORK" + ], + "x-enum-varnames": ["WORK"] + + }, "PrimaryKey": { "type": "string", "minLength": 1, diff --git a/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts b/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts index b1787cf674..75dd724082 100644 --- a/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts +++ b/packages/cactus-core-api/src/main/typescript/generated/openapi/typescript-axios/api.ts @@ -124,6 +124,25 @@ export interface CactusNodeMeta { */ publicKeyPem: string; } +/** + * Enumerates a list of consensus algorithm families that do not provide immediate finality + * @export + * @enum {string} + */ +export enum ConsensusAlgorithmFamiliesWithOutTxFinality { + WORK = 'org.hyperledger.cactus.consensusalgorithm.PROOF_OF_WORK' +} + +/** + * Enumerates a list of consensus algorithm families that provide immediate finality + * @export + * @enum {string} + */ +export enum ConsensusAlgorithmFamiliesWithTxFinality { + AUTHORITY = 'org.hyperledger.cactus.consensusalgorithm.PROOF_OF_AUTHORITY', + STAKE = 'org.hyperledger.cactus.consensusalgorithm.PROOF_OF_STAKE' +} + /** * Enumerates a list of consensus algorithm families in existence. Does not intend to be an exhaustive list, just a practical one, meaning that we only include items here that are relevant to Hyperledger Cactus in fulfilling its own duties. This can be extended later as more sophisticated features of Cactus get implemented. This enum is meant to be first and foremest a useful abstraction for achieving practical tasks, not an encyclopedia and therefore we ask of everyone that this to be extended only in ways that serve a practical purpose for the runtime behavior of Cactus or Cactus plugins in general. The bottom line is that we can accept this enum being not 100% accurate as long as it 100% satisfies what it was designed to do. * @export diff --git a/packages/cactus-core-api/src/main/typescript/plugin/ledger-connector/i-plugin-ledger-connector.ts b/packages/cactus-core-api/src/main/typescript/plugin/ledger-connector/i-plugin-ledger-connector.ts index f700d1b803..7b479f0935 100644 --- a/packages/cactus-core-api/src/main/typescript/plugin/ledger-connector/i-plugin-ledger-connector.ts +++ b/packages/cactus-core-api/src/main/typescript/plugin/ledger-connector/i-plugin-ledger-connector.ts @@ -30,4 +30,5 @@ export interface IPluginLedgerConnector< * @see {ConsensusAlgorithmFamily} */ getConsensusAlgorithmFamily(): Promise; + hasTransactionFinality(): Promise; } diff --git a/packages/cactus-core/src/main/typescript/consensus-has-transaction-finality.ts b/packages/cactus-core/src/main/typescript/consensus-has-transaction-finality.ts new file mode 100644 index 0000000000..9b9991f74b --- /dev/null +++ b/packages/cactus-core/src/main/typescript/consensus-has-transaction-finality.ts @@ -0,0 +1,28 @@ +import { + ConsensusAlgorithmFamily, + ConsensusAlgorithmFamiliesWithTxFinality, + ConsensusAlgorithmFamiliesWithOutTxFinality, +} from "@hyperledger/cactus-core-api"; + +export function consensusHasTransactionFinality( + consensusAlgorithmFamily: ConsensusAlgorithmFamily, +): boolean { + const isInConsensusAlgorithmFamiliesWithTxFinality = (Object.values( + ConsensusAlgorithmFamiliesWithTxFinality, + ) as string[]).includes(consensusAlgorithmFamily.toString()); + + const isInConsensusAlgorithmFamiliesWithOutTxFinality = (Object.values( + ConsensusAlgorithmFamiliesWithOutTxFinality, + ) as string[]).includes(consensusAlgorithmFamily.toString()); + + const unrecognizedConsensusAlgorithmFamily = + !isInConsensusAlgorithmFamiliesWithTxFinality && + !isInConsensusAlgorithmFamiliesWithOutTxFinality; + + if (unrecognizedConsensusAlgorithmFamily) { + throw new Error( + `Unrecognized consensus algorithm family: ${consensusAlgorithmFamily}`, + ); + } + return isInConsensusAlgorithmFamiliesWithTxFinality; +} diff --git a/packages/cactus-core/src/main/typescript/public-api.ts b/packages/cactus-core/src/main/typescript/public-api.ts index a2900141db..505be2277c 100755 --- a/packages/cactus-core/src/main/typescript/public-api.ts +++ b/packages/cactus-core/src/main/typescript/public-api.ts @@ -9,3 +9,5 @@ export { AuthorizationOptionsProvider, IEndpointAuthzOptionsProviderOptions, } from "./web-services/authorization-options-provider"; + +export { consensusHasTransactionFinality } from "./consensus-has-transaction-finality"; diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts index 81b13734a1..639a0e468f 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/plugin-ledger-connector-besu.ts @@ -20,7 +20,10 @@ import { IPluginKeychain, } from "@hyperledger/cactus-core-api"; -import { PluginRegistry } from "@hyperledger/cactus-core"; +import { + PluginRegistry, + consensusHasTransactionFinality, +} from "@hyperledger/cactus-core"; import { Checks, @@ -220,7 +223,11 @@ export class PluginLedgerConnectorBesu > { return ConsensusAlgorithmFamily.AUTHORITY; } + public async hasTransactionFinality(): Promise { + const currentConsensusAlgorithmFamily = await this.getConsensusAlgorithmFamily(); + return consensusHasTransactionFinality(currentConsensusAlgorithmFamily); + } public async invokeContract( req: InvokeContractV1Request, ): Promise { diff --git a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/plugin-ledger-connector-corda.ts b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/plugin-ledger-connector-corda.ts index cf3f14c4a8..6bff0c27c8 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/plugin-ledger-connector-corda.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/plugin-ledger-connector-corda.ts @@ -13,7 +13,7 @@ import { ICactusPluginOptions, ConsensusAlgorithmFamily, } from "@hyperledger/cactus-core-api"; - +import { consensusHasTransactionFinality } from "@hyperledger/cactus-core"; import { Checks, Logger, @@ -65,6 +65,11 @@ export class PluginLedgerConnectorCorda > { return ConsensusAlgorithmFamily.AUTHORITY; } + public async hasTransactionFinality(): Promise { + const currentConsensusAlgorithmFamily = await this.getConsensusAlgorithmFamily(); + + return consensusHasTransactionFinality(currentConsensusAlgorithmFamily); + } public getAspect(): PluginAspect { return PluginAspect.LEDGER_CONNECTOR; diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts index 0e6f077510..cdd0546abd 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts @@ -33,7 +33,10 @@ import { ICactusPluginOptions, } from "@hyperledger/cactus-core-api"; -import { PluginRegistry } from "@hyperledger/cactus-core"; +import { + consensusHasTransactionFinality, + PluginRegistry, +} from "@hyperledger/cactus-core"; import { Logger, @@ -184,7 +187,11 @@ export class PluginLedgerConnectorFabric > { return ConsensusAlgorithmFamily.AUTHORITY; } + public async hasTransactionFinality(): Promise { + const currentConsensusAlgorithmFamily = await this.getConsensusAlgorithmFamily(); + return consensusHasTransactionFinality(currentConsensusAlgorithmFamily); + } private async sshExec( cmd: string, label: string, diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts index 4abe2e3cce..581d647937 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts @@ -23,7 +23,10 @@ import { IPluginKeychain, } from "@hyperledger/cactus-core-api"; -import { PluginRegistry } from "@hyperledger/cactus-core"; +import { + PluginRegistry, + consensusHasTransactionFinality, +} from "@hyperledger/cactus-core"; import { Checks, @@ -205,7 +208,11 @@ export class PluginLedgerConnectorQuorum > { return ConsensusAlgorithmFamily.AUTHORITY; } + public async hasTransactionFinality(): Promise { + const currentConsensusAlgorithmFamily = await this.getConsensusAlgorithmFamily(); + return consensusHasTransactionFinality(currentConsensusAlgorithmFamily); + } public async invokeContract( req: InvokeContractV1Request, ): Promise {