2

Here is an example of a verifiable credential I want to create

{
  "@context": ["https://www.w3.org/2018/credentials/v1"],
  "credentialSubject": {
    "id": "did:example:not-a-real-did",
    "competence": ["AM", "B"],
    "dateOfBirth": "1995-09-23",
    "name": "Frank Franksson",
    "picture": "some-random-url.png",
    "ssn": "19950923-9965"
  },
  "holder": "did:ethr:goerli:0x027d0d3347a44b5469a8acd6e9195f6e5c3b7253ddce558238d096dd927b23055a",
  "id": "https://verify.stepstone.com/credentials/c7c077a6-f0c0-4843-9718-68dfba008587",
  "issuanceDate": "2022-11-18T09:00:38.000Z",
  "issuer": {
    "id": "did:ethr:goerli:0x02f163e34f0c84d85bf0b5becc119c86362e36fab4c9247515610a0b1cc4eff74a"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iLCJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlN3ZWRpc2hEcml2ZXJzTGljZW5zZSJdfSwiaXNzdWVyIjp7ImlkIjoiZGlkOmV0aHI6Z29lcmxpOjB4MDJmMTYzZTM0ZjBjODRkODViZjBiNWJlY2MxMTljODYzNjJlMzZmYWI0YzkyNDc1MTU2MTBhMGIxY2M0ZWZmNzRhIn0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7InNzbiI6IjE5OTUwOTIzLTk5NjUiLCJkYXRlT2ZCaXJ0aCI6IjE5OTUtMDktMjMiLCJuYW1lIjoiRnJhbmsgRnJhbmtzc29uIiwicGljdHVyZSI6InN1cGVyLWdvb2QtbG9va2luZy5wbmciLCJjb21wZXRlbmNlIjpbIkFNIiwiQiJdLCJpZCI6InNvbWUgZGlkIn0sInByb29mIjp7InR5cGUiOiJKd3RQcm9vZjIwMjAiLCJjcmVhdGVkIjoiMjAyMi0xMS0xOFQwOTowMDozOC4wMDBaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiaHR0cHM6Ly9leGFtcGxlLmVkdS9pc3N1ZXJzLzU2NTA0OSNrZXktMSIsImp3cyI6ImV5SmhiR2NpT2lKRlV6STFOa3NpTENKMGVYQWlPaUpLVjFRaWZRLmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0pkTENKMGVYQmxJanBiSWxabGNtbG1hV0ZpYkdWRGNtVmtaVzUwYVdGc0lpd2lVM2RsWkdsemFFUnlhWFpsY25OTWFXTmxibk5sSWwwc0ltTnlaV1JsYm5ScFlXeFRkV0pxWldOMElqcDdJbk56YmlJNklqRTVPVFV3T1RJekxUazVOalVpTENKa1lYUmxUMlpDYVhKMGFDSTZJakU1T1RVdE1Ea3RNak1pTENKdVlXMWxJam9pUm5KaGJtc2dSbkpoYm10emMyOXVJaXdpY0dsamRIVnlaU0k2SW5OMWNHVnlMV2R2YjJRdGJHOXZhMmx1Wnk1d2JtY2lMQ0pqYjIxd1pYUmxibU5sSWpwYklrRk5JaXdpUWlKZGZYMHNJbk4xWWlJNkluTnZiV1VnWkdsa0lpd2lhblJwSWpvaWFIUjBjSE02THk5MlpYSnBabmt1YzNSbGNITjBiMjVsTG1OdmJTOWpjbVZrWlc1MGFXRnNjeTlqTjJNd056ZGhOaTFtTUdNd0xUUTRORE10T1RjeE9DMDJPR1JtWW1Fd01EZzFPRGNpTENKdVltWWlPakUyTmpnM05qSXdNemdzSW1semN5STZJbVJwWkRwbGRHaHlPbWR2WlhKc2FUb3dlREF5WmpFMk0yVXpOR1l3WXpnMFpEZzFZbVl3WWpWaVpXTmpNVEU1WXpnMk16WXlaVE0yWm1GaU5HTTVNalEzTlRFMU5qRXdZVEJpTVdOak5HVm1aamMwWVNKOS5LZU04STNCWWlxaVBUcDNLWDNBUThHMHU4ODlYS0hKbkJqYlFvQXpqOTFzY2Y5UDZVM1NQN05sZVVpVjJQREZRMTdlMWV4Qk9HdndLbWRoMzhRNFJwZyJ9LCJqdGkiOiJodHRwczovL3ZlcmlmeS5zdGVwc3RvbmUuY29tL2NyZWRlbnRpYWxzL2M3YzA3N2E2LWYwYzAtNDg0My05NzE4LTY4ZGZiYTAwODU4NyIsIm5iZiI6MTY2ODc2MjAzOCwiaXNzIjoiZGlkOmV0aHI6Z29lcmxpOjB4MDI3ZDBkMzM0N2E0NGI1NDY5YThhY2Q2ZTkxOTVmNmU1YzNiNzI1M2RkY2U1NTgyMzhkMDk2ZGQ5MjdiMjMwNTVhIn0.-9Kd8qEpZXNDWw-RsHO9nzh-citxi8yaas_Yhaxfx4ykj4HqJz3h3SvD94HRRTWFRvXty8z2Hl3FP1vCExVLIg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiablePresentation",
    "VerifiableCredential",
    "SwedishDriversLicense"
  ]
}

