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。您将在下一章中需要它。

相关推荐
用户87261824590724 分钟前
JUnit 5的框架介绍
后端
一只小闪闪42 分钟前
langchain4j搭建失物招领系统(六)---实现失物查询功能-RAG使用
java·人工智能·后端
uhakadotcom43 分钟前
大数据处理与消息服务:Kafka、MNS和PySpark的区别与应用
后端·面试·github
夜宵饽饽1 小时前
传输层-MCP的搭建(一)
javascript·后端
雷渊1 小时前
RocketMQ生产者的消息被消费后会永久放在磁盘里吗?
java·后端·面试
拖拉机1 小时前
Python(七)函数
后端·python
uhakadotcom1 小时前
多巴胺:科技产品如何利用它来吸引你
后端·面试·github
春与秋其代序1 小时前
NestJS:打造可扩展 Node.js 后端应用的框架
后端
用户4099322502121 小时前
FastAPI依赖注入性能优化策略
后端·ai编程·trae
uhakadotcom2 小时前
了解指数退避算法:网络应用的必备策略
后端·面试·github