1
0
mirror of https://github.com/oceanprotocol-archive/squid-js.git synced 2024-02-02 15:31:51 +01:00

more DDO structure updates

This commit is contained in:
Matthias Kretschmann 2019-08-16 16:12:42 +02:00
parent b15022a4c1
commit e253e4c0bb
Signed by: m
GPG Key ID: 606EEEF3C479A91F
17 changed files with 77 additions and 71 deletions

View File

@ -77,9 +77,11 @@ describe('Asset Owners', () => {
) )
} catch {} } catch {}
const accessService = ddo.findServiceByType('access')
await ocean.assets.order( await ocean.assets.order(
ddo.id, ddo.id,
ddo.findServiceByType('access').serviceDefinitionId, accessService.index,
account2 account2
) )
// Access granted // Access granted

View File

@ -68,7 +68,7 @@ describe('Consume Asset', () => {
serviceAgreementSignatureResult = await ocean.agreements.prepare( serviceAgreementSignatureResult = await ocean.agreements.prepare(
ddo.id, ddo.id,
accessService.serviceDefinitionId, accessService.index,
consumer consumer
) )
@ -91,7 +91,7 @@ describe('Consume Asset', () => {
const success = await ocean.agreements.create( const success = await ocean.agreements.create(
ddo.id, ddo.id,
serviceAgreementSignatureResult.agreementId, serviceAgreementSignatureResult.agreementId,
accessService.serviceDefinitionId, accessService.index,
serviceAgreementSignatureResult.signature, serviceAgreementSignatureResult.signature,
consumer, consumer,
publisher publisher
@ -115,7 +115,7 @@ describe('Consume Asset', () => {
it('should lock the payment by the consumer', async () => { it('should lock the payment by the consumer', async () => {
const paid = await ocean.agreements.conditions.lockReward( const paid = await ocean.agreements.conditions.lockReward(
serviceAgreementSignatureResult.agreementId, serviceAgreementSignatureResult.agreementId,
ddo.findServiceByType('metadata').metadata.main.price, ddo.findServiceByType('metadata').attributes.main.price,
consumer consumer
) )
@ -162,7 +162,7 @@ describe('Consume Asset', () => {
const path = await ocean.assets.consume( const path = await ocean.assets.consume(
serviceAgreementSignatureResult.agreementId, serviceAgreementSignatureResult.agreementId,
ddo.id, ddo.id,
accessService.serviceDefinitionId, accessService.index,
consumer, consumer,
folder folder
) )
@ -189,7 +189,7 @@ describe('Consume Asset', () => {
const path = await ocean.assets.consume( const path = await ocean.assets.consume(
serviceAgreementSignatureResult.agreementId, serviceAgreementSignatureResult.agreementId,
ddo.id, ddo.id,
accessService.serviceDefinitionId, accessService.index,
consumer, consumer,
folder, folder,
1 1

View File

@ -61,7 +61,7 @@ describe('Consume Asset (Brizo)', () => {
const steps = [] const steps = []
agreementId = await ocean.assets agreementId = await ocean.assets
.order(ddo.id, accessService.serviceDefinitionId, consumer) .order(ddo.id, accessService.index, consumer)
.next(step => steps.push(step)) .next(step => steps.push(step))
assert.isDefined(agreementId) assert.isDefined(agreementId)
@ -75,7 +75,7 @@ describe('Consume Asset (Brizo)', () => {
const path = await ocean.assets.consume( const path = await ocean.assets.consume(
agreementId, agreementId,
ddo.id, ddo.id,
accessService.serviceDefinitionId, accessService.index,
consumer, consumer,
folder folder
) )

View File

@ -59,7 +59,7 @@ xdescribe('Consume Asset (Large size)', () => {
agreementId = await ocean.assets.order( agreementId = await ocean.assets.order(
ddo.id, ddo.id,
accessService.serviceDefinitionId, accessService.index,
consumer consumer
) )
@ -73,7 +73,7 @@ xdescribe('Consume Asset (Large size)', () => {
const path = await ocean.assets.consume( const path = await ocean.assets.consume(
agreementId, agreementId,
ddo.id, ddo.id,
accessService.serviceDefinitionId, accessService.index,
consumer, consumer,
folder folder
) )

View File

@ -46,7 +46,6 @@ describe('Signature', () => {
const did = `did:op:${'c'.repeat(64)}` const did = `did:op:${'c'.repeat(64)}`
const templateId = `0x${'f'.repeat(40)}` const templateId = `0x${'f'.repeat(40)}`
const agreementId = `0x${'e'.repeat(64)}` const agreementId = `0x${'e'.repeat(64)}`
const serviceDefinitionId = '0'
const serviceAgreementTemplate = await templates.escrowAccessSecretStoreTemplate.getServiceAgreementTemplate() const serviceAgreementTemplate = await templates.escrowAccessSecretStoreTemplate.getServiceAgreementTemplate()
@ -55,15 +54,16 @@ describe('Signature', () => {
service: [ service: [
{ {
type: 'access', type: 'access',
index: 0,
purchaseEndpoint: undefined, purchaseEndpoint: undefined,
serviceEndpoint: undefined, serviceEndpoint: undefined,
serviceDefinitionId,
templateId, templateId,
serviceAgreementTemplate serviceAgreementTemplate
} as any, } as any,
{ {
type: 'metadata', type: 'metadata',
metadata: { index: 1,
attributes: {
main: { main: {
price: 10 price: 10
} }
@ -74,7 +74,7 @@ describe('Signature', () => {
const signature = await ocean.utils.agreements.signServiceAgreement( const signature = await ocean.utils.agreements.signServiceAgreement(
ddo, ddo,
serviceDefinitionId, 0,
agreementId, agreementId,
[ [
`0x${'1'.repeat(64)}`, `0x${'1'.repeat(64)}`,

View File

@ -12,11 +12,13 @@ const metadata: Partial<MetaData> = {
files: [ files: [
{ {
index: 0, index: 0,
contentType: 'application/json',
url: url:
'https://raw.githubusercontent.com/oceanprotocol/squid-js/master/package.json' 'https://raw.githubusercontent.com/oceanprotocol/squid-js/master/package.json'
}, },
{ {
index: 1, index: 1,
contentType: 'text/plain',
url: url:
'https://raw.githubusercontent.com/oceanprotocol/squid-js/master/README.md' 'https://raw.githubusercontent.com/oceanprotocol/squid-js/master/README.md'
} }

View File

@ -37,7 +37,7 @@ export class Brizo extends Instantiable {
public getComputeEndpoint( public getComputeEndpoint(
pubKey: string, pubKey: string,
serviceId: string, serviceIndex: number,
_notUsed: string, _notUsed: string,
container: string container: string
) { ) {
@ -47,14 +47,14 @@ export class Brizo extends Instantiable {
public async initializeServiceAgreement( public async initializeServiceAgreement(
did: string, did: string,
serviceAgreementId: string, serviceAgreementId: string,
serviceDefinitionId: string, serviceIndex: number,
signature: string, signature: string,
consumerAddress: string consumerAddress: string
): Promise<any> { ): Promise<any> {
const args = { const args = {
did, did,
serviceAgreementId, serviceAgreementId,
serviceDefinitionId, serviceIndex,
signature, signature,
consumerAddress consumerAddress
} }

View File

@ -63,19 +63,19 @@ export class DDO {
} }
/** /**
* Finds a service of a DDO by ID. * Finds a service of a DDO by index.
* @param {string} serviceDefinitionId Service ID. * @param {number} Service index.
* @return {Service} Service. * @return {Service} Service.
*/ */
public findServiceById<T extends ServiceType>( public findServiceById<T extends ServiceType>(
serviceDefinitionId: string index: number
): Service<T> { ): Service<T> {
if (!serviceDefinitionId) { if (!index) {
throw new Error('serviceDefinitionId not set') throw new Error('index is not set')
} }
const service = this.service.find( const service = this.service.find(
s => s.serviceDefinitionId === serviceDefinitionId s => s.index === index
) )
return service as Service<T> return service as Service<T>
@ -101,8 +101,8 @@ export class DDO {
* @return {string[]} DDO checksum. * @return {string[]} DDO checksum.
*/ */
public getChecksum(): string { public getChecksum(): string {
const { metadata } = this.findServiceByType('metadata') const { attributes } = this.findServiceByType('metadata')
const { files, name, author, license } = metadata.main const { files, name, author, license } = attributes.main
const values = [ const values = [
...(files || []).map(({ checksum }) => checksum).filter(_ => !!_), ...(files || []).map(({ checksum }) => checksum).filter(_ => !!_),
@ -150,11 +150,11 @@ export class DDO {
*/ */
public addChecksum(): void { public addChecksum(): void {
const metadataService = this.findServiceByType('metadata') const metadataService = this.findServiceByType('metadata')
if (metadataService.metadata.main.checksum) { if (metadataService.attributes.main.checksum) {
LoggerInstance.log('Checksum already exists') LoggerInstance.log('Checksum already exists')
return return
} }
metadataService.metadata.main.checksum = this.getChecksum() metadataService.attributes.main.checksum = this.getChecksum()
} }
/** /**

View File

@ -12,7 +12,7 @@ export type ServiceType =
export interface ServiceCommon { export interface ServiceCommon {
type: ServiceType type: ServiceType
serviceDefinitionId?: string index: number
serviceEndpoint?: string serviceEndpoint?: string
} }
@ -23,7 +23,7 @@ export interface ServiceAuthorization extends ServiceCommon {
export interface ServiceMetadata extends ServiceCommon { export interface ServiceMetadata extends ServiceCommon {
type: 'metadata' type: 'metadata'
metadata: MetaData attributes: MetaData
} }
export interface ServiceAccess extends ServiceCommon { export interface ServiceAccess extends ServiceCommon {

View File

@ -59,7 +59,7 @@ export class EscrowAccessSecretStoreTemplate extends AgreementTemplate {
) { ) {
return !!(await this.createFullAgreement( return !!(await this.createFullAgreement(
ddo.shortId(), ddo.shortId(),
ddo.findServiceByType('metadata').metadata.main.price, ddo.findServiceByType('metadata').attributes.main.price,
consumer, consumer,
from, from,
agreementId agreementId
@ -79,7 +79,7 @@ export class EscrowAccessSecretStoreTemplate extends AgreementTemplate {
} = await this.createFullAgreementData( } = await this.createFullAgreementData(
agreementId, agreementId,
ddo.shortId(), ddo.shortId(),
ddo.findServiceByType('metadata').metadata.main.price, ddo.findServiceByType('metadata').attributes.main.price,
consumer consumer
) )
return [ return [

View File

@ -42,13 +42,13 @@ export class OceanAgreements extends Instantiable {
/** /**
* Creates a consumer signature for the specified asset service. * Creates a consumer signature for the specified asset service.
* @param {string} did Decentralized ID. * @param {string} did Decentralized ID.
* @param {string} serviceDefinitionId Service definition ID. * @param {number} index Service index.
* @param {Account} consumer Consumer account. * @param {Account} consumer Consumer account.
* @return {Promise<AgreementPrepareResult>} Agreement ID and signaturee. * @return {Promise<AgreementPrepareResult>} Agreement ID and signaturee.
*/ */
public async prepare( public async prepare(
did: string, did: string,
serviceDefinitionId: string, index: number,
consumer: Account consumer: Account
): Promise<AgreementPrepareResult> { ): Promise<AgreementPrepareResult> {
const d: DID = DID.parse(did as string) const d: DID = DID.parse(did as string)
@ -68,7 +68,7 @@ export class OceanAgreements extends Instantiable {
const signature = await this.ocean.utils.agreements.signServiceAgreement( const signature = await this.ocean.utils.agreements.signServiceAgreement(
ddo, ddo,
serviceDefinitionId, index,
agreementId, agreementId,
agreementConditionsIds, agreementConditionsIds,
consumer consumer
@ -80,21 +80,21 @@ export class OceanAgreements extends Instantiable {
/** /**
* Submit a service agreement to the publisher to create the agreement on-chain. * Submit a service agreement to the publisher to create the agreement on-chain.
* @param {string} did Decentralized ID. * @param {string} did Decentralized ID.
* @param {string} serviceDefinitionId Service definition ID. * @param {number} index Service index.
* @param {Account} consumer Consumer account. * @param {Account} consumer Consumer account.
* @return {Promise<void>} * @return {Promise<void>}
*/ */
public async send( public async send(
did: string, did: string,
agreementId: string, agreementId: string,
serviceDefinitionId: string, index: number,
signature: string, signature: string,
consumer: Account consumer: Account
): Promise<void> { ): Promise<void> {
const result = await this.ocean.brizo.initializeServiceAgreement( const result = await this.ocean.brizo.initializeServiceAgreement(
didPrefixed(did), didPrefixed(did),
zeroX(agreementId), zeroX(agreementId),
serviceDefinitionId, index,
zeroX(signature), zeroX(signature),
consumer.getId() consumer.getId()
) )
@ -112,7 +112,7 @@ export class OceanAgreements extends Instantiable {
* in this method before submitting on-chain. * in this method before submitting on-chain.
* @param {string} did Decentralized ID. * @param {string} did Decentralized ID.
* @param {string} agreementId Service agreement ID. * @param {string} agreementId Service agreement ID.
* @param {string} serviceDefinitionId Service definition ID. * @param {number} index Service index.
* @param {string} signature Service agreement signature. * @param {string} signature Service agreement signature.
* @param {Account} consumer Consumer account. * @param {Account} consumer Consumer account.
* @param {Account} publisher Publisher account. * @param {Account} publisher Publisher account.
@ -121,7 +121,7 @@ export class OceanAgreements extends Instantiable {
public async create( public async create(
did: string, did: string,
agreementId: string, agreementId: string,
serviceDefinitionId: string, index: number,
signature: string, signature: string,
consumer: Account, consumer: Account,
publisher: Account publisher: Account
@ -129,7 +129,7 @@ export class OceanAgreements extends Instantiable {
const d: DID = DID.parse(did) const d: DID = DID.parse(did)
const ddo = await this.ocean.aquarius.retrieveDDO(d) const ddo = await this.ocean.aquarius.retrieveDDO(d)
const templateName = ddo.findServiceById<'access'>(serviceDefinitionId) const templateName = ddo.findServiceById<'access'>(index)
.serviceAgreementTemplate.contractName .serviceAgreementTemplate.contractName
await this.ocean.keeper await this.ocean.keeper
.getTemplateByName(templateName) .getTemplateByName(templateName)
@ -145,9 +145,7 @@ export class OceanAgreements extends Instantiable {
/** /**
* Get the status of a service agreement. * Get the status of a service agreement.
* @param {string} did Decentralized ID.
* @param {string} agreementId Service agreement ID. * @param {string} agreementId Service agreement ID.
* @param {string} serviceDefinitionId Service definition ID.
* @param {boolean} extended Returns a complete status with dependencies. * @param {boolean} extended Returns a complete status with dependencies.
* @return {Promise<any>} * @return {Promise<any>}
*/ */

View File

@ -91,7 +91,7 @@ export class OceanAssets extends Instantiable {
const serviceEndpoint = this.ocean.aquarius.getServiceEndpoint(did) const serviceEndpoint = this.ocean.aquarius.getServiceEndpoint(did)
let serviceDefinitionIdCount = 0 let indexCount = 0
// create ddo itself // create ddo itself
const ddo: DDO = new DDO({ const ddo: DDO = new DDO({
id: did.getDid(), id: did.getDid(),
@ -126,7 +126,7 @@ export class OceanAssets extends Instantiable {
{ {
type: 'metadata', type: 'metadata',
serviceEndpoint, serviceEndpoint,
metadata: { attributes: {
// Default values // Default values
curation: { curation: {
rating: 0, rating: 0,
@ -158,10 +158,10 @@ export class OceanAssets extends Instantiable {
list.findIndex(({ type: t }) => t === type) === i list.findIndex(({ type: t }) => t === type) === i
) )
.reverse() .reverse()
// Adding ID // Adding index
.map(_ => ({ .map(_ => ({
..._, ..._,
serviceDefinitionId: String(serviceDefinitionIdCount++) index: indexCount++
})) as Service[] })) as Service[]
}) })
@ -206,7 +206,7 @@ export class OceanAssets extends Instantiable {
public async consume( public async consume(
agreementId: string, agreementId: string,
did: string, did: string,
serviceDefinitionId: string, serviceIndex: number,
consumerAccount: Account, consumerAccount: Account,
resultPath: string, resultPath: string,
index?: number, index?: number,
@ -216,7 +216,7 @@ export class OceanAssets extends Instantiable {
public async consume( public async consume(
agreementId: string, agreementId: string,
did: string, did: string,
serviceDefinitionId: string, serviceIndex: number,
consumerAccount: Account, consumerAccount: Account,
resultPath?: undefined | null, resultPath?: undefined | null,
index?: number, index?: number,
@ -226,18 +226,18 @@ export class OceanAssets extends Instantiable {
public async consume( public async consume(
agreementId: string, agreementId: string,
did: string, did: string,
serviceDefinitionId: string, serviceIndex: number,
consumerAccount: Account, consumerAccount: Account,
resultPath?: string, resultPath?: string,
index: number = -1, index: number = -1,
useSecretStore?: boolean useSecretStore?: boolean
): Promise<string | true> { ): Promise<string | true> {
const ddo = await this.resolve(did) const ddo = await this.resolve(did)
const { metadata } = ddo.findServiceByType('metadata') const { attributes } = ddo.findServiceByType('metadata')
const accessService = ddo.findServiceById(serviceDefinitionId) const accessService = ddo.findServiceById(serviceIndex)
const { files } = metadata.main const { files } = attributes.main
const { serviceEndpoint } = accessService const { serviceEndpoint } = accessService
@ -250,7 +250,7 @@ export class OceanAssets extends Instantiable {
this.logger.log('Consuming files') this.logger.log('Consuming files')
resultPath = resultPath resultPath = resultPath
? `${resultPath}/datafile.${ddo.shortId()}.${serviceDefinitionId}/` ? `${resultPath}/datafile.${ddo.shortId()}.${serviceIndex}/`
: undefined : undefined
if (!useSecretStore) { if (!useSecretStore) {
@ -265,7 +265,7 @@ export class OceanAssets extends Instantiable {
} else { } else {
const files = await this.ocean.secretStore.decrypt( const files = await this.ocean.secretStore.decrypt(
did, did,
ddo.findServiceByType('metadata').metadata.main.encryptedFiles, ddo.findServiceByType('metadata').attributes.main.encryptedFiles,
consumerAccount, consumerAccount,
ddo.findServiceByType('authorization').serviceEndpoint ddo.findServiceByType('authorization').serviceEndpoint
) )
@ -288,13 +288,13 @@ export class OceanAssets extends Instantiable {
* Start the purchase/order of an asset's service. Starts by signing the service agreement * Start the purchase/order of an asset's service. Starts by signing the service agreement
* then sends the request to the publisher via the service endpoint (Brizo http service). * then sends the request to the publisher via the service endpoint (Brizo http service).
* @param {string} did Decentralized ID. * @param {string} did Decentralized ID.
* @param {string} serviceDefinitionId Service definition ID. * @param {number} index Service index.
* @param {Account} consumer Consumer account. * @param {Account} consumer Consumer account.
* @return {Promise<string>} Returns Agreement ID * @return {Promise<string>} Returns Agreement ID
*/ */
public order( public order(
did: string, did: string,
serviceDefinitionId: string, index: number,
consumer: Account consumer: Account
): SubscribablePromise<OrderProgressStep, string> { ): SubscribablePromise<OrderProgressStep, string> {
return new SubscribablePromise(async observer => { return new SubscribablePromise(async observer => {
@ -316,7 +316,7 @@ export class OceanAssets extends Instantiable {
this.logger.log('Agreement initialized') this.logger.log('Agreement initialized')
observer.next(OrderProgressStep.AgreementInitialized) observer.next(OrderProgressStep.AgreementInitialized)
const { metadata } = ddo.findServiceByType('metadata') const { attributes } = ddo.findServiceByType('metadata')
this.logger.log('Locking payment') this.logger.log('Locking payment')
@ -327,7 +327,7 @@ export class OceanAssets extends Instantiable {
observer.next(OrderProgressStep.LockingPayment) observer.next(OrderProgressStep.LockingPayment)
const paid = await oceanAgreements.conditions.lockReward( const paid = await oceanAgreements.conditions.lockReward(
agreementId, agreementId,
metadata.main.price, attributes.main.price,
consumer consumer
) )
observer.next(OrderProgressStep.LockedPayment) observer.next(OrderProgressStep.LockedPayment)
@ -352,7 +352,7 @@ export class OceanAssets extends Instantiable {
await oceanAgreements.create( await oceanAgreements.create(
did, did,
agreementId, agreementId,
serviceDefinitionId, index,
undefined, undefined,
consumer, consumer,
consumer consumer

View File

@ -13,12 +13,12 @@ export class ServiceAgreement extends Instantiable {
public async signServiceAgreement( public async signServiceAgreement(
ddo: DDO, ddo: DDO,
serviceDefinitionId: string, index: number,
serviceAgreementId: string, serviceAgreementId: string,
agreementConditionsIds: string[], agreementConditionsIds: string[],
consumer: Account consumer: Account
): Promise<string> { ): Promise<string> {
const service = ddo.findServiceById<'access'>(serviceDefinitionId) const service = ddo.findServiceById<'access'>(index)
const timelockValues: number[] = this.getTimeValuesFromService( const timelockValues: number[] = this.getTimeValuesFromService(
service, service,
'timelock' 'timelock'

View File

@ -13,7 +13,7 @@ function fillParameterWithDDO(
case 'amount': case 'amount':
case 'price': case 'price':
return String( return String(
ddo.findServiceByType('metadata').metadata.main.price ddo.findServiceByType('metadata').attributes.main.price
) )
case 'assetId': case 'assetId':
case 'documentId': case 'documentId':

View File

@ -88,9 +88,10 @@ describe('DDO', () => {
}, },
{ {
type: 'metadata', type: 'metadata',
index: 0,
serviceEndpoint: serviceEndpoint:
'http://myaquarius.org/api/v1/provider/assets/metadata/{did}', 'http://myaquarius.org/api/v1/provider/assets/metadata/{did}',
metadata: { attributes: {
main: { main: {
name: 'UK Weather information 2011', name: 'UK Weather information 2011',
type: 'dataset', type: 'dataset',
@ -104,16 +105,19 @@ describe('DDO', () => {
index: 0, index: 0,
checksum: 'efb2c764274b745f5fc37f97c6b0e761', checksum: 'efb2c764274b745f5fc37f97c6b0e761',
contentLength: 4535431, contentLength: 4535431,
contentType: 'application/json',
resourceId: resourceId:
'access-log2018-02-13-15-17-29-18386C502CAEA932' 'access-log2018-02-13-15-17-29-18386C502CAEA932'
}, },
{ {
index: 1, index: 1,
checksum: '085340abffh21495345af97c6b0e761', checksum: '085340abffh21495345af97c6b0e761',
contentLength: 12324 contentLength: 12324,
contentType: 'application/json'
}, },
{ {
index: 2 index: 2,
contentType: ''
} }
], ],
checksum: '' checksum: ''

View File

@ -4,7 +4,7 @@ export default class BrizoMock extends Brizo {
public async initializeServiceAgreement( public async initializeServiceAgreement(
did: string, did: string,
serviceAgreementId: string, serviceAgreementId: string,
serviceDefinitionId: string, index: number,
signature: string, signature: string,
consumerPublicKey: string consumerPublicKey: string
): Promise<any> { ): Promise<any> {

View File

@ -40,7 +40,7 @@
"service": [ "service": [
{ {
"type": "access", "type": "access",
"serviceDefinitionId": "0", "index": 0,
"serviceEndpoint": "http://mybrizo.org/api/v1/brizo/services/consume?pubKey=${pubKey}&serviceId={serviceId}&url={url}", "serviceEndpoint": "http://mybrizo.org/api/v1/brizo/services/consume?pubKey=${pubKey}&serviceId={serviceId}&url={url}",
"purchaseEndpoint": "http://mybrizo.org/api/v1/brizo/services/access/purchase?", "purchaseEndpoint": "http://mybrizo.org/api/v1/brizo/services/access/purchase?",
"templateId": "044852b2a670ade5407e78fb2863c51000000000000000000000000000000000", "templateId": "044852b2a670ade5407e78fb2863c51000000000000000000000000000000000",
@ -145,16 +145,16 @@
}, },
{ {
"type": "compute", "type": "compute",
"serviceDefinitionId": "1", "index": 1,
"serviceEndpoint": "http://mybrizo.org/api/v1/brizo/services/compute?pubKey=${pubKey}&serviceId={serviceId}&algo={algo}&container={container}", "serviceEndpoint": "http://mybrizo.org/api/v1/brizo/services/compute?pubKey=${pubKey}&serviceId={serviceId}&algo={algo}&container={container}",
"templateId": "044852b2a670ade5407e78fb2863c51000000000000000000000000000000002" "templateId": "044852b2a670ade5407e78fb2863c51000000000000000000000000000000002"
}, },
{ {
"type": "metadata", "type": "metadata",
"serviceDefinitionId": "2", "index": 2,
"serviceEndpoint": "http://myaquarius.org/api/v1/provider/assets/metadata/{did}", "serviceEndpoint": "http://myaquarius.org/api/v1/provider/assets/metadata/{did}",
"metadata": { "attributes": {
"base": { "main": {
"name": "UK Weather information 2011", "name": "UK Weather information 2011",
"type": "dataset", "type": "dataset",
"dateCreated": "2012-10-10T17:00:000Z", "dateCreated": "2012-10-10T17:00:000Z",