Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Fix jsonld errors in didDocument [DEV-4360] #297

Merged
merged 16 commits into from
Sep 10, 2024
Merged
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

## ℹ️ Overview

DID methods are expected to provide [standards-compliant methods of DID and DID Document ("DIDDoc") production](https://w3c.github.io/did-core/#production-and-consumption). The **cheqd DID Resolver** is designed to implement the [W3C DID *Resolution* specification](https://w3c.github.io/did-resolution/) for [`did:cheqd`](https://docs.cheqd.io/identity/architecture/adr-list/adr-001-cheqd-did-method) method.
DID methods are expected to provide [standards-compliant methods of DID and DID Document ("DIDDoc") production](https://w3c.github.io/did-core/#production-and-consumption). The **cheqd DID Resolver** is designed to implement the [W3C DID _Resolution_ specification](https://w3c.github.io/did-resolution/) for [`did:cheqd`](https://docs.cheqd.io/identity/architecture/adr-list/adr-001-cheqd-did-method) method.

### 📝 Architecture

Expand Down Expand Up @@ -60,7 +60,7 @@ enable = true
address = "0.0.0.0:9090"
```

**Note**: If you're pointing a DID Resolver to your own node instance, by default `cheqd-node` instance gRPC endpoints are *not* served up with a TLS certificate. This means the `useTls` property would need to be set to `false`, unless you're otherwise using a load balancer that provides TLS connections to the gRPC port.
**Note**: If you're pointing a DID Resolver to your own node instance, by default `cheqd-node` instance gRPC endpoints are _not_ served up with a TLS certificate. This means the `useTls` property would need to be set to `false`, unless you're otherwise using a load balancer that provides TLS connections to the gRPC port.

## 🧑‍💻 Building your own Docker image

Expand All @@ -87,7 +87,7 @@ image: did-resolver:local

Make sure you comment out the pre-existing `image` property that pulls in a container image from Github Container Registry, as shown above.

You can also do *just* a build with:
You can also do _just_ a build with:

```bash
docker-compose -f docker/docker-compose.yml --env-file docker/docker-compose.env build --no-cache
Expand Down Expand Up @@ -191,7 +191,7 @@ You can execute the tests as long as you have Ginkgo CLI installed, which target
ginkgo -r --tags integration --race --randomize-suites --keep-going --trace
```

**Note**: By default, the tests target `localhost:8080` as the port where it expects the running DID Resolver instance for testing. If your running instance is at a different address, you can override this by setting a value for the `TEST_HOST_ADDRESS` environment variable *before* executing the Ginkgo test suite.
**Note**: By default, the tests target `localhost:8080` as the port where it expects the running DID Resolver instance for testing. If your running instance is at a different address, you can override this by setting a value for the `TEST_HOST_ADDRESS` environment variable _before_ executing the Ginkgo test suite.

```bash
export TEST_HOST_ADDRESS="where.is.did.resolver.running:port"
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module github.com/cheqd/did-resolver

go 1.21

toolchain go1.21.0
toolchain go1.21.13

require (
github.com/cheqd/cheqd-node/api/v2 v2.2.0
Expand Down
10 changes: 9 additions & 1 deletion services/diddoc_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ func (dds DIDDocService) Resolve(did string, version string, contentType types.C
result := types.DidResolution{Did: &didDoc, Metadata: *resolvedMetadata, ResolutionMetadata: didResolutionMetadata}
if didResolutionMetadata.ContentType == types.DIDJSONLD || didResolutionMetadata.ContentType == types.JSONLD {
didDoc.AddContext(types.DIDSchemaJSONLD)

for _, service := range didDoc.Service {
if service.Type == types.LinkedDomains {
didDoc.AddContext(types.LinkedDomainsJSONLD)
break
}
}

for _, method := range didDoc.VerificationMethod {
switch method.Type {
case "Ed25519VerificationKey2020":
Expand Down Expand Up @@ -164,7 +172,7 @@ func (dds DIDDocService) DereferenceSecondary(did string, version string, fragme
return &result, nil
}

func (dds DIDDocService) resolveMetadata(did string, metadata *didTypes.Metadata, contentType types.ContentType) (*types.ResolutionDidDocMetadata, *types.IdentityError) {
func (dds DIDDocService) resolveMetadata(did string, metadata *didTypes.Metadata, _ types.ContentType) (*types.ResolutionDidDocMetadata, *types.IdentityError) {
resources, err := dds.ledgerService.QueryCollectionResources(did)
if err != nil {
return nil, err
Expand Down
3 changes: 2 additions & 1 deletion tests/constants/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

didTypes "github.com/cheqd/cheqd-node/api/v2/cheqd/did/v2"
resourceTypes "github.com/cheqd/cheqd-node/api/v2/cheqd/resource/v2"
"github.com/cheqd/did-resolver/types"
"google.golang.org/protobuf/types/known/timestamppb"
)

Expand All @@ -22,7 +23,7 @@ func generateVerificationMethod() didTypes.VerificationMethod {
func generateService() didTypes.Service {
return didTypes.Service{
Id: ExistentDid + "#" + ValidServiceId,
ServiceType: "DIDCommMessaging",
ServiceType: types.LinkedDomains,
ServiceEndpoint: []string{"http://example.com"},
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://identity.foundation/.well-known/did-configuration/v1",
"https://w3id.org/security/suites/ed25519-2020/v1"
],
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN",
Expand All @@ -23,16 +24,12 @@
"publicKeyMultibase": "z6Mkta7joRuvDh7UnoESdgpr9dDUMh5LvdoECDi3WGrJoscA"
}
],
"authentication": [
"did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#key1"
],
"authentication": ["did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#key1"],
"service": [
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#website",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://www.cheqd.io"
]
"serviceEndpoint": ["https://www.cheqd.io"]
},
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#non-fungible-image",
Expand All @@ -44,16 +41,12 @@
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#twitter",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://twitter.com/cheqd_io"
]
"serviceEndpoint": ["https://twitter.com/cheqd_io"]
},
{
"id": "did:cheqd:mainnet:Ps1ysXP2Ae6GBfxNhNQNKN#linkedin",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://www.linkedin.com/company/cheqd-identity/"
]
"serviceEndpoint": ["https://www.linkedin.com/company/cheqd-identity/"]
}
]
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,61 +1,60 @@
{
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T14:51:09Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://bar.example.com"
]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:59:22Z",
"deactivated": true,
"versionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T14:51:09Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://identity.foundation/.well-known/did-configuration/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": ["https://bar.example.com"]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:59:22Z",
"deactivated": true,
"versionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
}
}
Original file line number Diff line number Diff line change
@@ -1,62 +1,61 @@
{
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T15:00:53Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": [
"https://bar.example.com"
]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:39:48Z",
"deactivated": true,
"versionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"nextVersionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "0ce23d04-5b67-4ea6-a315-788588e53f4e",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
"@context": "https://w3id.org/did-resolution/v1",
"didResolutionMetadata": {
"contentType": "application/did+ld+json",
"retrieved": "2023-04-12T15:00:53Z",
"did": {
"didString": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"methodSpecificId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"method": "cheqd"
}
}
},
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1",
"https://identity.foundation/.well-known/did-configuration/v1",
"https://w3id.org/security/suites/ed25519-2018/v1"
],
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"verificationMethod": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1",
"type": "Ed25519VerificationKey2018",
"controller": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"publicKeyBase58": "BpVGbTeT26LipAdk26DBZrmJx2939i9gZS5VxGt1zZQ6"
}
],
"authentication": [
"did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#key-1"
],
"service": [
{
"id": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c#bar",
"type": "LinkedDomains",
"serviceEndpoint": ["https://bar.example.com"]
}
]
},
"didDocumentMetadata": {
"created": "2023-03-06T09:36:55Z",
"updated": "2023-03-06T09:39:48Z",
"deactivated": true,
"versionId": "ce298b6f-594b-426e-b431-370d6bc5d3ad",
"nextVersionId": "f790c9b9-4817-4b31-be43-b198e6e18071",
"previousVersionId": "0ce23d04-5b67-4ea6-a315-788588e53f4e",
"linkedResourceMetadata": [
{
"resourceURI": "did:cheqd:testnet:b5d70adf-31ca-4662-aa10-d3a54cd8f06c/resources/5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceCollectionId": "b5d70adf-31ca-4662-aa10-d3a54cd8f06c",
"resourceId": "5e16a3f9-7c6e-4b6b-8e28-20f56780ee25",
"resourceName": "TestResource",
"resourceType": "TestType",
"mediaType": "text/plain; charset=utf-8",
"created": "2023-03-06T09:53:44Z",
"checksum": "64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c",
"previousVersionId": null,
"nextVersionId": null,
"resourceVersion": "1.0"
}
]
}
}
Loading
Loading