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

相关推荐
字节源流7 分钟前
springboot单体项目的执行流程
java·spring boot·后端
豌豆花下猫9 小时前
uv全功能更新:统一管理Python项目、工具、脚本和环境的终极解决方案
后端·python·ai
深度物联网9 小时前
Spring Boot多模块划分设计
java·spring boot·后端
YUELEI11810 小时前
spring cloud 与 cloud alibaba 版本对照表
后端·spring·spring cloud
小杜-coding14 小时前
黑马点评day02(缓存)
java·spring boot·redis·后端·spring·maven·mybatis
程序员小刚15 小时前
基于SpringBoot + Vue 的火车票订票系统
vue.js·spring boot·后端
fanTuanye16 小时前
【SpringBoot篇】详解短信验证码登录功能实现
spring boot·后端
DonciSacer17 小时前
第一章-Rust入门
开发语言·后端·rust
西京刀客17 小时前
golang常用库之-标准库text/template
开发语言·后端·golang
[email protected]18 小时前
ASP.NET Core 请求限速的ActionFilter
后端·asp.net·.netcore