Eclipse 数据空间组件-EDCSample 操作样例 Transfer 合同谈判-3

按照EDC/Samples/Transfer/Transfer1/README 的 步骤进行操作。

  • 创建提供商资产(要共享的数据)
  • 在提供商处创建访问策略
  • 在提供商中创建合同定义
  • 然后,消费者发送合同谈判

一、以下在provider端操作

1、注册资产

在provider中创建一个资产。

bash 复制代码
curl -d @transfer/transfer-01-negotiation/resources/create-asset.json \
  -H 'content-type: application/json' http://localhost:19193/management/v3/assets \
  -s jq

该文件是使用curl 命令的 -data 选项传递的。内容如下。

scss 复制代码
{
  "@context": {
    "@vocab": "https://w3id.org/edc/v0.0.1/ns/"
  },
  "@id": "assetId",
  "properties": {
    "name": "product description",
    "contenttype": "application/json"
  },
  "dataAddress": {
    "type": "HttpData",
    "name": "Test asset",
    "baseUrl": "https://jsonplaceholder.typicode.com/users",
    "proxyPath": "true"
  }
}
2、策略定义。

在provider中注册访问策略。

bash 复制代码
curl -d @transfer/transfer-01-negotiation/resources/create-policy.json \
  -H 'content-type: application/json' http://localhost:19193/management/v3/policydefinitions \
  -s  jq

传递的文件内容如下:

less 复制代码
{
  "@context": {
    "@vocab": "https://w3id.org/edc/v0.0.1/ns/",
    "odrl": "http://www.w3.org/ns/odrl/2/"
  },
  "@id": "aPolicy",
  "policy": {
    "@context": "http://www.w3.org/ns/odrl.jsonld",
    "@type": "Set",
    "permission": [],
    "prohibition": [],
    "obligation": []
  }
}

该政策似乎是空的。顺便说一下,响应如下所示:

scss 复制代码
{
  "@type": "IdResponse",
  "@id": "aPolicy",
  "createdAt": 1724662296875,
  "@context": {
    "@vocab": "https://w3id.org/edc/v0.0.1/ns/",
    "edc": "https://w3id.org/edc/v0.0.1/ns/",
    "odrl": "http://www.w3.org/ns/odrl/2/"
  }
}
3、创建合同定义。

在provider中创建合同定义。

bash 复制代码
curl -d @transfer/transfer-01-negotiation/resources/create-contract-definition.json \
  -H 'content-type: application/json' http://localhost:19193/management/v3/contractdefinitions \
  -s   jq

传递的文件内容如下:

less 复制代码
{
  "@context": {
    "@vocab": "https://w3id.org/edc/v0.0.1/ns/"
  },
  "@id": "1",
  "accessPolicyId": "aPolicy",
  "contractPolicyId": "aPolicy",
  "assetsSelector": []
}

二、以下在consumer端操作

从消费者处获取目录信息。
arduino 复制代码
 
curl -X POST "http://localhost:29193/management/v3/catalog/request" \
    -H 'Content-Type: application/json' \
    -d @transfer/transfer-01-negotiation/resources/fetch-catalog.json -s   jq
 

您获得的目录。以下获取的数据与官方样例数据不一致、此处获得的是HttpData-PUL。 参考以下返回数据,它是在 DCAT 中定义的。标明了ODRL中定义的策略的ID等,还包括通过HttpData进行数据共享的信息和服务信息。

以下代码中"@id": "MQ==:YXNzZXRJZA==:Y2ZmODc1NmYtYTRjMC00NzMxLWJlNTItM2M2ZTVlMGI2YzA3",再后续代码中会用到

scss 复制代码
{
  "@id": "4ce1bc3d-ce1e-4308-b03e-b6596958a69d",
  "@type": "dcat:Catalog",
  "dcat:dataset": {
    "@id": "assetId",
    "@type": "dcat:Dataset",
    "odrl:hasPolicy": {
      "@id": "MQ==:YXNzZXRJZA==:Y2ZmODc1NmYtYTRjMC00NzMxLWJlNTItM2M2ZTVlMGI2YzA3",
      "@type": "odrl:Offer",
      "odrl:permission": [],
      "odrl:prohibition": [],
      "odrl:obligation": []
    },
    "dcat:distribution": [
      {
        "@type": "dcat:Distribution",
        "dct:format": {
          "@id": "HttpData-PULL"
        },
        "dcat:accessService": {
          "@id": "bb73ab52-bd72-448d-9629-8a21624b0577",
          "@type": "dcat:DataService",
          "dcat:endpointDescription": "dspace:connector",
          "dcat:endpointUrl": "http://localhost:19194/protocol",
          "dct:terms": "dspace:connector",
          "dct:endpointUrl": "http://localhost:19194/protocol"
        }
      },
      {
        "@type": "dcat:Distribution",
        "dct:format": {
          "@id": "HttpData-PUSH"
        },
        "dcat:accessService": {
          "@id": "bb73ab52-bd72-448d-9629-8a21624b0577",
          "@type": "dcat:DataService",
          "dcat:endpointDescription": "dspace:connector",
          "dcat:endpointUrl": "http://localhost:19194/protocol",
          "dct:terms": "dspace:connector",
          "dct:endpointUrl": "http://localhost:19194/protocol"
        }
      }
    ],
    "name": "product description",
    "id": "assetId",
    "contenttype": "application/json"
  },
  "dcat:distribution": [],
  "dcat:service": {
    "@id": "bb73ab52-bd72-448d-9629-8a21624b0577",
    "@type": "dcat:DataService",
    "dcat:endpointDescription": "dspace:connector",
    "dcat:endpointUrl": "http://localhost:19194/protocol",
    "dct:terms": "dspace:connector",
    "dct:endpointUrl": "http://localhost:19194/protocol"
  },
  "dspace:participantId": "provider",
  "participantId": "provider",
  "@context": {
    "@vocab": "https://w3id.org/edc/v0.0.1/ns/",
    "edc": "https://w3id.org/edc/v0.0.1/ns/",
    "dcat": "http://www.w3.org/ns/dcat#",
    "dct": "http://purl.org/dc/terms/",
    "odrl": "http://www.w3.org/ns/odrl/2/",
    "dspace": "https://w3id.org/dspace/v0.8/"
  }
}
消费者与提供商之间开始进行合同谈判。

