---
# System prepended metadata

title: 'Use Case #1'
tags: [sargasso]

---

NGI Sargasso (Call 2) DPP-CRC project (online: https://hackmd.io/1WuM7GeeSvS7D6qI0V45Sg)
# Use Case #1 - Self-generated EPD in EU

#### Document Structure
* [Description](#Description)
    * [Infrastructure](#Infrastructure)
    * [Identities](#Identities)
    * [Data Models](#Data-Models)
* [Walk-Through](#Walk-Through)
    * [Video Recording](#Video-Recording)
    * [Sequence Diagram](#Sequence-Diagram)
    * [Step-by-Step Process](#Steps)
* [Learnings & Planned Improvements](#Learnings-amp-Planned-Improvements)

## Description
This use case illustrates the process of generating Environmental Product Declarations (EPDs) at a concrete factory and subsequently assembling a building component using multiple concrete deliveries (with attached DPPs referencing the EPDs), culminating in the compilation of a Digital Product Passport (DPP) that integrates data from these multiple concrete sources. 

### Infrastructure
The following technical components are used:
<details><summary><strong>Private Data Store</strong> of a Concrete Producer:<br>stores data to generate EPDs</summary>

  URL: https://cp-private.data-container.net
  ```bash
  # Credentials
  APP_KEY: 5mdPuiwt-H50Ixl2rWRKVPKQMhfdYw5LngK6RwBwZ5c
  APP_SECRET: EFV6OgfmFj73XmAI-4ncU41MLjOACwvIU5jtlWXpFtA
  ```
  Github Repo: https://github.com/OwnYourData/dc-cpprivate
  Docker Image: https://hub.docker.com/r/oydeu/cp-private
</details>

<details><summary><strong>EPD Calc Tool</strong> of a Concrete Producer:<br>computes EPD and accompanying Zero-Knowledge Proof</summary>
  
  URL: https://epd.ownyourdata.eu
  Github Repo: https://github.com/OwnYourData/zk-epd-calc
  Docker Image: https://hub.docker.com/r/oydeu/zk-epd-calc
  
  *Steps for manual testing:*
  * Create EPD:
    ```bash=
    echo '{"description":"C 25/30/B1","cement":15,"gravel":20,"water":25,"additives":30,"material":"super starker Eco++","factory":"Eggendorf"}' | \
    curl -s -H "Content-Type: application/json" -d @- \
         -X POST https://epd.ownyourdata.eu/create
    ```

  * Verify EPD:
    ```bash=
    echo '{"description":"C 25/30/B1","factory":"Eggendorf","A13_gwp":165.4,"zkp":"1234abcd"}' | \
    curl -s -H "Content-Type: application/json" -d @- \
         -X POST https://epd.ownyourdata.eu/verify
    ```

</details>

<details><summary><strong>Private Data Store</strong> of a Construction Site Manager:<br>stores data of concrete deliveries and allows to generate DPPs</summary>

  URL: https://sm-private.data-container.net
  ```bash
  # Credentials
  APP_KEY: qRXhTJVntLIQjKzllLD5gnE33QcVA81LAX1y7VZ7u4E
  APP_SECRET: HV6OflMxRu9MgofNjwmiUTftLVidgzvoaqXXF46_zwc
  ```
  Github Repo: https://github.com/OwnYourData/dc-smprivate
  Docker Image: https://hub.docker.com/r/oydeu/sm-private
</details>

<details><summary><strong>Aggregation Tool</strong> of a Construction Site Manager:<br>aggregates concrete deliveries and accompanying ZKPs</summary>
  
  URL: https://sm-zkp.data-container.net
  Github Repo: https://github.com/OwnYourData/zk-epd-calc
  Docker Image: https://hub.docker.com/r/oydeu/zk-epd-calc
  
</details>

<details><summary><strong>Data Intermediary</strong>: neutral actor <br>stores proof for DPPs and public information</summary>

  URL: https://concrete.go-data.at
  ```bash
  # Credentials
  APP_KEY: nENk5CBuUIQy0e24bewN-WJx8w-FkPUekG9oQtx9N-4
  APP_SECRET: 1oiPZTxbnQyQnl48QsRR9LlsAPFUUVTV5o4aaqZdOIg
  ```
  Github Repo: https://github.com/OwnYourData/dc-intermediary
  Docker Image: https://hub.docker.com/r/oydeu/dc-intermediary
</details>

<details><summary><strong>Sphereon Mobile Wallet</strong>: SSI wallet for Stakeholders<br> signs Verifiable Credentials with private key</summary>
  
  General information: https://sphereon.com/sphereon-products/sphereon-wallet/
  Github: https://github.com/Sphereon-Opensource/mobile-wallet/
</details>

&nbsp;
### Identities
<details><summary><em>Concrete Producer (CP)</em><br>enters Concrete Mixture and creates DPP with EPD</summary>
  
  <ul>
    <li>uses Sphereon Mobile Wallet for signing data</li>
    <li>DID: <code>did:oyd:zQmaS7yYwARSEw3ZEzi5wyfiz78hiBCS9UFaxWstueXxvNU</code><br>(note: will differ based on DID in wallet)</li>
    <li>command: <code>echo '' | oydid create --doc-pwd cppwd --rev-pwd cprev -z 1</code></li>
  </ul>
</details>
<details><summary><em>Construction Site Manager (SM)</em><br>uses concrete deliverables and creates DPP for building parts</summary>
  
  <ul>
    <li>uses Sphereon Mobile Wallet for signing data</li>
    <li>DID: <code>did:oyd:zQmZ83C6BAi5qYRwaAnofAud4ozubFjRhFiyTFe3bDNnARy</code><br>(note: will differ based on DID in wallet)</li>
    <li>command: <code>echo '' | oydid create --doc-pwd smpwd --rev-pwd smrev -z 1</code></li>
  </ul>
</details>
<details><summary><em>Building Owner (BO)</em> <br>verifies DPPs</summary>
    <ul>
      <li>DID: <code>did:oyd:zQme8RBriYQSJFjXd6q559wJeSnMxGmTEgkX9GVdru9aTNh</code></li>
      <li>command: <code>echo '' | oydid create --doc-pwd bopwd --rev-pwd borev -z 1</code></li>
    </ul>
</details>
<details><summary><em>Data Intermediary (DI)</em> <br>public repository that can store data, DIDs, VCs, VPs, DPPs</summary>
    <ul>
      <li>DID: <code>did:oyd:zQmSAxAeWkGDN1xm9eKWq547DTfdFYkgJGjpBs54Q5BqLx8</code></li>
      <li>command: <code>echo '' | oydid create --doc-pwd dipwd --rev-pwd direv -z 1</code></li>
    </ul>
</details>

&nbsp;
### Data Models
* [`ConcreteMixture`](https://soya.ownyourdata.eu/ConcreteMixture/yaml) - ingredients of concrete ([edit](https://soya-form.ownyourdata.eu/?schemaDri=ConcreteMixture&data=%7B%7D) | [example](https://soya-form.ownyourdata.eu/?schemaDri=ConcreteMixture&data=%7B%22description%22%3A%22C+25%2F30%2FB1%22%2C%22cement%22%3A15%2C%22gravel%22%3A20%2C%22water%22%3A25%2C%22additives%22%3A30%2C%22material%22%3A%22super+starker+Eco%2B%2B%22%2C%22factory%22%3A%22Eggendorf%22%7D))
* [`zkEPD`](https://soya.ownyourdata.eu/zkEPD/yaml) - Zero-Knowledge Proof for an EPD ([edit](https://soya-form.ownyourdata.eu/?schemaDri=zkEPD) | [example](https://soya-form.ownyourdata.eu/?schemaDri=zkEPD&data=%7B%22description%22%3A%22C+25%2F30%2FB1%22%2C%22factory%22%3A%22Eggendorf%22%2C%22A13_gwp%22%3A165.4%2C%22zkp%22%3A%221234abcd%22%7D))
* [`ConcreteDPP`](https://soya.ownyourdata.eu/ConcreteDPP/yaml) - Digital Product Passport for concrete ([edit](https://soya-form.ownyourdata.eu/?schemaDri=ConcreteDPP) | [example](https://soya-form.ownyourdata.eu/?schemaDri=ConcreteDPP&data=%7B%22date%22%3A%222024-05-29%22%2C%22epd%22%3A%7B%22description%22%3A%22C+25%2F30%2FB1%22%2C%22factory%22%3A%22Eggendorf%22%2C%22A13_gwp%22%3A165.4%2C%22zkp%22%3A%221234abcd%22%7D%2C%22volume%22%3A1.5%7D))
* [`ConcreteDelivery`](https://soya.ownyourdata.eu/ConcreteDelivery/yaml) - Verifiable Credential for concrete delivery ([edit](https://soya-form.ownyourdata.eu/?schemaDri=ConcreteDelivery) | [example](https://soya-form.ownyourdata.eu/?schemaDri=ConcreteDelivery&data=%7B%22timestamp%22%3A%222024-08-20T18%3A50%3A00%2B02%3A00%22%2C%22batch%22%3A%22did%3Aoyd%3AzQmQht8RJD6vx7nDvqjL8fdYPrTBJvDJui5oQVbW6cYJTw3%22%2C%22volume%22%3A3%2C%22transport%22%3A24.7%2C%22holder%22%3A%22did%3Aoyd%3AzQmZ83C6BAi5qYRwaAnofAud4ozubFjRhFiyTFe3bDNnARy%22%7D))
* [`BuildingPartDefinition`](https://soya.ownyourdata.eu/BuildingPartDefinition/yaml) - list of materials in a building part ([edit](https://soya-form.ownyourdata.eu/?schemaDri=BuildingPartDefinition) | [example](https://soya-form.ownyourdata.eu/?schemaDri=BuildingPartDefinition&data=%7B%22building%22%3A%22Vienna+Central%22%2C%22buildingPartID%22%3A%22West+Wing%22%2C%22date%22%3A%222024-09-08%22%2C%22usedMaterial%22%3A%5B%7B%22amount%22%3A4%2C%22concreteDppDid%22%3A%22did%3Aoyd%3AzQmdV9FowzCHiSzic8mgAohe62Fz7vbQr8q45nHreGN6AE7%22%2C%22select%22%3A%2234+-+2024-09-14%3A+C+25%2F30%2FB1+from+Company+B%22%7D%5D%7D))
* [`ZkBuildingPartEPD`](https://soya.ownyourdata.eu/ZkBuildingPartEPD/yaml) - Zero-Knowledge Proof for aggregated EPDs ([edit](https://soya-form.ownyourdata.eu/?schemaDri=ZkBuildingPartEPD) | [example](https://soya-form.ownyourdata.eu/?schemaDri=ZkBuildingPartEPD&data=%7B%22date%22%3A%222024-09-08%22%2C%22a14_gwp%22%3A123%2C%22building%22%3A%22Vienna+Central%22%2C%22buildingPartID%22%3A%22West+Wing%22%7D))
* [`BuildingPartDPP`](https://soya.ownyourdata.eu/BuildingPartDPP/yaml) - Digital Product passport for building part ([edit](https://soya-form.ownyourdata.eu/?schemaDri=BuildingPartDPP) | [example](https://soya-form.ownyourdata.eu/?schemaDri=BuildingPartDPP&data=%7B%22vp%22%3A%22https%3A%2F%2Fconcrete.go-data.at%2Fpresentations%2FzQm123%22%2C%22did%22%3A%22did%3Aoyd%3A123abc%22%2C%22epd%22%3A%7B%22zkp%22%3A%22abc890%22%2C%22date%22%3A%222024-09-08%22%2C%22a14_gwp%22%3A123%2C%22building%22%3A%22Vienna+Central%22%2C%22building_part_id%22%3A%22West+Wing%22%7D%7D))


    
&nbsp;
## Walk Through
<a id="Video-Recording"></a>Video recording: https://www.loom.com/share/97ffe94afc11406f854a07a44d6b52b2

### Sequence Diagram
```plantuml
@startuml

box "\nServices Concrete Producer" #LightBlue
actor "Concrete\nProducer" as cp
participant "Online\nWallet" as cp_wallet
database "Private\nData Store" as cp_store
participant "Concrete\nEPD Calc" as epd
end box

box "\nServices Construction Manager" #Yellow
actor "Construction\nManager" as cm
participant "Online\nWallet" as cm_wallet
database "Private\nData Store" as cm_store
participant "Building Part\nEPD Calc" as agg
end box

box "\n     Data\nIntermediary"
database " " as disp

box "\nServices Building Onwer\n" #LightGreen
actor "Building\nOwner" as owner
participant "Verification\nTool" as verifier

cp -> cp_store: enter ConcreteMix
cp --> cp_store: trigger EPD calculation
cp_store -> epd: send ConcreteMix
epd -> cp_store: store EPD
cp --> cp_store: trigger DPP creation
cp_store -> cp_store: create\nConcrete DPP
cp_store -> cp_wallet
cp_wallet -> cp_store: sign DPP
cp_store -> disp: publish Concrete DPP
cp_store -> cp_wallet: create\ndelivery VC
cm -> cp_wallet: read concrete delivery VCs
cm -> cm_wallet: store\ndelivery VCs
cm --> cm_store: trigger building part assemly
cm_store -> cm_store: assemble\nbuilding parts
cm_wallet --> cm_store: retrieve data\nfrom delivery VCs
disp --> cm_store: retrieve data from DPPs
cm_store -> agg: send BuildingPart
agg -> cm_store: store Aggregation
cm --> cm_store: trigger DPP creation
cm_store -> cm_store: create\nBuildingPart DPP
cm_store -> cm_wallet
cm_wallet -> cm_store: sign DPP
cm_store -> disp: publish BuildingPart DPP
cm --> owner: provide list of DPPs for building parts
owner --> disp: read\nDPPs
owner -> verifier: validate DPPs\n(incl. ZKP)

@enduml
```

### Steps
1) Concrete Producer (CP) logs into private data store
    * url: https://cp-private.data-container.net/
      App Key: `5mdPuiwt-H50Ixl2rWRKVPKQMhfdYw5LngK6RwBwZ5c`
      App Secret: `EFV6OgfmFj73XmAI-4ncU41MLjOACwvIU5jtlWXpFtA`
    
2) CP creates new record for a `ConcreteMixture`
    * **output:** new record
      example link: https://cp-private.data-container.net/?itemId=176
   
3) CP triggers "Generate EPD" for a "ConcreteMixture" record
    * **input:** record of structure `ConcreteMixture`<br><br>
    * **output:** `zkEPD` record
      example link: https://cp-private.data-container.net/?itemId=177
    * **output:** `ConcreteDPP` record
      example link: https://cp-private.data-container.net/?itemId=178

4) CP triggers "Publish DPP" for a "ConcreteDPP" record
    * **input:** record of structure `ConcreteDPP`
    * enter date+volume
    * click "Publish DPP"<br><br>
    * **outptut:** updated `ConcreteDPP` record with DID and link to VP
      example link: https://cp-private.data-container.net/?itemId=178
      * DID: [`did:oyd:zQmdV9FowzCHiSzic8mgAohe62Fz7vbQr8q45nHreGN6AE7`](https://dev.uniresolver.io/#did:oyd:zQmdV9FowzCHiSzic8mgAohe62Fz7vbQr8q45nHreGN6AE7)
      * Verifiable Presentation: <br><span style="font-size:11px">[`https://concrete.go-data.at/presentations/zQmPSGgZq9WYXh9fxkVFrTbjJKpWxovRkvTfrVjoRjWxbhB`](https://concrete.go-data.at/presentations/zQmPSGgZq9WYXh9fxkVFrTbjJKpWxovRkvTfrVjoRjWxbhB)</span>

5) CP issues Verifiable Credential for `ConcreteDelivery`
    * **input:** enter data for a `ConcreteDelivery` record
      example link: https://cp-private.data-container.net/?itemId=179
    * click "Show Delivery VC"
    * enter URL of online wallet from construction site:
      sm-private.data-container.net
      and click "Go"

6) Construction Site Manager (SM) accepts `ConcreteDelivery` VC
    * select record with schema `ReceivedConcreteDeliveryVCs`
    * click "Accept VC"<br><br>
    * **outptut:** new record `ConcreteDelivery`
      example: https://sm-private.data-container.net/?itemId=18

7) SM assembles concrete deliveries to a `BuildingPartDefinition`
    * **input:** enter data for `BuildingPartDefinition` record
      example link: https://sm-private.data-container.net/?itemId=19

8) Create a ZKP of aggregating the "BuildingPartDefintion"
    * select record with schema `BuildingPartDefintion`
    * click "Aggregate BuildingPart"<br><br>
    * **output:** 
        * new record `ZkBuildingPartEPD`
          example: https://sm-private.data-container.net/?itemId=37
        * new record `BuildingPartDPP`
          example: https://sm-private.data-container.net/?itemId=38

9) SM triggers "Publish DPP" for a `BuildingPartDPP` record
    * **input:** record of structure `BuildingPartDPP`
    * click "Publish DPP<br><br>
    * **outptut:** updated `BuildingPartDPP` record with DID and link to VP
      example link: https://sm-private.data-container.net/?itemId=38
      * DID: [`did:oyd:zQmf6uepGG49ZGsRqy5Vszceuf8xVhMZ7DavMQhgGLMEFkb`](https://dev.uniresolver.io/#did:oyd:zQmf6uepGG49ZGsRqy5Vszceuf8xVhMZ7DavMQhgGLMEFkb)
      * Verifiable Presentation: <br><span style="font-size:11px">[`https://concrete.go-data.at/presentations/zQmfDjqDbDqu3yX93xyK5AeG3d6eS5kpjB8MjNcjvzj7dTG`](https://concrete.go-data.at/presentations/zQmfDjqDbDqu3yX93xyK5AeG3d6eS5kpjB8MjNcjvzj7dTG)</span>

10) Building Owner verifies DPP
    * resolve DID (e.g., with [Uniresolver](https://dev.uniresolver.io/#did:oyd:zQmf6uepGG49ZGsRqy5Vszceuf8xVhMZ7DavMQhgGLMEFkb)) and download data from service endpoint
    * perform the following checks:
      * integrity of Verifiable Presentation
        ```bash=
        curl -s https://concrete.go-data.at/presentations/zQmfDjqDbDqu3yX93xyK5AeG3d6eS5kpjB8MjNcjvzj7dTG | \
        oydid vp-verify
        ```
      * proof of correct calculation of GWP (global warming potential) using ZKP (Zero-Knowledge Proof)
        ```bash=
        curl -s https://concrete.go-data.at/presentations/zQmfDjqDbDqu3yX93xyK5AeG3d6eS5kpjB8MjNcjvzj7dTG | \
        jq '.verifiableCredential[0].credentialSubject' | \
        curl -s -H "Content-Type: application/json" -d @- \
             -X POST https://sm-zkp.data-container.net/verify
        ```

## Learnings & Planned Improvements
**Domain-specific Findings**
* process is too technical and needs focus on added business value for individual stakeholders:
  * *Concrete Producer*: support in court-proof calculating GWP (global warming potential) and providing dynamic EPDs (Environmental Product Declarations) to their customers
  * *Construction Site Manager*: accept EPD in various forms including DPPs (Digital Product Passports) and create provenance records of aggregating this information into DPPs for building parts
  * *Building Owner*: create a web-based tool to verify content and provenance of DPP information
* identify available data and interfaces for involved stakeholders to better develop the business case for a production service
* Identity Management (and specifically SSI - Self Souvereign Identity) are still abstract concepts in the construction industry and the use of digital wallet (mobile and online) confuses people
    
**Technical Findings**
* limitations in [SOyA Forms](https://ownyourdata.github.io/soya/) for implementing complex use cases
  * dynamic drop-downs to select DIDs (and other non human-readable identifiers)
  * auto-complete for selecting SOyA structures [here](https://soya-form.ownyourdata.eu/)
* limitations in [Semantic Containers](https://ownyourdata.github.io/semcon/) for implementing complex use cases:
  * Action Buttons should support configurable messages to use asynchronous function invocation
  * support for deep-linking resources in a Semantic Container
* synchronization between Sphereon Online Wallet and Semantic Container is hard and the usage of different platforms is confusing for users; focus should be on technical concepts, e.g., credential exchange, use of supporting evidence
* specifications for DPP representation is fragmented and still in the early stages, the following documents were identified as most relevant for now:
    - https://w3c-ccg.github.io/traceability-vocab/
    - https://w3c-ccg.github.io/traceability-interop/draft/
    - https://identity.foundation/linked-vp/