From 49e004eadfe383c7c5e58d79371271fe3bdba57f Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Fri, 24 Jun 2022 14:46:05 +0800 Subject: [PATCH 01/15] Add api for registry chain --- package.json | 4 ++-- src/index.ts | 2 ++ src/services/index.ts | 18 ++++++++++++++++- src/services/registrationChainApi.ts | 18 +++++++++++++++++ src/services/swork.ts | 4 ++-- src/services/util.ts | 23 ++++++++++++++++++--- src/services/verifier.ts | 30 ++++++++++++++++++++++++++++ 7 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 src/services/registrationChainApi.ts create mode 100644 src/services/verifier.ts diff --git a/package.json b/package.json index 2016e19..1e89995 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "fix": "gts fix" }, "dependencies": { - "@crustio/type-definitions": "1.1.0", - "@polkadot/api": "4.2.2-4", + "@crustio/type-definitions": "1.3.0", + "@polkadot/api": "6.0.5", "body-parser": "^1.19.0", "connect-timeout": "^1.9.0", "express": "^4.17.1", diff --git a/src/index.ts b/src/index.ts index 466ff72..957a390 100644 --- a/src/index.ts +++ b/src/index.ts @@ -56,10 +56,12 @@ app.get('/api/v1/swork/workreport', services.swork.workReport); app.get('/api/v1/swork/code', services.swork.code); app.get('/api/v1/swork/identity', services.swork.identity); app.get('/api/v1/market/file', services.market.file); +app.get('/api/v1/verifier/verificationResults', services.verifier.verificationResults); // Post routes app.post('/api/v1/swork/identity', services.swork.register); app.post('/api/v1/swork/workreport', services.swork.reportWorks); +app.post('/api/v1/verifier/requestVerification', services.verifier.requestVerification); // Error handler app.use(errorHandler); diff --git a/src/services/index.ts b/src/services/index.ts index 8b25009..6f6202a 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -4,8 +4,10 @@ import {typesBundleForPolkadot} from '@crustio/type-definitions'; import {blockHash, header, health} from './chain'; import {register, reportWorks, workReport, code, identity} from './swork'; import {file} from './market'; -import {loadKeyringPair, resHandler, withApiReady} from './util'; +import {loadKeyringPair, resHandler, withApiReady, withRegistrationChainApiReady} from './util'; import {logger} from '../log'; +import { registrationChainApi } from './registrationChainApi'; +import { requestVerification, verificationResults } from './verifier'; // TODO: Better result export interface TxRes { @@ -96,6 +98,20 @@ export const market = { }, }; +export const verifier = { + verificationResults: (req: Request, res: Response, next: NextFunction) => { + withRegistrationChainApiReady(async (api: ApiPromise) => { + res.json(await verificationResults(api, String(req.query['address']))); + }, next) + }, + requestVerification: (req: Request, res: Response, next: NextFunction) => { + withRegistrationChainApiReady(async (api: ApiPromise) => { + const krp = loadKeyringPair(req); + await resHandler(requestVerification(api, krp, req), res); + }, next); + } +} + function newApiPromise(): ApiPromise { return new ApiPromise({ provider: new WsProvider(process.argv[3] || 'ws://localhost:9944'), diff --git a/src/services/registrationChainApi.ts b/src/services/registrationChainApi.ts new file mode 100644 index 0000000..e6e62c7 --- /dev/null +++ b/src/services/registrationChainApi.ts @@ -0,0 +1,18 @@ +import { typesBundleForPolkadot } from '@crustio/type-definitions'; +import { ApiPromise, WsProvider } from '@polkadot/api'; +import { logger } from '@polkadot/util'; +const l = logger('registration-chain-api'); + +export const registrationChainApi: ApiPromise = new ApiPromise({ + provider: new WsProvider(process.argv[4] || 'ws://localhost:9944'), + typesBundle: typesBundleForPolkadot, +}); + +registrationChainApi.on('connected', () => { + l.log(`Registration chain API has been connected to the endpoint: ${process.argv[4]}`) +}) + +registrationChainApi.on('disconnected', (): void => { + l.error('Registration chain API has been disconnected from the endpoint') + process.exit(0) +}); \ No newline at end of file diff --git a/src/services/swork.ts b/src/services/swork.ts index 9edfc36..cf49b8a 100644 --- a/src/services/swork.ts +++ b/src/services/swork.ts @@ -23,7 +23,7 @@ export async function register( '0x' + req.body['sig'] ); - return handleSworkTxWithLock(async () => sendTx(tx, krp)); + return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); } export async function reportWorks( @@ -57,7 +57,7 @@ export async function reportWorks( ); let txRes = queryToObj( - await handleSworkTxWithLock(async () => sendTx(tx, krp)) + await handleSworkTxWithLock(async () => sendTx(api, tx, krp)) ); // Double confirm of tx status diff --git a/src/services/util.ts b/src/services/util.ts index 199f913..ec16a9d 100644 --- a/src/services/util.ts +++ b/src/services/util.ts @@ -8,6 +8,8 @@ import {SubmittableExtrinsic} from '@polkadot/api/promise/types'; import {timeout} from 'promise-timeout'; import {TxRes, getApi} from './index'; import {logger} from '../log'; +import { registrationChainApi } from './registrationChainApi'; +import { ApiPromise } from '@polkadot/api'; const txLocker = {swork: false}; /** @@ -24,7 +26,7 @@ export function loadKeyringPair(req: Request): KeyringPair { return krp; } -export async function sendTx(tx: SubmittableExtrinsic, krp: KeyringPair) { +export async function sendTx(api: ApiPromise, tx: SubmittableExtrinsic, krp: KeyringPair) { return new Promise((resolve, reject) => { tx.signAndSend(krp, ({events = [], status}) => { logger.info( @@ -48,11 +50,11 @@ export async function sendTx(tx: SubmittableExtrinsic, krp: KeyringPair) { // Can get detail error info if (dispatchError.isModule) { const mod = dispatchError.asModule; - const error = getApi().registry.findMetaError( + const error = api.registry.findMetaError( new Uint8Array([mod.index.toNumber(), mod.error.toNumber()]) ); result.message = `${error.section}.${error.name}`; - result.details = error.documentation.join(''); + result.details = error.docs.join(''); } logger.info( @@ -98,6 +100,21 @@ export async function withApiReady(fn: Function, next: NextFunction) { } } +export async function withRegistrationChainApiReady(fn: Function, next: NextFunction) { + const _api = await registrationChainApi.isReadyOrError; + if (!_api || !_api.isConnected) { + next(new Error('⚠️ Registration Chain is offline, please connect a running chain.')); + return; + } + try { + const matureApi = await _api.isReady; + await fn(matureApi); + next(); + } catch (err) { + next(err); + } +} + export async function resHandler(req: Promise, res: Response) { const txRes: any = await req; if (txRes && 'success' === txRes.status) { diff --git a/src/services/verifier.ts b/src/services/verifier.ts new file mode 100644 index 0000000..8bfe211 --- /dev/null +++ b/src/services/verifier.ts @@ -0,0 +1,30 @@ +import { ApiPromise } from "@polkadot/api"; +import { logger } from "../log"; +import {KeyringPair} from '@polkadot/keyring/types'; +import { handleSworkTxWithLock, sendTx } from "./util"; +import {Request} from 'express'; + +/** + * Queries + */ +export async function verificationResults(api: ApiPromise, addr: string) { + logger.info(`⚙️ [swork]: Query verification results with ${addr}`); + + return await api.query.verifier.verificationResults(addr); +} + +/** + * Send extrinsics + */ +export async function requestVerification( + api: ApiPromise, + krp: KeyringPair, + req: Request +) { + logger.info(`⚙️ [swork]: Call verifier requestVerification with ${JSON.stringify(req.body)}`); + const tx = api.tx.verifier.requestVerification( + '0x' + req.body['evidence'] + ); + + return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); +} \ No newline at end of file From 62af049efff9d3a64b0bfd3cac848c2544de0ac5 Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Fri, 24 Jun 2022 14:54:03 +0800 Subject: [PATCH 02/15] Fix lint --- src/index.ts | 10 ++++++++-- src/services/index.ts | 17 ++++++++++------ src/services/registrationChainApi.ts | 22 ++++++++++---------- src/services/util.ts | 21 ++++++++++++++----- src/services/verifier.ts | 30 +++++++++++++++------------- 5 files changed, 63 insertions(+), 37 deletions(-) diff --git a/src/index.ts b/src/index.ts index 957a390..70c65f0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -56,12 +56,18 @@ app.get('/api/v1/swork/workreport', services.swork.workReport); app.get('/api/v1/swork/code', services.swork.code); app.get('/api/v1/swork/identity', services.swork.identity); app.get('/api/v1/market/file', services.market.file); -app.get('/api/v1/verifier/verificationResults', services.verifier.verificationResults); +app.get( + '/api/v1/verifier/verificationResults', + services.verifier.verificationResults +); // Post routes app.post('/api/v1/swork/identity', services.swork.register); app.post('/api/v1/swork/workreport', services.swork.reportWorks); -app.post('/api/v1/verifier/requestVerification', services.verifier.requestVerification); +app.post( + '/api/v1/verifier/requestVerification', + services.verifier.requestVerification +); // Error handler app.use(errorHandler); diff --git a/src/services/index.ts b/src/services/index.ts index 6f6202a..9d22cfb 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -4,10 +4,15 @@ import {typesBundleForPolkadot} from '@crustio/type-definitions'; import {blockHash, header, health} from './chain'; import {register, reportWorks, workReport, code, identity} from './swork'; import {file} from './market'; -import {loadKeyringPair, resHandler, withApiReady, withRegistrationChainApiReady} from './util'; +import { + loadKeyringPair, + resHandler, + withApiReady, + withRegistrationChainApiReady, +} from './util'; import {logger} from '../log'; -import { registrationChainApi } from './registrationChainApi'; -import { requestVerification, verificationResults } from './verifier'; +import {registrationChainApi} from './registrationChainApi'; +import {requestVerification, verificationResults} from './verifier'; // TODO: Better result export interface TxRes { @@ -102,15 +107,15 @@ export const verifier = { verificationResults: (req: Request, res: Response, next: NextFunction) => { withRegistrationChainApiReady(async (api: ApiPromise) => { res.json(await verificationResults(api, String(req.query['address']))); - }, next) + }, next); }, requestVerification: (req: Request, res: Response, next: NextFunction) => { withRegistrationChainApiReady(async (api: ApiPromise) => { const krp = loadKeyringPair(req); await resHandler(requestVerification(api, krp, req), res); }, next); - } -} + }, +}; function newApiPromise(): ApiPromise { return new ApiPromise({ diff --git a/src/services/registrationChainApi.ts b/src/services/registrationChainApi.ts index e6e62c7..1e5664c 100644 --- a/src/services/registrationChainApi.ts +++ b/src/services/registrationChainApi.ts @@ -1,18 +1,20 @@ -import { typesBundleForPolkadot } from '@crustio/type-definitions'; -import { ApiPromise, WsProvider } from '@polkadot/api'; -import { logger } from '@polkadot/util'; +import {typesBundleForPolkadot} from '@crustio/type-definitions'; +import {ApiPromise, WsProvider} from '@polkadot/api'; +import {logger} from '@polkadot/util'; const l = logger('registration-chain-api'); export const registrationChainApi: ApiPromise = new ApiPromise({ - provider: new WsProvider(process.argv[4] || 'ws://localhost:9944'), - typesBundle: typesBundleForPolkadot, + provider: new WsProvider(process.argv[4] || 'ws://localhost:9944'), + typesBundle: typesBundleForPolkadot, }); registrationChainApi.on('connected', () => { - l.log(`Registration chain API has been connected to the endpoint: ${process.argv[4]}`) -}) + l.log( + `Registration chain API has been connected to the endpoint: ${process.argv[4]}` + ); +}); registrationChainApi.on('disconnected', (): void => { - l.error('Registration chain API has been disconnected from the endpoint') - process.exit(0) -}); \ No newline at end of file + l.error('Registration chain API has been disconnected from the endpoint'); + process.exit(0); +}); diff --git a/src/services/util.ts b/src/services/util.ts index ec16a9d..e73eb5d 100644 --- a/src/services/util.ts +++ b/src/services/util.ts @@ -8,8 +8,8 @@ import {SubmittableExtrinsic} from '@polkadot/api/promise/types'; import {timeout} from 'promise-timeout'; import {TxRes, getApi} from './index'; import {logger} from '../log'; -import { registrationChainApi } from './registrationChainApi'; -import { ApiPromise } from '@polkadot/api'; +import {registrationChainApi} from './registrationChainApi'; +import {ApiPromise} from '@polkadot/api'; const txLocker = {swork: false}; /** @@ -26,7 +26,11 @@ export function loadKeyringPair(req: Request): KeyringPair { return krp; } -export async function sendTx(api: ApiPromise, tx: SubmittableExtrinsic, krp: KeyringPair) { +export async function sendTx( + api: ApiPromise, + tx: SubmittableExtrinsic, + krp: KeyringPair +) { return new Promise((resolve, reject) => { tx.signAndSend(krp, ({events = [], status}) => { logger.info( @@ -100,10 +104,17 @@ export async function withApiReady(fn: Function, next: NextFunction) { } } -export async function withRegistrationChainApiReady(fn: Function, next: NextFunction) { +export async function withRegistrationChainApiReady( + fn: Function, + next: NextFunction +) { const _api = await registrationChainApi.isReadyOrError; if (!_api || !_api.isConnected) { - next(new Error('⚠️ Registration Chain is offline, please connect a running chain.')); + next( + new Error( + '⚠️ Registration Chain is offline, please connect a running chain.' + ) + ); return; } try { diff --git a/src/services/verifier.ts b/src/services/verifier.ts index 8bfe211..83c5f3e 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -1,30 +1,32 @@ -import { ApiPromise } from "@polkadot/api"; -import { logger } from "../log"; +import {ApiPromise} from '@polkadot/api'; +import {logger} from '../log'; import {KeyringPair} from '@polkadot/keyring/types'; -import { handleSworkTxWithLock, sendTx } from "./util"; +import {handleSworkTxWithLock, sendTx} from './util'; import {Request} from 'express'; /** * Queries */ export async function verificationResults(api: ApiPromise, addr: string) { - logger.info(`⚙️ [swork]: Query verification results with ${addr}`); + logger.info(`⚙️ [swork]: Query verification results with ${addr}`); - return await api.query.verifier.verificationResults(addr); + return await api.query.verifier.verificationResults(addr); } /** * Send extrinsics */ export async function requestVerification( - api: ApiPromise, - krp: KeyringPair, - req: Request + api: ApiPromise, + krp: KeyringPair, + req: Request ) { - logger.info(`⚙️ [swork]: Call verifier requestVerification with ${JSON.stringify(req.body)}`); - const tx = api.tx.verifier.requestVerification( - '0x' + req.body['evidence'] - ); + logger.info( + `⚙️ [swork]: Call verifier requestVerification with ${JSON.stringify( + req.body + )}` + ); + const tx = api.tx.verifier.requestVerification('0x' + req.body['evidence']); - return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); -} \ No newline at end of file + return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); +} From 2458f3e7d659ef407148d8db687a56e45a71cd54 Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Fri, 24 Jun 2022 15:01:48 +0800 Subject: [PATCH 03/15] Fix lint --- src/services/registrationChainApi.ts | 4 +++- src/services/verifier.ts | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services/registrationChainApi.ts b/src/services/registrationChainApi.ts index 1e5664c..e130e9f 100644 --- a/src/services/registrationChainApi.ts +++ b/src/services/registrationChainApi.ts @@ -1,3 +1,4 @@ +/* eslint-disable node/no-extraneous-import */ import {typesBundleForPolkadot} from '@crustio/type-definitions'; import {ApiPromise, WsProvider} from '@polkadot/api'; import {logger} from '@polkadot/util'; @@ -16,5 +17,6 @@ registrationChainApi.on('connected', () => { registrationChainApi.on('disconnected', (): void => { l.error('Registration chain API has been disconnected from the endpoint'); - process.exit(0); + // eslint-disable-next-line no-process-exit + process.exit(1); }); diff --git a/src/services/verifier.ts b/src/services/verifier.ts index 83c5f3e..14316e2 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -1,3 +1,4 @@ +/* eslint-disable node/no-extraneous-import */ import {ApiPromise} from '@polkadot/api'; import {logger} from '../log'; import {KeyringPair} from '@polkadot/keyring/types'; From 2bde1ee88ec8a01357294e620cf9aabd17136bc9 Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Wed, 29 Jun 2022 15:25:42 +0800 Subject: [PATCH 04/15] Add registry api docs --- README.md | 5 +-- docs/api.md | 54 ++++++++++++++++++++++++++++ src/services/registrationChainApi.ts | 13 +++++-- 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 109a65d..468766a 100644 --- a/README.md +++ b/README.md @@ -24,15 +24,16 @@ yarn - API_PORT: port number, default is: `56666` - CRUST_WS_ADDRESS: crust's websocket address, default is: `ws://localhost:9944` +- CRUST_REGISTRY_WS_ADDRESS: crust's registry chain address, default is: `ws://localhost:9944` ```shell -yarn debug {API_PORT} {CRUST_WS_ADDRESS} +yarn debug {API_PORT} {CRUST_WS_ADDRESS} {CRUST_REGISTRY_WS_ADDRESS} ``` #### 3. Build and start with original node ```shell -yarn build && yarn start {API_PORT} {CRUST_WS_ADDRESS} +yarn build && yarn start {API_PORT} {CRUST_WS_ADDRESS} {CRUST_REGISTRY_WS_ADDRESS} ``` ### Build from docker diff --git a/docs/api.md b/docs/api.md index d3fdbca..f27904d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -91,6 +91,38 @@ Response: } ``` +#### Get verifier verification results + +Request: + +```shell +curl 'http://localhost:56666/api/v1/verifier/verificationResults?address=5HBPJZkoLeUBdPombuYe3tcUkXcTAKyRhRgXJvHpCs9mzxfL' +``` + +Response: + +```json +[ + { + "block_number": 98, + "message": "add5405867d77e03140e393fb1310e0d38be0730d9b4569742e570dea460070396a7e8049dafd009beddfce9f24d9ab3a8d72b6d3204e1910a0bb4ba0ce6a59229cef4ff5549a1779d456de3c4bcb13443d42948fb726c5db1b2411d999a1b4b61366566613337343730306638363430623737376263393263373764333434343763353538386437656237633465633938343332336337646230393833303039", + "who": "cTHPynnf3THq4KC8czA3oz3E7d6XCjQXaVjdqDtVGVATm4UKK", + "public": { + "Sr25519": "0x2ec91af63632573a5b051376cdeb79730261e696117e68c67aa298d519f0c77c" + } + }, + { + "block_number": 98, + "message": "add5405867d77e03140e393fb1310e0d38be0730d9b4569742e570dea460070396a7e8049dafd009beddfce9f24d9ab3a8d72b6d3204e1910a0bb4ba0ce6a59229cef4ff5549a1779d456de3c4bcb13443d42948fb726c5db1b2411d999a1b4b61366566613337343730306638363430623737376263393263373764333434343763353538386437656237633465633938343332336337646230393833303039", + "who": "cTHPynnf3THq4KC8czA3oz3E7d6XCjQXaVjdqDtVGVATm4UKK", + "public": { + "Sr25519": "0x328846691dd2401b2a62b123daea0e6f626cb4919dc560797645d26e3273a57a" + } + } +] + +``` + #### Get sWorker work report Request: @@ -203,6 +235,28 @@ Response: } ``` +#### Verifier request verification + +Request: + +```shell +curl --request POST 'http://localhost:56666/api/v1/verifier/requestVerification' \ +--header 'Content-Type: application/json' \ +--header 'password: 123456' \ +--data-raw '{ + "evidence":"6956c19f8914bbe14c7fb8dd4fc776cd3382e94be25679b2b6bf4fb075eb27ebc1cadc76dff0c76fe72acd4e83af80f18f1a893e7d179e8d7630085c0aa9223e", + "backup": "{\"address\":\"5FqazaU79hjpEMiWTWZx81VjsYFst15eBuSBKdQLgQibD7CX\",\"encoded\":\"0xc81537c9442bd1d3f4985531293d88f6d2a960969a88b1cf8413e7c9ec1d5f4955adf91d2d687d8493b70ef457532d505b9cee7a3d2b726a554242b75fb9bec7d4beab74da4bf65260e1d6f7a6b44af4505bf35aaae4cf95b1059ba0f03f1d63c5b7c3ccbacd6bd80577de71f35d0c4976b6e43fe0e1583530e773dfab3ab46c92ce3fa2168673ba52678407a3ef619b5e14155706d43bd329a5e72d36\",\"encoding\":{\"content\":[\"pkcs8\",\"sr25519\"],\"type\":\"xsalsa20-poly1305\",\"version\":\"2\"},\"meta\":{\"name\":\"Yang1\",\"tags\":[],\"whenCreated\":1580628430860}}" + }' +``` + +Response: + +```json +{ + "status": "success", +} +``` + ## Errors All the errors will be global catched with return `status code = 400` 😂 diff --git a/src/services/registrationChainApi.ts b/src/services/registrationChainApi.ts index e130e9f..00916b1 100644 --- a/src/services/registrationChainApi.ts +++ b/src/services/registrationChainApi.ts @@ -1,12 +1,21 @@ /* eslint-disable node/no-extraneous-import */ -import {typesBundleForPolkadot} from '@crustio/type-definitions'; import {ApiPromise, WsProvider} from '@polkadot/api'; import {logger} from '@polkadot/util'; const l = logger('registration-chain-api'); +const types = { + RegisterPayload: { + block_number: 'BlockNumber', + message: 'Vec', + who: 'AccountId', + public: 'MultiSigner', + }, + Public: 'MultiSigner', +}; + export const registrationChainApi: ApiPromise = new ApiPromise({ provider: new WsProvider(process.argv[4] || 'ws://localhost:9944'), - typesBundle: typesBundleForPolkadot, + types, }); registrationChainApi.on('connected', () => { From 9a26953027afc71db5772cbf966f716f5c72fe3f Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Wed, 29 Jun 2022 17:24:07 +0800 Subject: [PATCH 05/15] Remove 0x prefix --- src/services/verifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/verifier.ts b/src/services/verifier.ts index 14316e2..27c99c1 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -27,7 +27,7 @@ export async function requestVerification( req.body )}` ); - const tx = api.tx.verifier.requestVerification('0x' + req.body['evidence']); + const tx = api.tx.verifier.requestVerification(req.body['evidence']); return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); } From aaf14065dc76668c15465619090b539185098939 Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Wed, 29 Jun 2022 18:14:42 +0800 Subject: [PATCH 06/15] Fix --- docs/api.md | 2 +- src/services/verifier.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/api.md b/docs/api.md index f27904d..612f402 100644 --- a/docs/api.md +++ b/docs/api.md @@ -244,7 +244,7 @@ curl --request POST 'http://localhost:56666/api/v1/verifier/requestVerification' --header 'Content-Type: application/json' \ --header 'password: 123456' \ --data-raw '{ - "evidence":"6956c19f8914bbe14c7fb8dd4fc776cd3382e94be25679b2b6bf4fb075eb27ebc1cadc76dff0c76fe72acd4e83af80f18f1a893e7d179e8d7630085c0aa9223e", + "evidence": "{\"account\":\"a6efa374700f8640b777bc92c77d34447c5588d7eb7c4ec984323c7db0983009\",\"quote\":\"030002000000000006000b00939a7233f79c4ca9940a0db3957f0607b4476fd35d720061cbb9960de7e399d8000000000203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000030000000000000029cef4ff5549a1779d456de3c4bcb13443d42948fb726c5db1b2411d999a1b4b000000000000000000000\",\"sig\":\"b07f9c1bfc48d6888360db296a09de276d90c63d468dcdf178b02e4dc4efcdfc4e683ffc7dfb70db1a9f547b65c5cac9c916ff7b8971064db27601d27e69c39b\"}", "backup": "{\"address\":\"5FqazaU79hjpEMiWTWZx81VjsYFst15eBuSBKdQLgQibD7CX\",\"encoded\":\"0xc81537c9442bd1d3f4985531293d88f6d2a960969a88b1cf8413e7c9ec1d5f4955adf91d2d687d8493b70ef457532d505b9cee7a3d2b726a554242b75fb9bec7d4beab74da4bf65260e1d6f7a6b44af4505bf35aaae4cf95b1059ba0f03f1d63c5b7c3ccbacd6bd80577de71f35d0c4976b6e43fe0e1583530e773dfab3ab46c92ce3fa2168673ba52678407a3ef619b5e14155706d43bd329a5e72d36\",\"encoding\":{\"content\":[\"pkcs8\",\"sr25519\"],\"type\":\"xsalsa20-poly1305\",\"version\":\"2\"},\"meta\":{\"name\":\"Yang1\",\"tags\":[],\"whenCreated\":1580628430860}}" }' ``` diff --git a/src/services/verifier.ts b/src/services/verifier.ts index 27c99c1..211d0df 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -4,6 +4,7 @@ import {logger} from '../log'; import {KeyringPair} from '@polkadot/keyring/types'; import {handleSworkTxWithLock, sendTx} from './util'; import {Request} from 'express'; +import {u8aToHex, stringToU8a} from '@polkadot/util'; /** * Queries @@ -27,7 +28,10 @@ export async function requestVerification( req.body )}` ); - const tx = api.tx.verifier.requestVerification(req.body['evidence']); + + const evidence = u8aToHex(stringToU8a(req.body['evidence'])); + + const tx = api.tx.verifier.requestVerification(evidence); return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); } From 6bc3d75c07a71205fbb63189100b3fc1a94a02fd Mon Sep 17 00:00:00 2001 From: Yashiro <1161569428@qq.com> Date: Wed, 6 Jul 2022 11:08:25 +0800 Subject: [PATCH 07/15] Fix verifier api --- src/services/chain.ts | 6 +++--- src/services/index.ts | 11 ++++++++--- src/services/registrationChainApi.ts | 15 +++++++++++---- src/services/util.ts | 8 +++++--- src/services/verifier.ts | 12 +++++++++--- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/services/chain.ts b/src/services/chain.ts index c12f846..170c183 100644 --- a/src/services/chain.ts +++ b/src/services/chain.ts @@ -20,7 +20,7 @@ export async function blockHash(api: ApiPromise, bn: number) { export async function health(api: ApiPromise) { logger.info('⛓ [chain]: Query system health'); - const h = await api.rpc.system.health(); + const h = (await api.rpc.system.health()) as any; const ch: CrustHealth = { isSyncing: h.isSyncing.isTrue, peers: h.peers.toNumber(), @@ -29,9 +29,9 @@ export async function health(api: ApiPromise) { // HEALTH PATCH: This is for the poor syncing process if (!ch.isSyncing) { - const h_before = await header(api); + const h_before = (await header(api)) as any; await sleep(3000); - const h_after = await header(api); + const h_after = (await header(api)) as any; if (h_before.number.toNumber() + 1 < h_after.number.toNumber()) { ch.isSyncing = true; } diff --git a/src/services/index.ts b/src/services/index.ts index 9d22cfb..981be0f 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -11,7 +11,6 @@ import { withRegistrationChainApiReady, } from './util'; import {logger} from '../log'; -import {registrationChainApi} from './registrationChainApi'; import {requestVerification, verificationResults} from './verifier'; // TODO: Better result @@ -46,7 +45,7 @@ export const getApi = (): ApiPromise => { export const chain = { header: (_: Request, res: Response, next: NextFunction) => { withApiReady(async (api: ApiPromise) => { - const h = await header(api); + const h = (await header(api)) as any; res.json({ number: h.number, hash: h.hash, @@ -106,7 +105,13 @@ export const market = { export const verifier = { verificationResults: (req: Request, res: Response, next: NextFunction) => { withRegistrationChainApiReady(async (api: ApiPromise) => { - res.json(await verificationResults(api, String(req.query['address']))); + res.json( + await verificationResults( + api, + String(req.query['address']), + String(req.query['pubKey']) + ) + ); }, next); }, requestVerification: (req: Request, res: Response, next: NextFunction) => { diff --git a/src/services/registrationChainApi.ts b/src/services/registrationChainApi.ts index 00916b1..07b2b31 100644 --- a/src/services/registrationChainApi.ts +++ b/src/services/registrationChainApi.ts @@ -4,13 +4,20 @@ import {logger} from '@polkadot/util'; const l = logger('registration-chain-api'); const types = { + Public: 'MultiSigner', RegisterPayload: { - block_number: 'BlockNumber', - message: 'Vec', + code: 'Vec', who: 'AccountId', - public: 'MultiSigner', + pubkey: 'Vec', + public: 'Public', + }, + RegisterPayloadWithSignature: { + payload: 'RegisterPayload', + signature: 'Signature', + }, + WrapPublic: { + public: 'Public', }, - Public: 'MultiSigner', }; export const registrationChainApi: ApiPromise = new ApiPromise({ diff --git a/src/services/util.ts b/src/services/util.ts index e73eb5d..3443a32 100644 --- a/src/services/util.ts +++ b/src/services/util.ts @@ -8,8 +8,8 @@ import {SubmittableExtrinsic} from '@polkadot/api/promise/types'; import {timeout} from 'promise-timeout'; import {TxRes, getApi} from './index'; import {logger} from '../log'; -import {registrationChainApi} from './registrationChainApi'; -import {ApiPromise} from '@polkadot/api'; +import {ApiPromise, WsProvider} from '@polkadot/api'; +import { registrationChainApi } from './registrationChainApi'; const txLocker = {swork: false}; /** @@ -46,7 +46,9 @@ export async function sendTx( if (status.isInBlock) { events.forEach(({event: {data, method, section}}) => { if (section === 'system' && method === 'ExtrinsicFailed') { - const [dispatchError] = data as unknown as ITuple<[DispatchError]>; + const [dispatchError] = (data as unknown) as ITuple< + [DispatchError] + >; const result: TxRes = { status: 'failed', message: dispatchError.type, diff --git a/src/services/verifier.ts b/src/services/verifier.ts index 211d0df..d7f0f8d 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -9,10 +9,16 @@ import {u8aToHex, stringToU8a} from '@polkadot/util'; /** * Queries */ -export async function verificationResults(api: ApiPromise, addr: string) { - logger.info(`⚙️ [swork]: Query verification results with ${addr}`); +export async function verificationResults( + api: ApiPromise, + addr: string, + pubKey: string +) { + logger.info( + `⚙️ [swork]: Query verification results with ${addr} pubKey ${pubKey}` + ); - return await api.query.verifier.verificationResults(addr); + return await api.query.verifier.verificationResults(addr, pubKey); } /** From 331f2239697513298efb7802cc7c54da2f465fc4 Mon Sep 17 00:00:00 2001 From: Yashiro <1161569428@qq.com> Date: Wed, 6 Jul 2022 15:36:03 +0800 Subject: [PATCH 08/15] Fix verify type --- src/services/registrationChainApi.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services/registrationChainApi.ts b/src/services/registrationChainApi.ts index 07b2b31..1f49a8d 100644 --- a/src/services/registrationChainApi.ts +++ b/src/services/registrationChainApi.ts @@ -13,7 +13,10 @@ const types = { }, RegisterPayloadWithSignature: { payload: 'RegisterPayload', - signature: 'Signature', + signature: "MultiSignature", + }, + WrapSignature: { + signature: "MultiSignature", }, WrapPublic: { public: 'Public', From 8ed74f3d66f179563afe958d78194b00b93b1a24 Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Thu, 7 Jul 2022 16:30:43 +0800 Subject: [PATCH 09/15] Fix api docs --- docs/api.md | 66 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/docs/api.md b/docs/api.md index 612f402..eb3f1cb 100644 --- a/docs/api.md +++ b/docs/api.md @@ -96,29 +96,65 @@ Response: Request: ```shell -curl 'http://localhost:56666/api/v1/verifier/verificationResults?address=5HBPJZkoLeUBdPombuYe3tcUkXcTAKyRhRgXJvHpCs9mzxfL' +curl 'http://localhost:56666/api/v1/verifier/verificationResults?address=cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra&pubKey=2e94eec8e31f1f7bed684ead40716294a0c40e3d505a43d4f3ebd17052d12bcdd5aafa9a59a471f19a16037a15d9e499ceda6d5e50085eab13f55213cdf8d1dd' ``` Response: ```json [ - { - "block_number": 98, - "message": "add5405867d77e03140e393fb1310e0d38be0730d9b4569742e570dea460070396a7e8049dafd009beddfce9f24d9ab3a8d72b6d3204e1910a0bb4ba0ce6a59229cef4ff5549a1779d456de3c4bcb13443d42948fb726c5db1b2411d999a1b4b61366566613337343730306638363430623737376263393263373764333434343763353538386437656237633465633938343332336337646230393833303039", - "who": "cTHPynnf3THq4KC8czA3oz3E7d6XCjQXaVjdqDtVGVATm4UKK", - "public": { - "Sr25519": "0x2ec91af63632573a5b051376cdeb79730261e696117e68c67aa298d519f0c77c" + { + "payload": { + "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", + "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", + "public": { + "sr25519": "0x2ec91af63632573a5b051376cdeb79730261e696117e68c67aa298d519f0c77c" + } + }, + "signature": { + "sr25519": "0x7cf8b9162c2368d7dad200bf509f07268e107e1667b58e5d614988c46c091b2b43b9a361c835186a4213c41d358dcfa69e18bbe4a4e6baf93e31a8618f919a80" + } + }, + { + "payload": { + "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", + "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", + "public": { + "sr25519": "0x328846691dd2401b2a62b123daea0e6f626cb4919dc560797645d26e3273a57a" + } + }, + "signature": { + "sr25519": "0x18665c99af1b209a1dec311b26041905749cef46f00a168fb60be8c9035d174c8b6feb5475ce2cb2351508d667e61347fc74bd461fbd90fcf3be9268e6ce4383" } - }, - { - "block_number": 98, - "message": "add5405867d77e03140e393fb1310e0d38be0730d9b4569742e570dea460070396a7e8049dafd009beddfce9f24d9ab3a8d72b6d3204e1910a0bb4ba0ce6a59229cef4ff5549a1779d456de3c4bcb13443d42948fb726c5db1b2411d999a1b4b61366566613337343730306638363430623737376263393263373764333434343763353538386437656237633465633938343332336337646230393833303039", - "who": "cTHPynnf3THq4KC8czA3oz3E7d6XCjQXaVjdqDtVGVATm4UKK", - "public": { - "Sr25519": "0x328846691dd2401b2a62b123daea0e6f626cb4919dc560797645d26e3273a57a" + }, + { + "payload": { + "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", + "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", + "public": { + "sr25519": "0x328846691dd2401b2a62b123daea0e6f626cb4919dc560797645d26e3273a57a" + } + }, + "signature": { + "sr25519": "0x1c2fcfc839a34ac77af76c573316cc98e2be726a1ae60402886940d1905d397e20e11828f75cba733bf874de1218baa474203b57d8b85a37004a421605f4d980" } - } + }, + { + "payload": { + "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", + "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", + "public": { + "sr25519": "0x2ec91af63632573a5b051376cdeb79730261e696117e68c67aa298d519f0c77c" + } + }, + "signature": { + "sr25519": "0x9a2d4d37945412b671779eac17643da769278e487396889430f95fad83f2a5577f64530eea66e9c9ede5a3fbbbcb33111022ffa6f9fa7632d70e1a8f54b3b88e" + } + } ] ``` From df358e01756e678540b6f4e0efdf2708e95d531c Mon Sep 17 00:00:00 2001 From: yuhui <1161569428@qq.com> Date: Fri, 8 Jul 2022 12:33:43 +0800 Subject: [PATCH 10/15] Fix unable to get verify results --- src/services/registrationChainApi.ts | 4 ++-- src/services/util.ts | 6 ++---- src/services/verifier.ts | 8 +++++++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/services/registrationChainApi.ts b/src/services/registrationChainApi.ts index 1f49a8d..36c1786 100644 --- a/src/services/registrationChainApi.ts +++ b/src/services/registrationChainApi.ts @@ -13,10 +13,10 @@ const types = { }, RegisterPayloadWithSignature: { payload: 'RegisterPayload', - signature: "MultiSignature", + signature: 'MultiSignature', }, WrapSignature: { - signature: "MultiSignature", + signature: 'MultiSignature', }, WrapPublic: { public: 'Public', diff --git a/src/services/util.ts b/src/services/util.ts index 3443a32..17c201c 100644 --- a/src/services/util.ts +++ b/src/services/util.ts @@ -9,7 +9,7 @@ import {timeout} from 'promise-timeout'; import {TxRes, getApi} from './index'; import {logger} from '../log'; import {ApiPromise, WsProvider} from '@polkadot/api'; -import { registrationChainApi } from './registrationChainApi'; +import {registrationChainApi} from './registrationChainApi'; const txLocker = {swork: false}; /** @@ -46,9 +46,7 @@ export async function sendTx( if (status.isInBlock) { events.forEach(({event: {data, method, section}}) => { if (section === 'system' && method === 'ExtrinsicFailed') { - const [dispatchError] = (data as unknown) as ITuple< - [DispatchError] - >; + const [dispatchError] = data as unknown as ITuple<[DispatchError]>; const result: TxRes = { status: 'failed', message: dispatchError.type, diff --git a/src/services/verifier.ts b/src/services/verifier.ts index d7f0f8d..5c9490a 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -5,6 +5,7 @@ import {KeyringPair} from '@polkadot/keyring/types'; import {handleSworkTxWithLock, sendTx} from './util'; import {Request} from 'express'; import {u8aToHex, stringToU8a} from '@polkadot/util'; +import _ from 'lodash'; /** * Queries @@ -18,7 +19,12 @@ export async function verificationResults( `⚙️ [swork]: Query verification results with ${addr} pubKey ${pubKey}` ); - return await api.query.verifier.verificationResults(addr, pubKey); + const result = await api.query.verifier.verificationResults(addr, pubKey); + if (_.isEmpty(result)) { + throw Error('Unable to get verification results'); + } else { + return result; + } } /** From 97d4270bdf147b6bf4edb1fea0067455b7d954a0 Mon Sep 17 00:00:00 2001 From: Yashiro <1161569428@qq.com> Date: Mon, 1 Aug 2022 16:49:19 +0800 Subject: [PATCH 11/15] Fix accountid type --- docs/api.md | 8 ++++---- src/services/util.ts | 4 +++- src/services/verifier.ts | 24 ++++++++++++++++++++---- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/docs/api.md b/docs/api.md index eb3f1cb..b68e5bd 100644 --- a/docs/api.md +++ b/docs/api.md @@ -106,7 +106,7 @@ Response: { "payload": { "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", - "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "who": "0x069686d23c8e0170553dddca0c36a659c6fc39fa0d5148f1ba1cc95ec4d4c414", "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", "public": { "sr25519": "0x2ec91af63632573a5b051376cdeb79730261e696117e68c67aa298d519f0c77c" @@ -119,7 +119,7 @@ Response: { "payload": { "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", - "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "who": "0x069686d23c8e0170553dddca0c36a659c6fc39fa0d5148f1ba1cc95ec4d4c414", "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", "public": { "sr25519": "0x328846691dd2401b2a62b123daea0e6f626cb4919dc560797645d26e3273a57a" @@ -132,7 +132,7 @@ Response: { "payload": { "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", - "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "who": "0x069686d23c8e0170553dddca0c36a659c6fc39fa0d5148f1ba1cc95ec4d4c414", "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", "public": { "sr25519": "0x328846691dd2401b2a62b123daea0e6f626cb4919dc560797645d26e3273a57a" @@ -145,7 +145,7 @@ Response: { "payload": { "code": "0x32396365663466663535343961313737396434353664653363346263623133343433643432393438666237323663356462316232343131643939396131623462", - "who": "cTL7WyybsDCmpKZguj2tRxnxycfDJd8k7ZzkSCXrV7yYoA6ra", + "who": "0x069686d23c8e0170553dddca0c36a659c6fc39fa0d5148f1ba1cc95ec4d4c414", "pubkey": "0x3265393465656338653331663166376265643638346561643430373136323934613063343065336435303561343364346633656264313730353264313262636464356161666139613539613437316631396131363033376131356439653439396365646136643565353030383565616231336635353231336364663864316464", "public": { "sr25519": "0x2ec91af63632573a5b051376cdeb79730261e696117e68c67aa298d519f0c77c" diff --git a/src/services/util.ts b/src/services/util.ts index 17c201c..336bcd0 100644 --- a/src/services/util.ts +++ b/src/services/util.ts @@ -46,7 +46,9 @@ export async function sendTx( if (status.isInBlock) { events.forEach(({event: {data, method, section}}) => { if (section === 'system' && method === 'ExtrinsicFailed') { - const [dispatchError] = data as unknown as ITuple<[DispatchError]>; + const [dispatchError] = (data as unknown) as ITuple< + [DispatchError] + >; const result: TxRes = { status: 'failed', message: dispatchError.type, diff --git a/src/services/verifier.ts b/src/services/verifier.ts index 5c9490a..5e156a5 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -1,8 +1,8 @@ /* eslint-disable node/no-extraneous-import */ -import {ApiPromise} from '@polkadot/api'; +import {ApiPromise, Keyring} from '@polkadot/api'; import {logger} from '../log'; import {KeyringPair} from '@polkadot/keyring/types'; -import {handleSworkTxWithLock, sendTx} from './util'; +import {handleSworkTxWithLock, queryToObj, sendTx} from './util'; import {Request} from 'express'; import {u8aToHex, stringToU8a} from '@polkadot/util'; import _ from 'lodash'; @@ -19,10 +19,26 @@ export async function verificationResults( `⚙️ [swork]: Query verification results with ${addr} pubKey ${pubKey}` ); - const result = await api.query.verifier.verificationResults(addr, pubKey); - if (_.isEmpty(result)) { + const chainResult = queryToObj( + await api.query.verifier.verificationResults(addr, pubKey) + ); + + if (_.isEmpty(chainResult)) { throw Error('Unable to get verification results'); } else { + const kr = new Keyring({ + type: 'sr25519', + }); + + const result = chainResult.map((e: any) => { + return { + payload: { + ...e.payload, + who: u8aToHex(kr.decodeAddress(e.payload.who)), + }, + signature: e.signature, + }; + }); return result; } } From 75d19e5c98de994d2a07e6f8f608306d2e753f64 Mon Sep 17 00:00:00 2001 From: Yashiro <1161569428@qq.com> Date: Mon, 1 Aug 2022 17:49:56 +0800 Subject: [PATCH 12/15] Fix --- src/services/swork.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/services/swork.ts b/src/services/swork.ts index cf49b8a..920193d 100644 --- a/src/services/swork.ts +++ b/src/services/swork.ts @@ -26,6 +26,24 @@ export async function register( return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); } +export async function registerV2( + api: ApiPromise, + krp: KeyringPair, + req: Request +) { + logger.info(`⚙️ [swork]: Call registerV2 with ${JSON.stringify(req.body)}`); + const tx = api.tx.swork.registerV2( + req.body['who'], + req.body['code'], + req.body['pubkeys'], + req.body['sigs'], + req.body['pubkey'], + '0x' + req.body['sig'] + ); + + return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); +} + export async function reportWorks( api: ApiPromise, krp: KeyringPair, From 539c21843fad355376b3ababd4c29d6561e8afeb Mon Sep 17 00:00:00 2001 From: Yashiro <1161569428@qq.com> Date: Tue, 2 Aug 2022 16:58:59 +0800 Subject: [PATCH 13/15] Add registerV2 api --- docs/api.md | 28 ++++++++++++++++++++++++++++ src/index.ts | 1 + src/services/index.ts | 8 +++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/api.md b/docs/api.md index b68e5bd..d37f84a 100644 --- a/docs/api.md +++ b/docs/api.md @@ -234,6 +234,34 @@ Response: } ``` +#### RegisterV2 as sWorker + +Request: + +```shell +curl --request POST 'http://localhost:56666/api/v1/swork/registerV2' \ +--header 'Content-Type: application/json' \ +--header 'password: 123456' \ +--data-raw '{ + "who" : "0xa6efa374700f8640b777bc92c77d34447c5588d7eb7c4ec984323c7db0983009", + "code" : "0x34633130383435666561376230353433646264333965656236626434376434623735383131663565356435313666353164623263373564343439353961633761", + "pubkey" : "0x3061376637646531626635303538636161366239363661346435303738326139663261656137393536313735303234373734373136343264636433623132313363386562643663303162633737333062613432353563373938316463656437626432343464633735323063353936303534663031323361383833346333313139", + "pubkeys" : ["0x328846691dd2401b2a62b123daea0e6f626cb4919dc560797645d26e3273a57a", "0x2ec91af63632573a5b051376cdeb79730261e696117e68c67aa298d519f0c77c"], + "sig" : "1f9ddc0ec3cb13c6b779924e78ebf4036c6c063a691649a18955f871feeac36a3204ee0c88a26249cfb9702ccb69e4e3d8de7720f1cdf185fbc24351a8c4e548", + "sigs" : ["0x08c8b9c428add1c886d3c7485b36c2b3eea61c74a651e162ec2c53af7f97b67422a0b70d4b4e2eba35a6c01ccdd95a40527f9e9670ef8f1a109a43648479218a", + "0x1831dd101ed60ce5193a5b9ad95cc4792b735490f36398c4e2536ca7c9d88945bb40636f2313a0906b24f9e46dd2ba4c18c8a0fd772caa1b878af9398deb0a89"] + "backup" : "{\"address\":\"5FqazaU79hjpEMiWTWZx81VjsYFst15eBuSBKdQLgQibD7CX\",\"encoded\":\"0xc81537c9442bd1d3f4985531293d88f6d2a960969a88b1cf8413e7c9ec1d5f4955adf91d2d687d8493b70ef457532d505b9cee7a3d2b726a554242b75fb9bec7d4beab74da4bf65260e1d6f7a6b44af4505bf35aaae4cf95b1059ba0f03f1d63c5b7c3ccbacd6bd80577de71f35d0c4976b6e43fe0e1583530e773dfab3ab46c92ce3fa2168673ba52678407a3ef619b5e14155706d43bd329a5e72d36\",\"encoding\":{\"content\":[\"pkcs8\",\"sr25519\"],\"type\":\"xsalsa20-poly1305\",\"version\":\"2\"},\"meta\":{\"name\":\"Yang1\",\"tags\":[],\"whenCreated\":1580628430860}}" +}' +``` + +Response: + +```json +{ + "status": "success", +} +``` + #### Send sWorker work report Request: diff --git a/src/index.ts b/src/index.ts index 70c65f0..b93c6b1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -63,6 +63,7 @@ app.get( // Post routes app.post('/api/v1/swork/identity', services.swork.register); +app.post('/api/v1/swork/registerV2', services.swork.registerV2); app.post('/api/v1/swork/workreport', services.swork.reportWorks); app.post( '/api/v1/verifier/requestVerification', diff --git a/src/services/index.ts b/src/services/index.ts index 981be0f..452eb79 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -2,7 +2,7 @@ import {Request, Response, NextFunction} from 'express'; import {ApiPromise, WsProvider} from '@polkadot/api'; import {typesBundleForPolkadot} from '@crustio/type-definitions'; import {blockHash, header, health} from './chain'; -import {register, reportWorks, workReport, code, identity} from './swork'; +import {register, reportWorks, workReport, code, identity, registerV2} from './swork'; import {file} from './market'; import { loadKeyringPair, @@ -71,6 +71,12 @@ export const swork = { await resHandler(register(api, krp, req), res); }, next); }, + registerV2: (req: Request, res: Response, next: NextFunction) => { + withApiReady(async (api: ApiPromise) => { + const krp = loadKeyringPair(req); + await resHandler(registerV2(api, krp, req), res); + }, next); + }, reportWorks: (req: Request, res: Response, next: NextFunction) => { withApiReady(async (api: ApiPromise) => { const krp = loadKeyringPair(req); From d5ccbff738c613c5a1f6170ce2d0c83bb075edd5 Mon Sep 17 00:00:00 2001 From: Yashiro <1161569428@qq.com> Date: Thu, 4 Aug 2022 14:44:35 +0800 Subject: [PATCH 14/15] Fix query verification results --- src/services/verifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/verifier.ts b/src/services/verifier.ts index 5e156a5..91c6058 100644 --- a/src/services/verifier.ts +++ b/src/services/verifier.ts @@ -20,7 +20,7 @@ export async function verificationResults( ); const chainResult = queryToObj( - await api.query.verifier.verificationResults(addr, pubKey) + await api.query.verifier.verificationResults(addr, '0x' + pubKey) ); if (_.isEmpty(chainResult)) { From 678ce243dc3973558fd9e82d3b4f5ceac9189a15 Mon Sep 17 00:00:00 2001 From: Yashiro <1161569428@qq.com> Date: Mon, 8 Aug 2022 14:49:09 +0800 Subject: [PATCH 15/15] Add mainnet auth chain call --- docs/api.md | 4 ++-- src/index.ts | 2 +- src/services/index.ts | 6 +++--- src/services/swork.ts | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/api.md b/docs/api.md index d37f84a..cdfd228 100644 --- a/docs/api.md +++ b/docs/api.md @@ -234,12 +234,12 @@ Response: } ``` -#### RegisterV2 as sWorker +#### Register with decentralized auth chain as sWorker Request: ```shell -curl --request POST 'http://localhost:56666/api/v1/swork/registerV2' \ +curl --request POST 'http://localhost:56666/api/v1/swork/registerWithDeauthChain' \ --header 'Content-Type: application/json' \ --header 'password: 123456' \ --data-raw '{ diff --git a/src/index.ts b/src/index.ts index b93c6b1..6e1702c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -63,7 +63,7 @@ app.get( // Post routes app.post('/api/v1/swork/identity', services.swork.register); -app.post('/api/v1/swork/registerV2', services.swork.registerV2); +app.post('/api/v1/swork/registerWithDeauthChain', services.swork.registerWithDeauthChain); app.post('/api/v1/swork/workreport', services.swork.reportWorks); app.post( '/api/v1/verifier/requestVerification', diff --git a/src/services/index.ts b/src/services/index.ts index 452eb79..9f86be4 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -2,7 +2,7 @@ import {Request, Response, NextFunction} from 'express'; import {ApiPromise, WsProvider} from '@polkadot/api'; import {typesBundleForPolkadot} from '@crustio/type-definitions'; import {blockHash, header, health} from './chain'; -import {register, reportWorks, workReport, code, identity, registerV2} from './swork'; +import {register, reportWorks, workReport, code, identity, registerWithDeauthChain, } from './swork'; import {file} from './market'; import { loadKeyringPair, @@ -71,10 +71,10 @@ export const swork = { await resHandler(register(api, krp, req), res); }, next); }, - registerV2: (req: Request, res: Response, next: NextFunction) => { + registerWithDeauthChain: (req: Request, res: Response, next: NextFunction) => { withApiReady(async (api: ApiPromise) => { const krp = loadKeyringPair(req); - await resHandler(registerV2(api, krp, req), res); + await resHandler(registerWithDeauthChain(api, krp, req), res); }, next); }, reportWorks: (req: Request, res: Response, next: NextFunction) => { diff --git a/src/services/swork.ts b/src/services/swork.ts index 920193d..f59d806 100644 --- a/src/services/swork.ts +++ b/src/services/swork.ts @@ -26,19 +26,19 @@ export async function register( return handleSworkTxWithLock(async () => sendTx(api, tx, krp)); } -export async function registerV2( +export async function registerWithDeauthChain( api: ApiPromise, krp: KeyringPair, req: Request ) { - logger.info(`⚙️ [swork]: Call registerV2 with ${JSON.stringify(req.body)}`); - const tx = api.tx.swork.registerV2( + logger.info(`⚙️ [swork]: Call register With decentralized auth chain with ${JSON.stringify(req.body)}`); + const tx = api.tx.swork.registerWithDeauthChain( req.body['who'], req.body['code'], req.body['pubkeys'], req.body['sigs'], req.body['pubkey'], - '0x' + req.body['sig'] + req.body['sig'] ); return handleSworkTxWithLock(async () => sendTx(api, tx, krp));