总体流程如下。

  1. 消费者发送合同要约。
  2. 提供商根据自己的报价来验证收到的报价。
  3. 提供商发送同意或拒绝的消息。
  4. 如果验证成功,则保存协议。
谈判合同

为了请求任何数据,需要协商合同,并且提供商和消费者之间必须协商达成协议。

消费者现在需要与提供商启动合同谈判序列。该序列如下所示:

  1. 消费者向提供商发送合同要约(目前,这必须与提供商的要约相同!
  2. 提供商根据自己的报价验证收到的报价
  3. 根据验证结果,提供商可以发送同意或拒绝
  4. 如果验证成功,提供商和消费者将存储收到的协议以供日后参考

当然,这是最简单的谈判顺序。稍后,除了确认或拒绝报价外,两个连接器还可以发送反报价。

请将文件negotiate-contract.json 中的{{contract-offer-id}}中的占位符替为您在路径目录中找到的合同报价 ID dcat:dataset.odrl:hasPolicy.@id。 将{{contract-offer-id}}替换为MQ==:YXNzZXRJZA==:Y2ZmODc1NmYtYTRjMC00NzMxLWJlNTItM2M2ZTVlMGI2YzA3

执行命令

bash 复制代码
curl -d @transfer/transfer-01-negotiation/resources/negotiate-contract.json \
  -X POST -H 'content-type: application/json' http://localhost:29193/management/v3/contractnegotiations \
  -s  jq

示例输出:

perl 复制代码
{
  ...
  "@id": "254015f3-5f1e-4a59-9ad9-bf0e42d4819e",
  "createdAt": 1685525281848,
  ...
}

获取合同协议编号

调用端点启动合同协商后,我们会得到一个 UUID 作为响应。此 UUID 是消费者和提供商之间正在进行的合同协商的 ID。提供商和消费者之间的协商序列由状态机在后台异步执行。一旦提供商和消费者都达到confirmeddeclined 状态,协商就完成了。现在,我们可以使用 UUID 通过消费者端的端点检查协商的当前状态。 以下的{{contract-negotiation-id}}替换为 254015f3-5f1e-4a59-9ad9-bf0e42d4819e

执行命令

css 复制代码
curl -X GET "http://localhost:29193/management/v3/contractnegotiations/{{contract-negotiation-id}}" \
    --header 'Content-Type: application/json' \
    -s  jq

如下图所示,可以看到已经Finalized了。:

scss 复制代码
{
  "@type": "ContractNegotiation",
  "@id": "5ca21b82-075b-4682-add8-c26c9a2ced67",
  "type": "CONSUMER",
  "protocol": "dataspace-protocol-http",
  "state": "FINALIZED",
  "counterPartyAddress": "http://localhost:19194/protocol",
  "callbackAddresses": [],
  "contractAgreementId": "0b3150be-feaf-43bc-91e1-90f050de28bd",  <---------
  "@context": {
    "@vocab": "https://w3id.org/edc/v0.0.1/ns/",
    "dct": "https://purl.org/dc/terms/",
    "dcat": "https://www.w3.org/ns/dcat/",
    "odrl": "http://www.w3.org/ns/odrl/2/",
    "dspace": "https://w3id.org/dspace/v0.8/"
  }
}

至此,合约协商已成功完成。连接器现在已准备好进入数据传输阶段。记下contractAgreementId。您将在下一章中需要它。

相关推荐
汪子熙10 分钟前
浅谈笔者对 AI 技术降低软件项目开发成本的一些思考
后端
IT-ZXT88816 分钟前
Spring 框架之IOC容器加载重要组件
java·后端·spring
用户67570498850219 分钟前
HTTP2.0 从原理到实践,保证把你治得服服帖帖!
后端
noravinsc1 小时前
django paramiko 跳转登录
后端·python·django
声声codeGrandMaster1 小时前
Django之表格上传
后端·python·django
ghie90901 小时前
SpringCloud-基于SpringAMQP实现消息队列
后端·spring cloud·ruby
程序员葵安1 小时前
【Java Web】9.Maven高级
java·数据库·后端·maven
程序员爱钓鱼2 小时前
Go 并发编程基础:通道(Channel)的使用
后端·google·go
FogLetter2 小时前
JavaScript 内存探秘:栈与堆的奇幻之旅
javascript·后端
GoGeekBaird2 小时前
69天探索操作系统-第69天:高级进程调度:实时和基于优先级的任务管理技术
后端·操作系统