This document proposes a user experience for generating example credentials. These credentials can then be "issued" to become [Verifiable Credentials](https://www.w3.org/TR/vc-data-model/). ## The objective Allow a user to be able to generate an credential, with the help of a TreeLDR file that defines the data that should be in `credentialSubject` property. An example credential that would be output from the tooling: ```jsonld { "@context": [ "https://www.w3.org/2018/credentials/v1", { "Device": { "@id": "https://vc-context.elia.be/2022/v1/Device", "@context": { "@version": 1.1, "@protected": true, "brandName": "https://saref.etsi.org/saref4ener/brandName", "deviceCode": "https://saref.etsi.org/saref4ener/deviceCode" } }, "DeviceInfoCredential": "https://vc-context.elia.be/2022/v1/DeviceInfoCredential" } ], "type": [ "VerifiableCredential", "DeviceInfoCredential" ], "credentialSubject": { "type": "Device", "id": "deviceIdScheme:123", "brandName": "Device Manufacturer Inc", "deviceCode": "device 123" } } ``` The TreeLDR file for this credential: ``` base <https://vc-context.elia.be/2022/v1/>; use <http://www.w3.org/2001/XMLSchema#> as xs; use <https://saref.etsi.org/saref4ener/> as saref4ener; property saref4ener:brandName: xs:string; property saref4ener:deviceCode: xs:string; type Device { saref4ener:brandName, saref4ener:deviceCode } ``` ## Tool Operational Sequence ### 0. The tool starts with credential scaffolding All (v1) Verifiable Credentials will have `"https://www.w3.org/2018/credentials/v1"` in their context array and will be of type `VerifiableCredential`. Therefore, the tooling can start with this scaffolding from which to build the credential. ```jsonld { "@context": [ "https://www.w3.org/2018/credentials/v1", ], "type": [ "VerifiableCredential" ] } ``` ### 1. Generating the credential subject JSON-LD context To start, the user provides the tooling with a TreeLDR file and the IRI of the subject type. For example, the user would provide: 1. TreeLDR file path: `device-info.tldr` 2. Type IRI: `https://vc-context.elia.be/2022/v1/DeviceInfo` From the TreeLDR file, the tool runs the `json-ld` compilation. Example TreeLDR compiler (`tldrc`) command (which would be run internally by the tool): ```bash tldrc -i device-info.tldr json-ld-context https://vc-context.elia.be/2022/v1/DeviceInfo ``` In the above, `device-info.tldr` is the TreeLDR file and `https://vc-context.elia.be/2022/v1/Device` is the IRI of the credential subject type. Given a TreeLDR file as shown previously, the command output would be: ```jsonld { "brandName": "https://saref.etsi.org/saref4ener/brandName", "deviceCode": "https://saref.etsi.org/saref4ener/deviceCode" } ``` The tool would take the above output and place into the following template JSON: ```json { {{Last fragement of the IRI}}: { "@id": {{Subject Type IRI}}, "@context": { "@version": 1.1, "@protected": true, {{Properties from JSON-LD compilation}} } } } ``` The result for our example would be: ```jsonld { "Device": { "@id": "https://vc-context.elia.be/2022/v1/Device", "@context": { "@version": 1.1, "@protected": true, "brandName": "https://saref.etsi.org/saref4ener/brandName", "deviceCode": "https://saref.etsi.org/saref4ener/deviceCode" } } } ``` The tooling can then add this context to the credential. For our example, the credential would now be: ```jsonld { "@context": [ "https://www.w3.org/2018/credentials/v1", { "Device": { "@id": "https://vc-context.elia.be/2022/v1/Device", "@context": { "@version": 1.1, "@protected": true, "brandName": "https://saref.etsi.org/saref4ener/brandName", "deviceCode": "https://saref.etsi.org/saref4ener/deviceCode" } } } ], "type": [ "VerifiableCredential" ] } ``` ### 2. Generating the credentialSubject data Currently, there is no way to provide an example value in a TreeLDR file. Therefore, to get values to populate the `credentialSubject` property, the tooling can prompt the user to enter values that match the JSON schema for the type of the credential subject. From the TreeLDR file, the tool runs the `json-schema` compilation. Example TreeLDR compiler (`tldrc`) command (which would be run internally by the tool): ```bash tldrc -i device-info.tldr json-schema https://vc-context.elia.be/2022/v1/Device ``` This results in the follow JSON schema: ```json { "type": "object", "properties": { "deviceCode": { "$ref": "http://www.w3.org/2001/XMLSchema#string" }, "brandName": { "$ref": "http://www.w3.org/2001/XMLSchema#string" } }, "$id": "https://vc-context.elia.be/2022/v1/Device", "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Device" } ``` The tooling can now prompt the user for `deviceCode` & `brandName` and make sure that they are `string`, as per the schema. Finally, the tooling should prompt the user for the `id` of the `credentialSubject`. After collecting the values from the user, the tool can now add a `crdentialSubject` property. The credential would then be: ```jsonld { "@context": [ "https://www.w3.org/2018/credentials/v1", { "Device": { "@id": "https://vc-context.elia.be/2022/v1/Device", "@context": { "@version": 1.1, "@protected": true, "brandName": "https://saref.etsi.org/saref4ener/brandName", "deviceCode": "https://saref.etsi.org/saref4ener/deviceCode" } } } ], "type": [ "VerifiableCredential" ], "credentialSubject": { "type": "Device", "id": "deviceIdScheme:123", "brandName": "Device Manufacturer Inc", "deviceCode": "device 123" } } ``` The `type` of the `credentialSubject` is taken from the previous step. ### 3. Add Credential Type IRI The tooling prompts the user for an IRI for the credential type. This IRI can then be put directly in the `type` array or the context array can be used. If using the context approach, the resulting credential would be: ```jsonld { "@context": [ "https://www.w3.org/2018/credentials/v1", { "Device": { "@id": "https://vc-context.elia.be/2022/v1/Device", "@context": { "@version": 1.1, "@protected": true, "brandName": "https://saref.etsi.org/saref4ener/brandName", "deviceCode": "https://saref.etsi.org/saref4ener/deviceCode" } }, "DeviceInfoCredential": "https://vc-context.elia.be/2022/v1/DeviceInfoCredential" } ], "type": [ "VerifiableCredential", "DeviceInfoCredential" ], "credentialSubject": { "type": "Device", "id": "deviceIdScheme:123", "brandName": "Device Manufacturer Inc", "deviceCode": "device 123" } } ``` The JSON-LD processing of the above credential can be tested using the [JSON-LD Playground](https://json-ld.org/playground/) ## User Interface A user could interface with the above process in various ways. For example: 1. A CLI application could be written where the user types in values from a shell 2. A web API could be exposed that takes a TreeLDR file, a subject type IRI, a credential type IRI and a credential subject data file ## Discussion This approach uses an "in-line" context. However, it could be possible to rearrange the steps to generate a context file that can be stored externally and then referenced from the credential.