But right now I'm only using the standard @context for verifiable credentials, I also want to include the custom fields for my specific verifiable credential like so:

{
  "@context": 
       [
        "https://www.w3.org/2018/credentials/v1",
        "https://www.example.org/2022/swedish-drivers-license.jsonld"
       ],
   ....
}

How do I define my custom context https://www.example.org/2022/swedish-drivers-license.jsonld so that it matches my credential? Do I have to build on top of someone else's ontology or can is it possible for me to define the base definitions myself? How do I define that there is a required field "name" of type "string"?

This is how far I've gotten:

{
  "@context": [
    {
    "competence": "http://example.com/vocabulary#competence",
    "dateOfBirth": "http://example.com/vocabulary#dateOfBirth",
    "name": "http://example.com/vocabulary#name",
    "picture": "http://example.com/vocabulary#picture",
    "ssn": "http://example.com/vocabulary#ssn",
    }
  ]
}

But everything is just a uri and all examples I've found also just keep defining things in terms of more uri:s until they end at "http://schema.org/". Can I define what an "ssn" myself is without referencing a third party?

Update 1

Here is my current solution:

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    {
      "competence": "https://schema.org/swedishdriverslicence/competence",
      "dateOfBirth": "https://schema.org/birthDate",
      "name": "https://schema.org/givenName",
      "picture": {
        "@id": "http://schema.org/image",
        "@type": "@id"
      },
      "ssn": "https://example.org/sweden/ssn"
    }
  ],
  "credentialSubject": {
    "id": "did:example:not-a-real-did",
    "competence": ["AM", "B"],
    "dateOfBirth": "1995-09-23",
    "name": "Frank Franksson",
    "picture": "some-random-url.png",
    "ssn": "19950923-9965"
  },
  "holder": "did:ethr:goerli:0x027d0d3347a44b5469a8acd6e9195f6e5c3b7253ddce558238d096dd927b23055a",
  "id": "https://example.org/credentials/c7c077a6-f0c0-4843-9718-68dfba008587",
  "issuanceDate": "2022-11-18T09:00:38.000Z",
  "issuer": {
    "id": "did:ethr:goerli:0x02f163e34f0c84d85bf0b5becc119c86362e36fab4c9247515610a0b1cc4eff74a"
  },
  "proof": {
    "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iLCJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlN3ZWRpc2hEcml2ZXJzTGljZW5zZSJdfSwiaXNzdWVyIjp7ImlkIjoiZGlkOmV0aHI6Z29lcmxpOjB4MDJmMTYzZTM0ZjBjODRkODViZjBiNWJlY2MxMTljODYzNjJlMzZmYWI0YzkyNDc1MTU2MTBhMGIxY2M0ZWZmNzRhIn0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7InNzbiI6IjE5OTUwOTIzLTk5NjUiLCJkYXRlT2ZCaXJ0aCI6IjE5OTUtMDktMjMiLCJuYW1lIjoiRnJhbmsgRnJhbmtzc29uIiwicGljdHVyZSI6InN1cGVyLWdvb2QtbG9va2luZy5wbmciLCJjb21wZXRlbmNlIjpbIkFNIiwiQiJdLCJpZCI6InNvbWUgZGlkIn0sInByb29mIjp7InR5cGUiOiJKd3RQcm9vZjIwMjAiLCJjcmVhdGVkIjoiMjAyMi0xMS0xOFQwOTowMDozOC4wMDBaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiaHR0cHM6Ly9leGFtcGxlLmVkdS9pc3N1ZXJzLzU2NTA0OSNrZXktMSIsImp3cyI6ImV5SmhiR2NpT2lKRlV6STFOa3NpTENKMGVYQWlPaUpLVjFRaWZRLmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3ZNakF4T0M5amNtVmtaVzUwYVdGc2N5OTJNU0pkTENKMGVYQmxJanBiSWxabGNtbG1hV0ZpYkdWRGNtVmtaVzUwYVdGc0lpd2lVM2RsWkdsemFFUnlhWFpsY25OTWFXTmxibk5sSWwwc0ltTnlaV1JsYm5ScFlXeFRkV0pxWldOMElqcDdJbk56YmlJNklqRTVPVFV3T1RJekxUazVOalVpTENKa1lYUmxUMlpDYVhKMGFDSTZJakU1T1RVdE1Ea3RNak1pTENKdVlXMWxJam9pUm5KaGJtc2dSbkpoYm10emMyOXVJaXdpY0dsamRIVnlaU0k2SW5OMWNHVnlMV2R2YjJRdGJHOXZhMmx1Wnk1d2JtY2lMQ0pqYjIxd1pYUmxibU5sSWpwYklrRk5JaXdpUWlKZGZYMHNJbk4xWWlJNkluTnZiV1VnWkdsa0lpd2lhblJwSWpvaWFIUjBjSE02THk5MlpYSnBabmt1YzNSbGNITjBiMjVsTG1OdmJTOWpjbVZrWlc1MGFXRnNjeTlqTjJNd056ZGhOaTFtTUdNd0xUUTRORE10T1RjeE9DMDJPR1JtWW1Fd01EZzFPRGNpTENKdVltWWlPakUyTmpnM05qSXdNemdzSW1semN5STZJbVJwWkRwbGRHaHlPbWR2WlhKc2FUb3dlREF5WmpFMk0yVXpOR1l3WXpnMFpEZzFZbVl3WWpWaVpXTmpNVEU1WXpnMk16WXlaVE0yWm1GaU5HTTVNalEzTlRFMU5qRXdZVEJpTVdOak5HVm1aamMwWVNKOS5LZU04STNCWWlxaVBUcDNLWDNBUThHMHU4ODlYS0hKbkJqYlFvQXpqOTFzY2Y5UDZVM1NQN05sZVVpVjJQREZRMTdlMWV4Qk9HdndLbWRoMzhRNFJwZyJ9LCJqdGkiOiJodHRwczovL3ZlcmlmeS5zdGVwc3RvbmUuY29tL2NyZWRlbnRpYWxzL2M3YzA3N2E2LWYwYzAtNDg0My05NzE4LTY4ZGZiYTAwODU4NyIsIm5iZiI6MTY2ODc2MjAzOCwiaXNzIjoiZGlkOmV0aHI6Z29lcmxpOjB4MDI3ZDBkMzM0N2E0NGI1NDY5YThhY2Q2ZTkxOTVmNmU1YzNiNzI1M2RkY2U1NTgyMzhkMDk2ZGQ5MjdiMjMwNTVhIn0.-9Kd8qEpZXNDWw-RsHO9nzh-citxi8yaas_Yhaxfx4ykj4HqJz3h3SvD94HRRTWFRvXty8z2Hl3FP1vCExVLIg",
    "type": "JwtProof2020"
  },
  "type": [
    "VerifiablePresentation",
    "VerifiableCredential",
    "SwedishDriversLicense"
  ]
}

