---
# System prepended metadata

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

---

NGI Sargasso (Call 2) DPP-CRC project (online: https://hackmd.io/rrpChr57TlWwE3qliuzpwg)
# Use Case #0 - Inital Tech Demo

### Description
This initial use case demonstrates creating a digital representation of an EPD (Environmental Product Declaration) compliant with DPP (Digital Product Passport) platform. It includes the following technical components:
<details><summary><strong>Private Data Store</strong> of a Concrete Producer: stores data to generate an EPD</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>Data Intermediary</strong>: stores proof (Verifiable Presentation) for Concrete DPP</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>EPD Calc Tool</strong>: 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>Sphereon Mobile Wallet</strong>: signs Verifiable Credential with private key in wallet</summary>
  
  General information: https://sphereon.com/sphereon-products/sphereon-wallet/
  Github: https://github.com/Sphereon-Opensource/mobile-wallet/tree/feat/oyd-01
</details>

&nbsp;
**Trust Triangle and Identities**
Description of the Triangle of Trust: [Wikipedia](https://en.wikipedia.org/wiki/Verifiable_credentials#Trust_model)
<details><summary><em>Concrete Producer (CP, holder)</em> enters data and signs DPP</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>Trusted EPD Authority (TA, issuer)</em> calculates EPD and provides ZKP</summary>

  <ul>
    <li>DID: <code>did:oyd:zQmT26WrFJhgLGsDj2gmWtimAtgvuxpaLuYv3yM9srLqZyL</code><br>(note: will differ based on DID in wallet)</li>
    <li>command: <code>echo '' | oydid create --doc-pwd tapwd --rev-pwd tarev -z 1</code></li>
  </ul>
</details>

<details><summary><em>Building Owner (BO, verifier)</em> verifies concrete producer's claims in DPP</summary>
    <ul>
      <li>DID: <code>did:oyd:zQmYsEgetRcnZiAjdChXZcHnUD4YDgVPquEZpAE14Xq55Hh</code></li>
      <li>command: <code>echo '' | oydid create --doc-pwd cspwd --rev-pwd csrev -z 1</code></li>
    </ul>
</details>

<details><summary><em>Data Intermediary (DI, public repository)</em> stores 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) - private record stored locally ([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) - record with all data to generate DPP ([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))

## Walk-Through
Video recording: https://www.loom.com/share/2b307008a7d24375a8d8f8aa7ee55faa
### Sequence Diagram
  
```plantuml
@startuml
actor "Concrete\nProducer" as cp
participant "Mobile\nWallet" as wallet
database "Data\nIntermediary" as disp
database "Private\nStore" as store
collections "EPD\nCalculator" as epd
actor "Building\nOwner" as owner

cp -> store: enter ConcreteMixture
cp --> store: trigger EPD calculation
store -> epd: send ConcreteMixture
epd -> store: store zkEPD
cp --> store: trigger DPP creation
cp o//-- store: show QR code
cp --> wallet: scan QR code
wallet -> store: request ConcreteDPP VC
wallet -> wallet: prepare ConcreteDPP VP
cp --> wallet: confirm signature
wallet -> store: provide signature for ConcreteDPP VP
store -> store: create DPP from EPD\nsigned by CP
store -> disp: publish DPP & VP
store --> cp: make DID for DPP available
cp --> owner: share DID
owner -> disp: request ConcreteDPP from DID
owner -> epd: validate zkEPD\n(from ConcreteDPP)

@enduml
```
  
### Steps
1) 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=95
   
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=96
    * **output:** `ConcreteDPP` record
      example link: https://cp-private.data-container.net/?itemId=97

4) CP triggers "Publish DPP" for an "ConcreteDPP" record
    * **input:** record of structure `ConcreteDPP`
    * enter date+volume
    * click "Publish DPP" to show page with QR Code
    * CP scans QR Code (referencing EPD-VC) with wallet
    * CP clicks "show Digital Product Passport"
      * display page with DID<br><br>
    * **outptut:** updated `ConcreteDPP` record with DID and link to VP
      example link: https://cp-private.data-container.net/?itemId=97
      * DID: [`did:oyd:zQmQht8RJD6vx7nDvqjL8fdYPrTBJvDJui5oQVbW6cYJTw3`](https://dev.uniresolver.io/#did:oyd:zQmQht8RJD6vx7nDvqjL8fdYPrTBJvDJui5oQVbW6cYJTw3)
      * Verifiable Presentation: <br><span style="font-size:11px">[`https://concrete.go-data.at/presentations/zQmboVisouVKVfB1PduFgsGq4LCZWAY56x3ScXxMukgFdLs`](https://concrete.go-data.at/presentations/zQmboVisouVKVfB1PduFgsGq4LCZWAY56x3ScXxMukgFdLs)</span>
5) BO verifies DPP
    * resolve DID and download data from service endpoint
    * perform the following checks:
      * integrity of Verifiable Presentation
        ```bash=
        curl -s https://concrete.go-data.at/presentations/zQmboVisouVKVfB1PduFgsGq4LCZWAY56x3ScXxMukgFdLs | \
        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/zQmboVisouVKVfB1PduFgsGq4LCZWAY56x3ScXxMukgFdLs| \
        jq '.verifiableCredential[0].credentialSubject.epd' | \
        curl -s -H "Content-Type: application/json" -d @- \
             -X POST https://epd.ownyourdata.eu/verify
        ```

## Learnings & Planned Improvements
**Domain-specific Findings**
* check input data for correct units and format
  --> demo to domain experts
* review algorithm to calculate GWP (global warming potential)
  --> use demo in upcoming interviews to validate and improve algorithm
* User Interface for data management is a prototype and too technical
  --> planned integration with Sphereon's Online Wallet & DPP Platform

**Technical Findings**
* increase number of testers that run use case
  --> provide Sphereon Wallet via APK for Android and via TestFlight for iPhone
* building the customized Sphereon Wallet with `did:oyd` support is hard
  --> add `did:oyd` support to Veramo ([PR available](https://github.com/decentralized-identity/veramo/pull/1388)) and subsequently to Sphereon Wallet
* ZKP Calculation is slow and needs better integration into the overall process
  --> redesign interface to invoke and retrieve result from OYD infrastructure
* access to data stores through key & secret is not user-friendly
  --> support OID4VP to login via QR Code and Credential in mobile wallet
* current DPP representation is bare minimum with only reference to VP
  --> research more elaborate versions from other existing DPP solutions