Skip to content

Commit 1bfabb2

Browse files
committed
Merge branch 'main' into fix-http-upload
2 parents 7e0365b + 95ad312 commit 1bfabb2

10 files changed

Lines changed: 104 additions & 70 deletions

File tree

CHANGELOG.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,50 @@ All notable changes to this project will be documented in this file. Dates are d
44

55
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
66

7+
#### [v3.0.6](https://github.com/oceanprotocol/ocean-node/compare/v3.0.5...v3.0.6)
8+
9+
- fix fees on auto create benchmark env [`#1347`](https://github.com/oceanprotocol/ocean-node/pull/1347)
10+
11+
#### [v3.0.5](https://github.com/oceanprotocol/ocean-node/compare/v3.0.4...v3.0.5)
12+
13+
> 22 April 2026
14+
15+
- enableNetwork per env [`#1346`](https://github.com/oceanprotocol/ocean-node/pull/1346)
16+
- Release 3.0.5 [`772a8f4`](https://github.com/oceanprotocol/ocean-node/commit/772a8f44795dab6563d818deb9a668e0b8ef2220)
17+
18+
#### [v3.0.4](https://github.com/oceanprotocol/ocean-node/compare/v3.0.3...v3.0.4)
19+
20+
> 22 April 2026
21+
22+
- fix access list issue [`#1345`](https://github.com/oceanprotocol/ocean-node/pull/1345)
23+
- Release 3.0.4 [`01b6f9f`](https://github.com/oceanprotocol/ocean-node/commit/01b6f9f927926caf21494d7dabdc069db62b173d)
24+
25+
#### [v3.0.3](https://github.com/oceanprotocol/ocean-node/compare/v3.0.2...v3.0.3)
26+
27+
> 22 April 2026
28+
29+
- set benchmark env on base [`#1337`](https://github.com/oceanprotocol/ocean-node/pull/1337)
30+
- parse multiaddrs if string [`#1342`](https://github.com/oceanprotocol/ocean-node/pull/1342)
31+
- Release 3.0.3 [`ad9cecc`](https://github.com/oceanprotocol/ocean-node/commit/ad9ceccf703fc6129fa0a240f3212cf5ccfea0aa)
32+
- set accessList [`a3cd730`](https://github.com/oceanprotocol/ocean-node/commit/a3cd730d8a1209edfecafe026a3351da659e4702)
33+
- add benchmark validation [`3f94ea8`](https://github.com/oceanprotocol/ocean-node/commit/3f94ea8968539d74e40d0055fc025149ed5206a7)
34+
35+
#### [v3.0.2](https://github.com/oceanprotocol/ocean-node/compare/v3.0.1...v3.0.2)
36+
37+
> 21 April 2026
38+
39+
- fix: persistent storage required params to allow authToken [`#1341`](https://github.com/oceanprotocol/ocean-node/pull/1341)
40+
- Bump undici and release-it [`#1340`](https://github.com/oceanprotocol/ocean-node/pull/1340)
41+
- Release 3.0.2 [`8129284`](https://github.com/oceanprotocol/ocean-node/commit/8129284686017117e815ad5fee84e20c1e15f3bb)
42+
743
#### [v3.0.1](https://github.com/oceanprotocol/ocean-node/compare/v3.0.0...v3.0.1)
844

45+
> 20 April 2026
46+
947
- check if c2d is configured [`#1336`](https://github.com/oceanprotocol/ocean-node/pull/1336)
1048
- remove chainId [`#1338`](https://github.com/oceanprotocol/ocean-node/pull/1338)
1149
- fix: compose node env yaml indentation [`#1335`](https://github.com/oceanprotocol/ocean-node/pull/1335)
50+
- Release 3.0.1 [`1a25e48`](https://github.com/oceanprotocol/ocean-node/commit/1a25e48ad3410328b4710265ec434c074b28d78c)
1251

1352
### [v3.0.0](https://github.com/oceanprotocol/ocean-node/compare/v2.1.1...v3.0.0)
1453

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ocean-node",
3-
"version": "3.0.1",
3+
"version": "3.0.6",
44
"description": "Ocean Node is used to run all core services in the Ocean stack",
55
"author": "Ocean Protocol Foundation",
66
"license": "Apache-2.0",

scripts/ocean-node-quickstart.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,7 @@ services:
707707
# P2P_BOOTSTRAP_NODES: ''
708708
# P2P_FILTER_ANNOUNCED_ADDRESSES: ''
709709
DOCKER_COMPUTE_ENVIRONMENTS: '$DOCKER_COMPUTE_ENVIRONMENTS'
710+
ENABLE_BENCHMARK: true
710711
$(
711712
if [ "$enable_tls" == "y" ]; then
712713
echo " HTTP_CERT_PATH: '/usr/src/app/certs/cert.pem'"

src/@types/C2D/C2D.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ export interface ComputeEnvironmentBaseConfig {
120120
access: ComputeAccessList
121121
free?: ComputeEnvironmentFreeOptions
122122
platform: RunningPlatform
123+
enableNetwork?: boolean // whether network is enabled for algorithm containers
123124
}
124125

125126
export interface ComputeRuntimes {
@@ -152,6 +153,7 @@ export interface C2DEnvironmentConfig {
152153
access?: ComputeAccessList
153154
free?: ComputeEnvironmentFreeOptions
154155
resources?: ComputeResource[]
156+
enableNetwork?: boolean // whether network is enabled for algorithm containers
155157
}
156158

157159
export interface C2DDockerConfig {
@@ -168,7 +170,6 @@ export interface C2DDockerConfig {
168170
scanImages?: boolean
169171
scanImageDBUpdateInterval?: number // Default: 12 hours
170172
environments: C2DEnvironmentConfig[]
171-
enableNetwork?: boolean // whether network is enabled for algorithm containers
172173
}
173174

174175
export type ComputeResultType =

src/components/c2d/compute_engine_docker.ts

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@ import type {
2626
ComputeResourcesPricingInfo
2727
} from '../../@types/C2D/C2D.js'
2828
import {
29-
BENCHMARK_MONITORING_ADDRESS,
29+
BASE_CHAIN_ID,
3030
getConfiguration,
31-
SEPOLIA_CHAIN_ID,
32-
USDC_TOKEN
31+
USDC_TOKEN_ADDRESS_BASE
3332
} from '../../utils/config.js'
3433
import { C2DEngine } from './compute_engine_base.js'
3534
import { C2DDatabase } from '../database/C2DDatabase.js'
@@ -64,7 +63,8 @@ import { Service } from '@oceanprotocol/ddo-js'
6463
import { getOceanTokenAddressForChain } from '../../utils/address.js'
6564
import { dockerRegistrysAuth, dockerRegistryAuth } from '../../@types/OceanNode.js'
6665
import { EncryptMethod } from '../../@types/fileObject.js'
67-
import { ZeroAddress } from 'ethers'
66+
import { getAddress, ZeroAddress } from 'ethers'
67+
import { AccessList } from '../../@types/AccessList.js'
6868

6969
const C2D_CONTAINER_UID = 1000
7070
const C2D_CONTAINER_GID = 1000
@@ -91,7 +91,6 @@ export class C2DEngineDocker extends C2DEngine {
9191
private trivyCachePath: string
9292
private cpuAllocations: Map<string, number[]> = new Map()
9393
private envCpuCoresMap: Map<string, number[]> = new Map()
94-
private enableNetwork: boolean
9594

9695
public constructor(
9796
clusterConfig: C2DClusterInfo,
@@ -115,7 +114,7 @@ export class C2DEngineDocker extends C2DEngine {
115114
this.paymentClaimInterval = clusterConfig.connection.paymentClaimInterval || 3600 // 1 hour
116115
this.scanImages = clusterConfig.connection.scanImages || false // default is not to scan images for now, until it's prod ready
117116
this.scanImageDBUpdateInterval = clusterConfig.connection.scanImageDBUpdateInterval
118-
this.enableNetwork = clusterConfig.connection.enableNetwork ?? false
117+
119118
if (
120119
clusterConfig.connection.protocol &&
121120
clusterConfig.connection.host &&
@@ -210,16 +209,11 @@ export class C2DEngineDocker extends C2DEngine {
210209
}
211210
const gpuResources: ComputeResource[] = Array.from(gpuMap.values())
212211

213-
const benchmarkPrices: ComputeResourcesPricingInfo[] = gpuResources.map((gpu) => ({
214-
id: gpu.id,
215-
price: 1
216-
}))
217-
218-
const sepoliaChainId = SEPOLIA_CHAIN_ID
219-
const usdcToken = USDC_TOKEN
212+
const benchmarkPrices: ComputeResourcesPricingInfo[] =
213+
gpuResources.length > 0 ? [{ id: gpuResources[0].id, price: 1 }] : []
220214

221215
const benchmarkFees: ComputeEnvFeesStructure = {
222-
[sepoliaChainId]: [{ feeToken: usdcToken, prices: benchmarkPrices }]
216+
[BASE_CHAIN_ID]: [{ feeToken: USDC_TOKEN_ADDRESS_BASE, prices: benchmarkPrices }]
223217
}
224218

225219
const benchmarkEnv: C2DEnvironmentConfig = {
@@ -234,10 +228,13 @@ export class C2DEngineDocker extends C2DEngine {
234228
...gpuResources
235229
],
236230
access: {
237-
addresses: [BENCHMARK_MONITORING_ADDRESS],
238-
accessLists: null
231+
addresses: [],
232+
accessLists: [
233+
{ [BASE_CHAIN_ID]: [getAddress('0xcb7Db55Ca9Aa9C3b25F5Bc266da63317fa02086a')] }
234+
]
239235
},
240-
fees: benchmarkFees
236+
fees: benchmarkFees,
237+
enableNetwork: true
241238
}
242239

243240
envConfig.environments.push(benchmarkEnv)
@@ -286,7 +283,13 @@ export class C2DEngineDocker extends C2DEngine {
286283
const consumerAddress = this.getKeyManager().getEthAddress()
287284

288285
if (config.enableBenchmark) {
289-
this.createBenchmarkEnvironment(sysinfo, envConfig)
286+
if (supportedChains.includes(parseInt(BASE_CHAIN_ID))) {
287+
this.createBenchmarkEnvironment(sysinfo, envConfig)
288+
} else {
289+
CORE_LOGGER.warn(
290+
`Skipping benchmark environment: Base chain (${BASE_CHAIN_ID}) is not in supportedNetworks`
291+
)
292+
}
290293
}
291294

292295
for (let envIdx = 0; envIdx < envConfig.environments.length; envIdx++) {
@@ -362,7 +365,8 @@ export class C2DEngineDocker extends C2DEngine {
362365
queMaxWaitTime: 0,
363366
queMaxWaitTimeFree: 0,
364367
runMaxWaitTime: 0,
365-
runMaxWaitTimeFree: 0
368+
runMaxWaitTimeFree: 0,
369+
enableNetwork: envDef.enableNetwork
366370
}
367371

368372
if (envDef.storageExpiry !== undefined) env.storageExpiry = envDef.storageExpiry
@@ -403,9 +407,16 @@ export class C2DEngineDocker extends C2DEngine {
403407
for (const env of this.envs) {
404408
const cpuRes = this.getResource(env.resources ?? [], 'cpu')
405409
if (cpuRes && cpuRes.total > 0) {
406-
const isBenchmarkEnv = env.access?.addresses?.includes(
407-
BENCHMARK_MONITORING_ADDRESS
408-
)
410+
let isBenchmarkEnv = false
411+
if (env.access?.accessLists) {
412+
const baseAccessList = env.access?.accessLists?.[0] as AccessList
413+
if (baseAccessList && baseAccessList[BASE_CHAIN_ID]) {
414+
isBenchmarkEnv = baseAccessList[BASE_CHAIN_ID].includes(
415+
getAddress('0xcb7Db55Ca9Aa9C3b25F5Bc266da63317fa02086a')
416+
)
417+
}
418+
}
419+
409420
if (isBenchmarkEnv) {
410421
const total = physicalCpuCount > 0 ? physicalCpuCount : cpuRes.total
411422
const cores = Array.from({ length: total }, (_, i) => i)
@@ -1824,7 +1835,7 @@ export class C2DEngineDocker extends C2DEngine {
18241835
}
18251836
]
18261837
}
1827-
if (!this.enableNetwork) {
1838+
if (!env.enableNetwork) {
18281839
hostConfig.NetworkMode = 'none' // no network inside the container
18291840
}
18301841
// disk

src/components/core/handler/persistentStorage.ts

Lines changed: 6 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,7 @@ function requirePersistentStorage(handler: CommandHandler): PersistentStorageFac
3737

3838
export class PersistentStorageCreateBucketHandler extends CommandHandler {
3939
validate(command: PersistentStorageCreateBucketCommand): ValidateParams {
40-
const base = validateCommandParameters(command, [
41-
'consumerAddress',
42-
'signature',
43-
'nonce',
44-
'accessLists'
45-
])
40+
const base = validateCommandParameters(command, ['accessLists'])
4641
if (!base.valid) return base
4742
if (!Array.isArray(command.accessLists)) {
4843
return buildInvalidRequestMessage(
@@ -115,12 +110,7 @@ export class PersistentStorageCreateBucketHandler extends CommandHandler {
115110

116111
export class PersistentStorageGetBucketsHandler extends CommandHandler {
117112
validate(command: PersistentStorageGetBucketsCommand): ValidateParams {
118-
const base = validateCommandParameters(command, [
119-
'consumerAddress',
120-
'signature',
121-
'nonce',
122-
'owner'
123-
])
113+
const base = validateCommandParameters(command, ['owner'])
124114
if (!base.valid) return base
125115
if (!command.owner || typeof command.owner !== 'string') {
126116
return buildInvalidRequestMessage(
@@ -177,12 +167,7 @@ export class PersistentStorageGetBucketsHandler extends CommandHandler {
177167

178168
export class PersistentStorageListFilesHandler extends CommandHandler {
179169
validate(command: PersistentStorageListFilesCommand): ValidateParams {
180-
const base = validateCommandParameters(command, [
181-
'consumerAddress',
182-
'signature',
183-
'nonce',
184-
'bucketId'
185-
])
170+
const base = validateCommandParameters(command, ['bucketId'])
186171
if (!base.valid) return base
187172
if (!command.bucketId || typeof command.bucketId !== 'string') {
188173
return buildInvalidRequestMessage('Invalid parameter: "bucketId" must be a string')
@@ -226,13 +211,7 @@ export class PersistentStorageListFilesHandler extends CommandHandler {
226211

227212
export class PersistentStorageGetFileObjectHandler extends CommandHandler {
228213
validate(command: PersistentStorageGetFileObjectCommand): ValidateParams {
229-
const base = validateCommandParameters(command, [
230-
'consumerAddress',
231-
'signature',
232-
'nonce',
233-
'bucketId',
234-
'fileName'
235-
])
214+
const base = validateCommandParameters(command, ['bucketId', 'fileName'])
236215
if (!base.valid) return base
237216
return { valid: true }
238217
}
@@ -280,13 +259,7 @@ export class PersistentStorageGetFileObjectHandler extends CommandHandler {
280259

281260
export class PersistentStorageUploadFileHandler extends CommandHandler {
282261
validate(command: PersistentStorageUploadFileCommand): ValidateParams {
283-
const base = validateCommandParameters(command, [
284-
'consumerAddress',
285-
'signature',
286-
'nonce',
287-
'bucketId',
288-
'fileName'
289-
])
262+
const base = validateCommandParameters(command, ['bucketId', 'fileName'])
290263
if (!base.valid) return base
291264
return { valid: true }
292265
}
@@ -338,13 +311,7 @@ export class PersistentStorageUploadFileHandler extends CommandHandler {
338311

339312
export class PersistentStorageDeleteFileHandler extends CommandHandler {
340313
validate(command: PersistentStorageDeleteFileCommand): ValidateParams {
341-
const base = validateCommandParameters(command, [
342-
'consumerAddress',
343-
'signature',
344-
'nonce',
345-
'bucketId',
346-
'fileName'
347-
])
314+
const base = validateCommandParameters(command, ['bucketId', 'fileName'])
348315
if (!base.valid) return base
349316
return { valid: true }
350317
}

src/components/httpRoutes/commands.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,23 @@ directCommandRoute.post(
106106
res.end()
107107
} else if (hasP2PInterface) {
108108
// Remote command - use P2P sendTo
109+
let { multiAddrs } = req.body
110+
if (typeof multiAddrs === 'string') {
111+
if (multiAddrs.startsWith('[')) {
112+
try {
113+
const parsed = JSON.parse(multiAddrs)
114+
multiAddrs = Array.isArray(parsed) ? parsed : [multiAddrs]
115+
} catch {
116+
multiAddrs = [multiAddrs]
117+
}
118+
} else {
119+
multiAddrs = [multiAddrs]
120+
}
121+
}
122+
109123
const response = await req.oceanNode
110124
.getP2PNode()
111-
.sendTo(req.body.node as string, JSON.stringify(req.body), req.body.multiAddrs)
125+
.sendTo(req.body.node as string, JSON.stringify(req.body), multiAddrs)
112126

113127
res.status(response.status.httpStatus)
114128
if (response.status.headers) {

src/utils/config/constants.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ export const ENV_TO_CONFIG_MAPPING = {
7676
// Configuration defaults
7777
export const DEFAULT_RATE_LIMIT_PER_MINUTE = 30
7878
export const DEFAULT_MAX_CONNECTIONS_PER_MINUTE = 60 * 2 // 120 requests per minute
79-
export const BENCHMARK_MONITORING_ADDRESS = '0xC5ea7916f95D5a087A644f1Dc0f7d19955eC446F'
8079
export const SEPOLIA_CHAIN_ID = '11155111'
80+
export const BASE_CHAIN_ID = '8453'
8181
export const USDC_TOKEN = '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238'
82+
export const USDC_TOKEN_ADDRESS_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
8283

8384
export const DEFAULT_BOOTSTRAP_ADDRESSES = [
8485
// OPF nodes

src/utils/config/schemas.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,8 @@ export const C2DEnvironmentConfigSchema = z
235235
})
236236
.optional(),
237237
free: ComputeEnvironmentFreeOptionsSchema.optional(),
238-
resources: z.array(ComputeResourceSchema).optional()
238+
resources: z.array(ComputeResourceSchema).optional(),
239+
enableNetwork: z.boolean().optional().default(false)
239240
})
240241
.refine(
241242
(data) =>
@@ -270,7 +271,6 @@ export const C2DDockerConfigSchema = z.array(
270271
imageCleanupInterval: z.number().int().min(3600).optional().default(86400), // min 1 hour, default 24 hours
271272
scanImages: z.boolean().optional().default(false),
272273
scanImageDBUpdateInterval: z.number().int().min(3600).optional().default(43200), // default 43200 (12 hours)
273-
enableNetwork: z.boolean().optional().default(false),
274274
environments: z.array(C2DEnvironmentConfigSchema).min(1)
275275
})
276276
)

0 commit comments

Comments
 (0)