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

相关推荐
uzong18 分钟前
技术故障复盘模版
后端
GetcharZp1 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程1 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研1 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi2 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国3 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy3 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack3 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9654 小时前
pip install 已经不再安全
后端
寻月隐君4 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github