You can view it in the playground

Frank Weslien
  • 158
  • 1
  • 14

1 Answers1

0

You can take a look at Verifiable Credentials data model and specifically the extensibility section

You can definitely define it the way you are. the other way around it is to host your context file somewhere like: https://example.com/contexts/mycontext.jsonld

Using this you can create a Credential like this (and then sign it with various different libraries to create a Verifiable Credential):

{
  "@context": [
    "https://www.w3.org/2018/credentials/v1",
    "https://example.com/contexts/mycontext.jsonld"
  ],
  "id": "http://example.com/credentials/4643",
  "type": ["VerifiableCredential", "CustomExt12"],
  "issuer": "https://example.com/issuers/14",
  "issuanceDate": "2018-02-24T05:28:04Z",
  "referenceNumber": 83294847,
  "credentialSubject": {
    "id": "did:example:abcdef1234567",
    "name": "Jane Doe",
    "favoriteFood": "Papaya"
  }
}

for the sake of the argument and just to give you a real world example, you can see this context which is defining a gaia-x context. And in this real world example, you can create the following VerifiableCredential:

{
    "@context": [
      "https://www.w3.org/2018/credentials/v1",
      "https://sphereon-opensource.github.io/vc-contexts/fma/gaia-x.jsonld"
    ],
    "type": [
      "VerifiableCredential",
      "ParticipantCredential"
    ],
    "id": "https://catalogue.gaia-x.eu/credentials/ParticipantCredential/1678184115309",
    "issuer": "did:web:issuer",
    "issuanceDate": "CURRENT_DATE",
    "credentialSubject": {
      "id": "did:web:subject",
      "hash": "0555950f9db2264aef89b1800d88ad8d5952d69b6d93517981d4d060b807902c"
    },
    "proof": {
      "type": "JsonWebSignature2020",
      "created": "DATE",
      "proofPurpose": "assertionMethod",
      "jws": "JWS_SIGNATURE",
      "verificationMethod": "did:web:issuer#JWK2020-RSA"
    }
  }
ksadjad
  • 593
  • 8
  • 20