From e8b1ffea7f28abe45635f2c5302f1471bfeb0d2e Mon Sep 17 00:00:00 2001 From: alpers Date: Mon, 14 Nov 2022 16:56:06 +0800 Subject: [PATCH 1/3] resolve did from server --- packages/did-resolver/package.json | 3 +- .../did-resolver/src/ArweaveDidResolver.ts | 63 ++------ yarn.lock | 143 +++--------------- 3 files changed, 30 insertions(+), 179 deletions(-) diff --git a/packages/did-resolver/package.json b/packages/did-resolver/package.json index 04367f8..7b0ddc4 100644 --- a/packages/did-resolver/package.json +++ b/packages/did-resolver/package.json @@ -17,7 +17,6 @@ "version": "0.0.1-10", "main": "index.js", "dependencies": { - "@polkadot/util": "^10.1.11", - "arweave": "^1.11.6" + "axios": "^1.1.3" } } diff --git a/packages/did-resolver/src/ArweaveDidResolver.ts b/packages/did-resolver/src/ArweaveDidResolver.ts index b0d6490..b03ebee 100644 --- a/packages/did-resolver/src/ArweaveDidResolver.ts +++ b/packages/did-resolver/src/ArweaveDidResolver.ts @@ -1,81 +1,36 @@ // Copyright 2021-2022 zcloak authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { isArray } from '@polkadot/util'; -import Arweave from 'arweave'; +import axios from 'axios'; import { DidResolver } from './DidResolver'; -import { DidNotFoundError, RepresentationNotSupportedError } from './errors'; +import { DidNotFoundError } from './errors'; import { DidDocument } from './types'; interface Options { - host?: string; - protocol?: string; - owners?: string[]; + server?: string; } export class ArweaveDidResolver extends DidResolver { - public arweave: Arweave; - public owners: string[]; + public server: string; constructor(opts: Options = {}) { super(); - const { - host = 'arweave.net', - owners = ['rfHpFtImP9jqcXvrl3aZSLPoqa_5mgN5yQO-bWusA7A'], - protocol = 'https' - } = opts; + const { server = 'https://did-service.starks.network' } = opts; - this.owners = owners; - // eslint-disable-next-line no-unsafe-optional-chaining - this.arweave = (Arweave.init ?? (Arweave as any)?.default?.init)({ - host, - protocol - }); + this.server = server; } public override async resolve(didUrl: string): Promise { const { did } = this.parseDid(didUrl); - const res = await this.arweave.api.post('/graphql', { - query: `query { - transactions( - owners: ${JSON.stringify(this.owners)}, - tags: { name: "didUrl", values: ["${did}"] } - ) { - edges { - node { - id - } - } - } -}` - }); + const res = await axios.get(`${this.server}/did/${did}`); - if ( - !res?.data?.data?.transactions?.edges || - !isArray(res?.data?.data?.transactions?.edges) || - res?.data?.data?.transactions?.edges.length === 0 - ) { + if (res.data.code === 200 && !res.data.data) { throw new DidNotFoundError(); } - try { - const documents: string[] = await Promise.all( - res.data.data.transactions.edges.map(({ node: { id } }: any) => - this.arweave.transactions.getData(id, { - decode: true, - string: true - }) - ) - ); - - const document = JSON.parse(documents[documents.length - 1]); - - return document; - } catch { - throw new RepresentationNotSupportedError(); - } + return res.data.data.rawData; } } diff --git a/yarn.lock b/yarn.lock index 89d0a2b..4f771df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3872,8 +3872,7 @@ __metadata: version: 0.0.0-use.local resolution: "@zcloak/did-resolver@workspace:packages/did-resolver" dependencies: - "@polkadot/util": ^10.1.11 - arweave: ^1.11.6 + axios: ^1.1.3 languageName: unknown linkType: soft @@ -4218,15 +4217,6 @@ __metadata: languageName: node linkType: hard -"arconnect@npm:^0.4.2": - version: 0.4.2 - resolution: "arconnect@npm:0.4.2" - dependencies: - arweave: ^1.10.13 - checksum: 5b2f262a93a3a25d4bd6f72eb3afe4b13d0e94ed12f88b7bcf3501d25839e74c2882fa1a1a9b527ac9c6da22ca2f407c07fc49e3d898a4f24b5d66a1901173f8 - languageName: node - linkType: hard - "are-we-there-yet@npm:^3.0.0": version: 3.0.1 resolution: "are-we-there-yet@npm:3.0.1" @@ -4337,32 +4327,6 @@ __metadata: languageName: node linkType: hard -"arweave@npm:^1.10.13, arweave@npm:^1.11.6": - version: 1.11.6 - resolution: "arweave@npm:1.11.6" - dependencies: - arconnect: ^0.4.2 - asn1.js: ^5.4.1 - axios: ^0.27.2 - base64-js: ^1.5.1 - bignumber.js: ^9.0.2 - util: ^0.12.4 - checksum: 5edbb58f255ac78079c0595c54554f32249d1541138f9d3bcd9cf4dd123b6e3d2a1d7839e9c514b87b800c187f831690b963ea240b4a2e599fe779d49d17155d - languageName: node - linkType: hard - -"asn1.js@npm:^5.4.1": - version: 5.4.1 - resolution: "asn1.js@npm:5.4.1" - dependencies: - bn.js: ^4.0.0 - inherits: ^2.0.1 - minimalistic-assert: ^1.0.0 - safer-buffer: ^2.1.0 - checksum: 3786a101ac6f304bd4e9a7df79549a7561950a13d4bcaec0c7790d44c80d147c1a94ba3d4e663673406064642a40b23fcd6c82a9952468e386c1a1376d747f9a - languageName: node - linkType: hard - "asn1@npm:~0.2.3": version: 0.2.6 resolution: "asn1@npm:0.2.6" @@ -4423,13 +4387,6 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a - languageName: node - linkType: hard - "aws-sign2@npm:~0.7.0": version: 0.7.0 resolution: "aws-sign2@npm:0.7.0" @@ -4451,13 +4408,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^0.27.2": - version: 0.27.2 - resolution: "axios@npm:0.27.2" +"axios@npm:^1.1.3": + version: 1.1.3 + resolution: "axios@npm:1.1.3" dependencies: - follow-redirects: ^1.14.9 + follow-redirects: ^1.15.0 form-data: ^4.0.0 - checksum: 38cb7540465fe8c4102850c4368053c21683af85c5fdf0ea619f9628abbcb59415d1e22ebc8a6390d2bbc9b58a9806c874f139767389c862ec9b772235f06854 + proxy-from-env: ^1.1.0 + checksum: cab3b17bf6092c9387f7023d699db093cfa23650b56c4422cd474d124b78b2e3b5a520f932c330664a58ab85b867b1c25a95cace475ef72d236888c852b84e6d languageName: node linkType: hard @@ -4638,7 +4596,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": +"base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -4675,7 +4633,7 @@ __metadata: languageName: node linkType: hard -"bignumber.js@npm:^9.0.1, bignumber.js@npm:^9.0.2": +"bignumber.js@npm:^9.0.1": version: 9.1.0 resolution: "bignumber.js@npm:9.1.0" checksum: 52ec2bb5a3874d7dc1a1018f28f8f7aff4683515ffd09d6c2d93191343c76567ae0ee32cc45149d53afb2b904bc62ed471a307b35764beea7e9db78e56bef6c6 @@ -4714,7 +4672,7 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^4.0.0, bn.js@npm:^4.11.9": +"bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 @@ -6120,7 +6078,7 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.0": +"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": version: 1.20.4 resolution: "es-abstract@npm:1.20.4" dependencies: @@ -7153,7 +7111,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.9": +"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.0": version: 1.15.2 resolution: "follow-redirects@npm:1.15.2" peerDependenciesMeta: @@ -7163,15 +7121,6 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 - languageName: node - linkType: hard - "forever-agent@npm:~0.6.1": version: 0.6.1 resolution: "forever-agent@npm:0.6.1" @@ -8140,16 +8089,6 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4": - version: 1.1.1 - resolution: "is-arguments@npm:1.1.1" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27 - languageName: node - linkType: hard - "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -8194,7 +8133,7 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac @@ -8269,15 +8208,6 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" - dependencies: - has-tostringtag: ^1.0.0 - checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b - languageName: node - linkType: hard - "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -8480,19 +8410,6 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": - version: 1.1.9 - resolution: "is-typed-array@npm:1.1.9" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-abstract: ^1.20.0 - for-each: ^0.3.3 - has-tostringtag: ^1.0.0 - checksum: 11910f1e58755fef43bf0074e52fa5b932bf101ec65d613e0a83d40e8e4c6e3f2ee142d624ebc7624c091d3bbe921131f8db7d36ecbbb71909f2fe310c1faa65 - languageName: node - linkType: hard - "is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -10931,6 +10848,13 @@ __metadata: languageName: node linkType: hard +"proxy-from-env@npm:^1.1.0": + version: 1.1.0 + resolution: "proxy-from-env@npm:1.1.0" + checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 + languageName: node + linkType: hard + "psl@npm:^1.1.28, psl@npm:^1.1.33": version: 1.9.0 resolution: "psl@npm:1.9.0" @@ -12869,19 +12793,6 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.4": - version: 0.12.5 - resolution: "util@npm:0.12.5" - dependencies: - inherits: ^2.0.3 - is-arguments: ^1.0.4 - is-generator-function: ^1.0.7 - is-typed-array: ^1.1.3 - which-typed-array: ^1.1.2 - checksum: 705e51f0de5b446f4edec10739752ac25856541e0254ea1e7e45e5b9f9b0cb105bc4bd415736a6210edc68245a7f903bf085ffb08dd7deb8a0e847f60538a38a - languageName: node - linkType: hard - "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" @@ -13246,20 +13157,6 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.2": - version: 1.1.8 - resolution: "which-typed-array@npm:1.1.8" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - es-abstract: ^1.20.0 - for-each: ^0.3.3 - has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.9 - checksum: bedf4d30a738e848404fe67fe0ace33433a7298cf3f5a4d4b2c624ba99c4d25f06a7fd6f3566c3d16af5f8a54f0c6293cbfded5b1208ce11812753990223b45a - languageName: node - linkType: hard - "which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" From dc231f9b33a88cfd8ef6567d2faef5d62b168830 Mon Sep 17 00:00:00 2001 From: alpers Date: Mon, 14 Nov 2022 17:06:06 +0800 Subject: [PATCH 2/3] add server response error --- packages/did-resolver/src/ArweaveDidResolver.ts | 6 +++++- packages/did-resolver/src/errors.ts | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/did-resolver/src/ArweaveDidResolver.ts b/packages/did-resolver/src/ArweaveDidResolver.ts index b03ebee..f64cfc4 100644 --- a/packages/did-resolver/src/ArweaveDidResolver.ts +++ b/packages/did-resolver/src/ArweaveDidResolver.ts @@ -4,7 +4,7 @@ import axios from 'axios'; import { DidResolver } from './DidResolver'; -import { DidNotFoundError } from './errors'; +import { DidNotFoundError, ServerResponseError } from './errors'; import { DidDocument } from './types'; interface Options { @@ -27,6 +27,10 @@ export class ArweaveDidResolver extends DidResolver { const res = await axios.get(`${this.server}/did/${did}`); + if (res.data.code !== 200) { + throw new ServerResponseError(res.data.message); + } + if (res.data.code === 200 && !res.data.data) { throw new DidNotFoundError(); } diff --git a/packages/did-resolver/src/errors.ts b/packages/did-resolver/src/errors.ts index 80a7636..826a082 100644 --- a/packages/did-resolver/src/errors.ts +++ b/packages/did-resolver/src/errors.ts @@ -18,3 +18,8 @@ export class RepresentationNotSupportedError extends Error { super('representation not supported.'); } } +export class ServerResponseError extends Error { + constructor(msg: string) { + super(`An exception occurred on the server. ${msg}`); + } +} From 7ba0141ee5cebce47ff81c936d988a5590931707 Mon Sep 17 00:00:00 2001 From: alpers Date: Mon, 14 Nov 2022 18:29:17 +0800 Subject: [PATCH 3/3] add tests --- .../src/ArweaveDidResolver.spec.ts | 87 ++++++++++++++++++- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/packages/did-resolver/src/ArweaveDidResolver.spec.ts b/packages/did-resolver/src/ArweaveDidResolver.spec.ts index c811a74..bfa7547 100644 --- a/packages/did-resolver/src/ArweaveDidResolver.spec.ts +++ b/packages/did-resolver/src/ArweaveDidResolver.spec.ts @@ -1,11 +1,52 @@ // Copyright 2021-2022 zcloak authors & contributors // SPDX-License-Identifier: Apache-2.0 +import axios, { AxiosInstance } from 'axios'; + import { ArweaveDidResolver } from './ArweaveDidResolver'; +import { DidNotFoundError, ServerResponseError } from './errors'; -// const DID_URI = 'did:zk:0xab62B6Cc152ca32b51fD80CF5eE6c606DEd850c6'; const DID_URI = 'did:zk:0x8A63688576294474862cE18486CD489144721D77'; +jest.mock('axios'); + +const jestAxios: jest.Mocked = axios as any; + +const DOCUMENT = { + '@context': ['https://www.w3.org/ns/did/v1'], + assertionMethod: ['did:zk:0x8A63688576294474862cE18486CD489144721D77#key-0'], + authentication: ['did:zk:0x8A63688576294474862cE18486CD489144721D77#key-0'], + capabilityDelegation: ['did:zk:0x8A63688576294474862cE18486CD489144721D77#key-0'], + capabilityInvocation: ['did:zk:0x8A63688576294474862cE18486CD489144721D77#key-0'], + controller: ['did:zk:0x8A63688576294474862cE18486CD489144721D77'], + createdTime: 1666336001243, + id: 'did:zk:0x8A63688576294474862cE18486CD489144721D77', + keyAgreement: ['did:zk:0x8A63688576294474862cE18486CD489144721D77#key-1'], + proof: [ + { + id: 'did:zk:0x8A63688576294474862cE18486CD489144721D77#key-0', + signature: + 'zMkj3eCzxioVEhSxFJyQPKbZ93bnnWbDafpWmvRke6NfTUW8z1bAXRAXK48wbhqfXZxb3yPEMrN2m9nkSqk5zF6i7S', + type: 'publish' + } + ], + service: [], + verificationMethod: [ + { + controller: ['did:zk:0x8A63688576294474862cE18486CD489144721D77'], + id: 'did:zk:0x8A63688576294474862cE18486CD489144721D77#key-0', + publicKeyMultibase: 'z25LmFwNQi68JRGhMxqWYdPUDi1Mrntrd22bzEoiXVqcs5', + type: 'EcdsaSecp256k1VerificationKey2019' + }, + { + controller: ['did:zk:0x8A63688576294474862cE18486CD489144721D77'], + id: 'did:zk:0x8A63688576294474862cE18486CD489144721D77#key-1', + publicKeyMultibase: 'z3SF5idgW4q6MHgaCFvUVmRsPa9hWq6iYj8WULqaXuzDe', + type: 'X25519KeyAgreementKey2019' + } + ] +}; + describe('ArweaveDidResolver', (): void => { let resolver: ArweaveDidResolver; @@ -13,7 +54,47 @@ describe('ArweaveDidResolver', (): void => { resolver = new ArweaveDidResolver(); }); - it.skip('resolve didUrl', async (): Promise => { - console.log(await resolver.resolve(DID_URI)); + it('resolve didUrl from server', async (): Promise => { + jestAxios.get.mockResolvedValue({ + data: { + code: 200, + data: { + _id: '6371f66c7b64987021e67afd', + status: 3, + rawData: DOCUMENT, + id: 'did:zk:0x8A63688576294474862cE18486CD489144721D77', + __v: 0 + }, + message: 'operation successful' + } + }); + + const res = await resolver.resolve(DID_URI); + + expect(res).toStrictEqual(DOCUMENT); + }); + + it('should throw DidNotFoundError', () => { + jestAxios.get.mockResolvedValue({ + data: { + code: 200, + data: null, + message: 'operation successful' + } + }); + + expect(() => resolver.resolve(DID_URI)).rejects.toThrow(DidNotFoundError); + }); + + it('should throw ServerResponseError', () => { + jestAxios.get.mockResolvedValue({ + data: { + code: 500, + data: null, + message: 'unknown error' + } + }); + + expect(() => resolver.resolve(DID_URI)).rejects.toThrow(ServerResponseError); }); });