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 fb7fd80cc0..c1c261ac03 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 @@ -21,7 +21,10 @@ import { IPluginKeychain, } from "@hyperledger/cactus-core-api"; -import { PluginRegistry } from "@hyperledger/cactus-core"; +import { + PluginRegistry, + consensusHasTransactionFinality, +} from "@hyperledger/cactus-core"; import { Checks, @@ -221,7 +224,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 a34db271b6..34ba53896e 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, @@ -95,6 +95,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 f46d78cace..39bfd6f324 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, @@ -202,7 +205,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 4ed179391f..34e1d2f34c 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 {