From f78be0c4793a1991caf76f1dc127f904d9293c9c Mon Sep 17 00:00:00 2001 From: AdriGeorge Date: Tue, 6 Oct 2026 09:04:28 +0300 Subject: [PATCH 1/2] chore: add check on free compute --- src/components/core/compute/startCompute.ts | 86 ++++++++++++++++++++- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/src/components/core/compute/startCompute.ts b/src/components/core/compute/startCompute.ts index 9f931d5ff..1d5470d94 100644 --- a/src/components/core/compute/startCompute.ts +++ b/src/components/core/compute/startCompute.ts @@ -406,7 +406,7 @@ export class PaidComputeStartHandler extends CommonComputeHandler { // let's see if we can access this asset // check if oasis evm or similar - const confidentialEVM = isConfidentialChainDDO(BigInt(ddo.chainId), service) + const confidentialEVM = isConfidentialChainDDO(BigInt(ddoChainId), service) let canDecrypt = false try { if (!confidentialEVM) { @@ -523,8 +523,8 @@ export class PaidComputeStartHandler extends CommonComputeHandler { } result.validOrder = elem.transferTxId - if (!('meta' in algorithm) && ddo.metadata.type === 'algorithm') { - const { entrypoint, image, tag, checksum } = ddo.metadata.algorithm.container + if (!('meta' in algorithm) && metadata.type === 'algorithm') { + const { entrypoint, image, tag, checksum } = metadata.algorithm.container const container = { entrypoint, image, tag, checksum } algorithm.meta = { language: metadata.algorithm.language, @@ -816,6 +816,13 @@ export class FreeComputeStartHandler extends CommonComputeHandler { return psAccess } } + const algoChecksums = await getAlgoChecksums( + task.algorithm.documentId, + task.algorithm.serviceId, + node, + node.getConfig(), + task.consumerAddress + ) for (const elem of [...[task.algorithm], ...task.datasets]) { if (!('documentId' in elem) || !elem.documentId) { continue @@ -834,7 +841,7 @@ export class FreeComputeStartHandler extends CommonComputeHandler { } } const ddoInstance = DDOManager.getDDOClass(ddo) - const { chainId: ddoChainId, credentials } = ddoInstance.getDDOFields() + const { chainId: ddoChainId, credentials, metadata } = ddoInstance.getDDOFields() const isOrdable = isOrderingAllowedForAsset(ddo) if (!isOrdable.isOrdable) { CORE_LOGGER.error(isOrdable.reason) @@ -953,6 +960,77 @@ export class FreeComputeStartHandler extends CommonComputeHandler { } } } + const confidentialEVM = isConfidentialChainDDO(BigInt(ddoChainId), service) + let canDecrypt = false + try { + if (!confidentialEVM) { + await node + .getKeyManager() + .decrypt( + Uint8Array.from(Buffer.from(sanitizeServiceFiles(service.files), 'hex')), + EncryptMethod.ECIES + ) + canDecrypt = true + } else { + // TODO 'Start compute on confidential EVM!' + const signer = await blockchain.getSigner() + const isTemplate4 = await isDataTokenTemplate4( + service.datatokenAddress, + signer + ) + if (isTemplate4 && (await isERC20Template4Active(ddoChainId, signer))) { + // we need to get the proper data for the signature + const consumeData = + task.consumerAddress + + task.datasets[0].documentId + + getNonceAsNumber(task.consumerAddress) + // call smart contract to decrypt + const serviceIndex = AssetUtils.getServiceIndexById(ddo, service.id) + const filesObject = await getFilesObjectFromConfidentialEVM( + serviceIndex, + service.datatokenAddress, + signer, + task.consumerAddress, + task.signature, // we will need to have a signature verification + consumeData + ) + if (filesObject != null) { + canDecrypt = true + } + } + } + } catch (e) { + // do nothing + CORE_LOGGER.error('Could not decrypt DDO files Object: ' + e.message) + } + if (service.type === 'compute' && !canDecrypt) { + const error = `Service ${elem.serviceId} from DDO ${elem.documentId} cannot be used in compute on this provider` + return { + stream: null, + status: { + httpStatus: 500, + error + } + } + } + if (metadata.type !== 'algorithm') { + const validAlgoForDataset = await validateAlgoForDataset( + task.algorithm.documentId, + algoChecksums, + ddoInstance, + elem.serviceId, + node + ) + if (!validAlgoForDataset) { + return { + stream: null, + status: { + httpStatus: 400, + error: `Algorithm ${task.algorithm.documentId} not allowed to run on the dataset: ${elem.documentId}` + } + } + } + } } const allFreeEnvs = await engine.getComputeEnvironments() const env = allFreeEnvs.find((e) => e.id === task.environment) From 2f82c7483e1e1329e80b3693ed773d19785aebdf Mon Sep 17 00:00:00 2001 From: AdriGeorge Date: Tue, 6 Oct 2026 09:55:23 +0300 Subject: [PATCH 2/2] fix: await --- src/components/core/compute/initialize.ts | 2 +- src/components/core/compute/startCompute.ts | 4 ++-- src/components/core/utils/nonceHandler.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/core/compute/initialize.ts b/src/components/core/compute/initialize.ts index d2bfd6b22..25ec1c33b 100644 --- a/src/components/core/compute/initialize.ts +++ b/src/components/core/compute/initialize.ts @@ -486,7 +486,7 @@ export class ComputeInitializeHandler extends CommandHandler { const consumeData = task.consumerAddress + task.datasets[0].documentId + - getNonceAsNumber(task.consumerAddress) + (await getNonceAsNumber(task.consumerAddress)) // call smart contract to decrypt const serviceIndex = AssetUtils.getServiceIndexById(ddo, service.id) const filesObject = await getFilesObjectFromConfidentialEVM( diff --git a/src/components/core/compute/startCompute.ts b/src/components/core/compute/startCompute.ts index 1d5470d94..854d5ed7d 100644 --- a/src/components/core/compute/startCompute.ts +++ b/src/components/core/compute/startCompute.ts @@ -430,7 +430,7 @@ export class PaidComputeStartHandler extends CommonComputeHandler { const consumeData = task.consumerAddress + task.datasets[0].documentId + - getNonceAsNumber(task.consumerAddress) + (await getNonceAsNumber(task.consumerAddress)) // call smart contract to decrypt const serviceIndex = AssetUtils.getServiceIndexById(ddo, service.id) const filesObject = await getFilesObjectFromConfidentialEVM( @@ -983,7 +983,7 @@ export class FreeComputeStartHandler extends CommonComputeHandler { const consumeData = task.consumerAddress + task.datasets[0].documentId + - getNonceAsNumber(task.consumerAddress) + (await getNonceAsNumber(task.consumerAddress)) // call smart contract to decrypt const serviceIndex = AssetUtils.getServiceIndexById(ddo, service.id) const filesObject = await getFilesObjectFromConfidentialEVM( diff --git a/src/components/core/utils/nonceHandler.ts b/src/components/core/utils/nonceHandler.ts index 816215671..befcce178 100644 --- a/src/components/core/utils/nonceHandler.ts +++ b/src/components/core/utils/nonceHandler.ts @@ -47,7 +47,7 @@ export async function getNonceAsNumber(address: string): Promise { .getHandlerForTask(command) .handle(command) if (nonceResponse.stream) { - return await Number(streamToString(nonceResponse.stream as Readable)) + return Number(await streamToString(nonceResponse.stream as Readable)) } return 0 }