first commit
0 parents
Showing
71 changed files
with
4768 additions
and
0 deletions
.autod.conf.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | module.exports = { | ||
4 | write: true, | ||
5 | prefix: '^', | ||
6 | plugin: 'autod-egg', | ||
7 | test: [ | ||
8 | 'test', | ||
9 | 'benchmark', | ||
10 | ], | ||
11 | dep: [ | ||
12 | 'egg', | ||
13 | 'egg-scripts', | ||
14 | ], | ||
15 | devdep: [ | ||
16 | 'egg-ci', | ||
17 | 'egg-bin', | ||
18 | 'egg-mock', | ||
19 | 'autod', | ||
20 | 'autod-egg', | ||
21 | 'eslint', | ||
22 | 'eslint-config-egg', | ||
23 | ], | ||
24 | exclude: [ | ||
25 | './test/fixtures', | ||
26 | './dist', | ||
27 | ], | ||
28 | }; | ||
29 |
.ddnrc.js
0 → 100644
.eslintignore
0 → 100644
1 | coverage |
.github/workflows/nodejs.yml
0 → 100644
1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node | ||
2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions | ||
3 | |||
4 | name: Node.js CI | ||
5 | |||
6 | on: | ||
7 | push: | ||
8 | branches: | ||
9 | - main | ||
10 | - master | ||
11 | pull_request: | ||
12 | branches: | ||
13 | - main | ||
14 | - master | ||
15 | schedule: | ||
16 | - cron: '0 2 * * *' | ||
17 | |||
18 | jobs: | ||
19 | build: | ||
20 | runs-on: ${{ matrix.os }} | ||
21 | |||
22 | strategy: | ||
23 | fail-fast: false | ||
24 | matrix: | ||
25 | node-version: [10] | ||
26 | os: [ubuntu-latest, windows-latest, macos-latest] | ||
27 | |||
28 | steps: | ||
29 | - name: Checkout Git Source | ||
30 | uses: actions/checkout@v2 | ||
31 | |||
32 | - name: Use Node.js ${{ matrix.node-version }} | ||
33 | uses: actions/setup-node@v1 | ||
34 | with: | ||
35 | node-version: ${{ matrix.node-version }} | ||
36 | |||
37 | - name: Install Dependencies | ||
38 | run: npm i -g npminstall && npminstall | ||
39 | |||
40 | - name: Continuous Integration | ||
41 | run: npm run ci | ||
42 | |||
43 | - name: Code Coverage | ||
44 | uses: codecov/codecov-action@v1 | ||
45 | with: | ||
46 | token: ${{ secrets.CODECOV_TOKEN }} |
.gitignore
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | class TransferController extends Controller { | ||
6 | async postTransaction() { | ||
7 | const { ctx, config } = this; | ||
8 | const body = ctx.request.body; | ||
9 | const rule = { | ||
10 | secret: { type: 'string' }, | ||
11 | amount: { type: 'string' }, | ||
12 | transaction: { type: 'string' }, | ||
13 | }; | ||
14 | console.log(body); | ||
15 | try { | ||
16 | ctx.validate(rule); | ||
17 | } catch (error) { | ||
18 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
19 | return; | ||
20 | } | ||
21 | const oldNetTransaction = JSON.parse(body.transaction); | ||
22 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
23 | ctx.helper.err({ | ||
24 | ctx, | ||
25 | err: '接收地址不正确,请使用正确的地址', | ||
26 | }); | ||
27 | return; | ||
28 | } | ||
29 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
30 | // 旧网转出 | ||
31 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
32 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
33 | if (!oldNetData || !oldNetData.success) { | ||
34 | ctx.helper.err({ | ||
35 | ctx, | ||
36 | data: oldNetData, | ||
37 | }); | ||
38 | return; | ||
39 | } | ||
40 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
41 | ctx.helper.success({ | ||
42 | ctx, | ||
43 | data: result, | ||
44 | }); | ||
45 | |||
46 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
47 | // const trs = JSON.stringify({ transaction }); | ||
48 | // // 上链操作 | ||
49 | // const data = await this.service.sdk.pushTransaction(trs); | ||
50 | // if (data.success) { | ||
51 | // ctx.helper.success({ | ||
52 | // ctx, | ||
53 | // data, | ||
54 | // }); | ||
55 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
56 | // } else { | ||
57 | // ctx.helper.err({ | ||
58 | // ctx, | ||
59 | // data, | ||
60 | // }); | ||
61 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
62 | // } | ||
63 | |||
64 | } | ||
65 | async getBalance() { | ||
66 | const { ctx, config } = this; | ||
67 | const query = ctx.request.query; | ||
68 | const rule = { | ||
69 | address: { type: 'string' }, | ||
70 | }; | ||
71 | console.log(query); | ||
72 | try { | ||
73 | ctx.validate(rule, query); | ||
74 | } catch (error) { | ||
75 | console.log(error); | ||
76 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
77 | return; | ||
78 | } | ||
79 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
80 | ctx.helper.success({ | ||
81 | ctx, | ||
82 | data, | ||
83 | }); | ||
84 | } | ||
85 | async getTransaction() { | ||
86 | const { ctx, config } = this; | ||
87 | const query = ctx.request.query; | ||
88 | const rule = { | ||
89 | address: { type: 'string' }, | ||
90 | }; | ||
91 | console.log(query); | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
100 | ctx.helper.success({ | ||
101 | ctx, | ||
102 | data, | ||
103 | }); | ||
104 | } | ||
105 | async asyncAccount() { | ||
106 | const { ctx, config } = this; | ||
107 | const limit = 100; | ||
108 | let asyncCount = 0; | ||
109 | let errAsyncAccount = 0; | ||
110 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
111 | if (data.success) { | ||
112 | const length = Math.ceil(data.count / 100); | ||
113 | for (let index = 0; index < length; index++) { | ||
114 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
115 | console.log(acountList) | ||
116 | if (acountList.success) { | ||
117 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
118 | const element = acountList.accounts[index]; | ||
119 | if (element.balance == 0) continue; | ||
120 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
121 | if (!result) { | ||
122 | errAsyncAccount++; | ||
123 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
124 | } else { | ||
125 | asyncCount++; | ||
126 | } | ||
127 | } | ||
128 | } else { | ||
129 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
130 | } | ||
131 | } | ||
132 | } else { | ||
133 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
134 | } | ||
135 | ctx.helper.success({ | ||
136 | ctx, | ||
137 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount }, | ||
138 | }); | ||
139 | } | ||
140 | } | ||
141 | |||
142 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | class TransferController extends Controller { | ||
6 | async postTransaction() { | ||
7 | const { ctx, config } = this; | ||
8 | const body = ctx.request.body; | ||
9 | const rule = { | ||
10 | secret: { type: 'string' }, | ||
11 | amount: { type: 'string' }, | ||
12 | transaction: { type: 'string' }, | ||
13 | }; | ||
14 | console.log(body); | ||
15 | try { | ||
16 | ctx.validate(rule); | ||
17 | } catch (error) { | ||
18 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
19 | return; | ||
20 | } | ||
21 | const oldNetTransaction = JSON.parse(body.transaction); | ||
22 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
23 | ctx.helper.err({ | ||
24 | ctx, | ||
25 | err: '接收地址不正确,请使用正确的地址', | ||
26 | }); | ||
27 | return; | ||
28 | } | ||
29 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
30 | // 旧网转出 | ||
31 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
32 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
33 | if (!oldNetData || !oldNetData.success) { | ||
34 | ctx.helper.err({ | ||
35 | ctx, | ||
36 | data: oldNetData, | ||
37 | }); | ||
38 | return; | ||
39 | } | ||
40 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
41 | ctx.helper.success({ | ||
42 | ctx, | ||
43 | data: result, | ||
44 | }); | ||
45 | |||
46 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
47 | // const trs = JSON.stringify({ transaction }); | ||
48 | // // 上链操作 | ||
49 | // const data = await this.service.sdk.pushTransaction(trs); | ||
50 | // if (data.success) { | ||
51 | // ctx.helper.success({ | ||
52 | // ctx, | ||
53 | // data, | ||
54 | // }); | ||
55 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
56 | // } else { | ||
57 | // ctx.helper.err({ | ||
58 | // ctx, | ||
59 | // data, | ||
60 | // }); | ||
61 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
62 | // } | ||
63 | |||
64 | } | ||
65 | async getBalance() { | ||
66 | const { ctx, config } = this; | ||
67 | const query = ctx.request.query; | ||
68 | const rule = { | ||
69 | address: { type: 'string' }, | ||
70 | }; | ||
71 | console.log(query); | ||
72 | try { | ||
73 | ctx.validate(rule, query); | ||
74 | } catch (error) { | ||
75 | console.log(error); | ||
76 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
77 | return; | ||
78 | } | ||
79 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
80 | ctx.helper.success({ | ||
81 | ctx, | ||
82 | data, | ||
83 | }); | ||
84 | } | ||
85 | async getTransaction() { | ||
86 | const { ctx, config } = this; | ||
87 | const query = ctx.request.query; | ||
88 | const rule = { | ||
89 | address: { type: 'string' }, | ||
90 | }; | ||
91 | console.log(query); | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
100 | ctx.helper.success({ | ||
101 | ctx, | ||
102 | data, | ||
103 | }); | ||
104 | } | ||
105 | async asyncAccount() { | ||
106 | const { ctx, config } = this; | ||
107 | const limit = 100; | ||
108 | let asyncCount = 0; | ||
109 | let errAsyncAccount = 0; | ||
110 | let balanceIsZero = 0; | ||
111 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
112 | if (data.success) { | ||
113 | const length = Math.ceil(data.count / 100); | ||
114 | for (let index = 0; index < length; index++) { | ||
115 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
116 | console.log(acountList) | ||
117 | if (acountList.success) { | ||
118 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
119 | const element = acountList.accounts[index]; | ||
120 | if (element.balance == 0) { | ||
121 | balanceIsZero++ | ||
122 | continue; | ||
123 | } | ||
124 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
125 | if (!result) { | ||
126 | errAsyncAccount++; | ||
127 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
128 | } else { | ||
129 | asyncCount++; | ||
130 | } | ||
131 | } | ||
132 | } else { | ||
133 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
134 | } | ||
135 | } | ||
136 | } else { | ||
137 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
138 | } | ||
139 | ctx.helper.success({ | ||
140 | ctx, | ||
141 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
142 | }); | ||
143 | } | ||
144 | } | ||
145 | |||
146 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | class TransferController extends Controller { | ||
6 | async postTransaction() { | ||
7 | const { ctx, config } = this; | ||
8 | const body = ctx.request.body; | ||
9 | const rule = { | ||
10 | secret: { type: 'string' }, | ||
11 | amount: { type: 'string' }, | ||
12 | transaction: { type: 'string' }, | ||
13 | }; | ||
14 | console.log(body); | ||
15 | try { | ||
16 | ctx.validate(rule); | ||
17 | } catch (error) { | ||
18 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
19 | return; | ||
20 | } | ||
21 | const oldNetTransaction = JSON.parse(body.transaction); | ||
22 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
23 | ctx.helper.err({ | ||
24 | ctx, | ||
25 | err: '接收地址不正确,请使用正确的地址', | ||
26 | }); | ||
27 | return; | ||
28 | } | ||
29 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
30 | // 旧网转出 | ||
31 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
32 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
33 | if (!oldNetData || !oldNetData.success) { | ||
34 | ctx.helper.err({ | ||
35 | ctx, | ||
36 | data: oldNetData, | ||
37 | }); | ||
38 | return; | ||
39 | } | ||
40 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
41 | ctx.helper.success({ | ||
42 | ctx, | ||
43 | data: result, | ||
44 | }); | ||
45 | |||
46 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
47 | // const trs = JSON.stringify({ transaction }); | ||
48 | // // 上链操作 | ||
49 | // const data = await this.service.sdk.pushTransaction(trs); | ||
50 | // if (data.success) { | ||
51 | // ctx.helper.success({ | ||
52 | // ctx, | ||
53 | // data, | ||
54 | // }); | ||
55 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
56 | // } else { | ||
57 | // ctx.helper.err({ | ||
58 | // ctx, | ||
59 | // data, | ||
60 | // }); | ||
61 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
62 | // } | ||
63 | |||
64 | } | ||
65 | async getBalance() { | ||
66 | const { ctx, config } = this; | ||
67 | const query = ctx.request.query; | ||
68 | const rule = { | ||
69 | address: { type: 'string' }, | ||
70 | }; | ||
71 | console.log(query); | ||
72 | try { | ||
73 | ctx.validate(rule, query); | ||
74 | } catch (error) { | ||
75 | console.log(error); | ||
76 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
77 | return; | ||
78 | } | ||
79 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
80 | ctx.helper.success({ | ||
81 | ctx, | ||
82 | data, | ||
83 | }); | ||
84 | } | ||
85 | async getTransaction() { | ||
86 | const { ctx, config } = this; | ||
87 | const query = ctx.request.query; | ||
88 | const rule = { | ||
89 | address: { type: 'string' }, | ||
90 | }; | ||
91 | console.log(query); | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
100 | ctx.helper.success({ | ||
101 | ctx, | ||
102 | data, | ||
103 | }); | ||
104 | } | ||
105 | async asyncAccount() { | ||
106 | const { ctx, config } = this; | ||
107 | const limit = 100; | ||
108 | let asyncCount = 0; | ||
109 | let errAsyncAccount = 0; | ||
110 | let balanceIsZero = 0; | ||
111 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
112 | if (data.success) { | ||
113 | const length = Math.ceil(data.count / 100); | ||
114 | console.log(data.count) | ||
115 | for (let index = 0; index < length; index++) { | ||
116 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
117 | console.log(acountList) | ||
118 | if (acountList.success) { | ||
119 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
120 | const element = acountList.accounts[index]; | ||
121 | if (element.balance == 0) { | ||
122 | balanceIsZero++ | ||
123 | continue; | ||
124 | } | ||
125 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
126 | if (!result) { | ||
127 | errAsyncAccount++; | ||
128 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
129 | } else { | ||
130 | asyncCount++; | ||
131 | } | ||
132 | } | ||
133 | } else { | ||
134 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
135 | } | ||
136 | } | ||
137 | } else { | ||
138 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
139 | } | ||
140 | ctx.helper.success({ | ||
141 | ctx, | ||
142 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
143 | }); | ||
144 | } | ||
145 | } | ||
146 | |||
147 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData=require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async getBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async getTransaction() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | console.log(query); | ||
93 | try { | ||
94 | ctx.validate(rule, query); | ||
95 | } catch (error) { | ||
96 | console.log(error); | ||
97 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
98 | return; | ||
99 | } | ||
100 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
101 | ctx.helper.success({ | ||
102 | ctx, | ||
103 | data, | ||
104 | }); | ||
105 | } | ||
106 | async asyncAccount() { | ||
107 | const { ctx, config } = this; | ||
108 | const limit = 100; | ||
109 | let asyncCount = 0; | ||
110 | let errAsyncAccount = 0; | ||
111 | let balanceIsZero = 0; | ||
112 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
113 | if (data.success) { | ||
114 | const length = Math.ceil(data.count / 100); | ||
115 | console.log(data.count) | ||
116 | for (let index = 0; index < length; index++) { | ||
117 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
118 | console.log(acountList) | ||
119 | if (acountList.success) { | ||
120 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
121 | const element = acountList.accounts[index]; | ||
122 | if (element.balance == 0) { | ||
123 | balanceIsZero++ | ||
124 | continue; | ||
125 | } | ||
126 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
127 | if (!result) { | ||
128 | errAsyncAccount++; | ||
129 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
130 | } else { | ||
131 | asyncCount++; | ||
132 | } | ||
133 | } | ||
134 | } else { | ||
135 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
136 | } | ||
137 | } | ||
138 | } else { | ||
139 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
140 | } | ||
141 | ctx.helper.success({ | ||
142 | ctx, | ||
143 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
144 | }); | ||
145 | } | ||
146 | } | ||
147 | |||
148 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData=require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async getBalance() { | ||
67 | console.log(accountData) | ||
68 | const { ctx, config } = this; | ||
69 | const query = ctx.request.query; | ||
70 | const rule = { | ||
71 | address: { type: 'string' }, | ||
72 | }; | ||
73 | console.log(query); | ||
74 | try { | ||
75 | ctx.validate(rule, query); | ||
76 | } catch (error) { | ||
77 | console.log(error); | ||
78 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
79 | return; | ||
80 | } | ||
81 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
82 | ctx.helper.success({ | ||
83 | ctx, | ||
84 | data, | ||
85 | }); | ||
86 | } | ||
87 | async getTransaction() { | ||
88 | const { ctx, config } = this; | ||
89 | const query = ctx.request.query; | ||
90 | const rule = { | ||
91 | address: { type: 'string' }, | ||
92 | }; | ||
93 | console.log(query); | ||
94 | try { | ||
95 | ctx.validate(rule, query); | ||
96 | } catch (error) { | ||
97 | console.log(error); | ||
98 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
99 | return; | ||
100 | } | ||
101 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
102 | ctx.helper.success({ | ||
103 | ctx, | ||
104 | data, | ||
105 | }); | ||
106 | } | ||
107 | async asyncAccount() { | ||
108 | const { ctx, config } = this; | ||
109 | const limit = 100; | ||
110 | let asyncCount = 0; | ||
111 | let errAsyncAccount = 0; | ||
112 | let balanceIsZero = 0; | ||
113 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
114 | if (data.success) { | ||
115 | const length = Math.ceil(data.count / 100); | ||
116 | console.log(data.count) | ||
117 | for (let index = 0; index < length; index++) { | ||
118 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
119 | console.log(acountList) | ||
120 | if (acountList.success) { | ||
121 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
122 | const element = acountList.accounts[index]; | ||
123 | if (element.balance == 0) { | ||
124 | balanceIsZero++ | ||
125 | continue; | ||
126 | } | ||
127 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
128 | if (!result) { | ||
129 | errAsyncAccount++; | ||
130 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
131 | } else { | ||
132 | asyncCount++; | ||
133 | } | ||
134 | } | ||
135 | } else { | ||
136 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
137 | } | ||
138 | } | ||
139 | } else { | ||
140 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
141 | } | ||
142 | ctx.helper.success({ | ||
143 | ctx, | ||
144 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
145 | }); | ||
146 | } | ||
147 | } | ||
148 | |||
149 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData=require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async getBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async getTransaction() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | console.log(query); | ||
93 | try { | ||
94 | ctx.validate(rule, query); | ||
95 | } catch (error) { | ||
96 | console.log(error); | ||
97 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
98 | return; | ||
99 | } | ||
100 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
101 | ctx.helper.success({ | ||
102 | ctx, | ||
103 | data, | ||
104 | }); | ||
105 | } | ||
106 | async asyncAccount() { | ||
107 | const { ctx, config } = this; | ||
108 | const limit = 100; | ||
109 | let asyncCount = 0; | ||
110 | let errAsyncAccount = 0; | ||
111 | let balanceIsZero = 0; | ||
112 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
113 | if (data.success) { | ||
114 | const length = Math.ceil(data.count / 100); | ||
115 | console.log(data.count) | ||
116 | for (let index = 0; index < length; index++) { | ||
117 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
118 | console.log(acountList) | ||
119 | if (acountList.success) { | ||
120 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
121 | const element = acountList.accounts[index]; | ||
122 | if (element.balance == 0) { | ||
123 | balanceIsZero++ | ||
124 | continue; | ||
125 | } | ||
126 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
127 | if (!result) { | ||
128 | errAsyncAccount++; | ||
129 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
130 | } else { | ||
131 | asyncCount++; | ||
132 | } | ||
133 | } | ||
134 | } else { | ||
135 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
136 | } | ||
137 | } | ||
138 | } else { | ||
139 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
140 | } | ||
141 | ctx.helper.success({ | ||
142 | ctx, | ||
143 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
144 | }); | ||
145 | } | ||
146 | } | ||
147 | |||
148 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async getBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async haveBalance() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | let balance | ||
100 | const result = accountData.RECORDS.some(item => { | ||
101 | if (item.address === query.address && item.balance > 0) { | ||
102 | balance = item.balance | ||
103 | return true | ||
104 | } | ||
105 | }) | ||
106 | |||
107 | ctx.helper.success({ | ||
108 | ctx, | ||
109 | data: { | ||
110 | balance | ||
111 | }, | ||
112 | }); | ||
113 | } | ||
114 | async getTransaction() { | ||
115 | const { ctx, config } = this; | ||
116 | const query = ctx.request.query; | ||
117 | const rule = { | ||
118 | address: { type: 'string' }, | ||
119 | }; | ||
120 | console.log(query); | ||
121 | try { | ||
122 | ctx.validate(rule, query); | ||
123 | } catch (error) { | ||
124 | console.log(error); | ||
125 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
126 | return; | ||
127 | } | ||
128 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
129 | ctx.helper.success({ | ||
130 | ctx, | ||
131 | data, | ||
132 | }); | ||
133 | } | ||
134 | async asyncAccount() { | ||
135 | const { ctx, config } = this; | ||
136 | const limit = 100; | ||
137 | let asyncCount = 0; | ||
138 | let errAsyncAccount = 0; | ||
139 | let balanceIsZero = 0; | ||
140 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
141 | if (data.success) { | ||
142 | const length = Math.ceil(data.count / 100); | ||
143 | console.log(data.count) | ||
144 | for (let index = 0; index < length; index++) { | ||
145 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
146 | console.log(acountList) | ||
147 | if (acountList.success) { | ||
148 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
149 | const element = acountList.accounts[index]; | ||
150 | if (element.balance == 0) { | ||
151 | balanceIsZero++ | ||
152 | continue; | ||
153 | } | ||
154 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
155 | if (!result) { | ||
156 | errAsyncAccount++; | ||
157 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
158 | } else { | ||
159 | asyncCount++; | ||
160 | } | ||
161 | } | ||
162 | } else { | ||
163 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
164 | } | ||
165 | } | ||
166 | } else { | ||
167 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
168 | } | ||
169 | ctx.helper.success({ | ||
170 | ctx, | ||
171 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
172 | }); | ||
173 | } | ||
174 | } | ||
175 | |||
176 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async getBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async haveBalance() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | let balance | ||
100 | const result = accountData.RECORDS.some(item => { | ||
101 | if (item.address === query.address && item.balance > 0) { | ||
102 | balance = item.balance | ||
103 | return true | ||
104 | } | ||
105 | }) | ||
106 | if (result) { | ||
107 | ctx.helper.success({ | ||
108 | ctx, | ||
109 | data: { | ||
110 | balance | ||
111 | }, | ||
112 | }); | ||
113 | } else { | ||
114 | ctx.helper.err({ | ||
115 | ctx, | ||
116 | data: { | ||
117 | balance | ||
118 | }, | ||
119 | }); | ||
120 | } | ||
121 | |||
122 | } | ||
123 | async getTransaction() { | ||
124 | const { ctx, config } = this; | ||
125 | const query = ctx.request.query; | ||
126 | const rule = { | ||
127 | address: { type: 'string' }, | ||
128 | }; | ||
129 | console.log(query); | ||
130 | try { | ||
131 | ctx.validate(rule, query); | ||
132 | } catch (error) { | ||
133 | console.log(error); | ||
134 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
135 | return; | ||
136 | } | ||
137 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
138 | ctx.helper.success({ | ||
139 | ctx, | ||
140 | data, | ||
141 | }); | ||
142 | } | ||
143 | async asyncAccount() { | ||
144 | const { ctx, config } = this; | ||
145 | const limit = 100; | ||
146 | let asyncCount = 0; | ||
147 | let errAsyncAccount = 0; | ||
148 | let balanceIsZero = 0; | ||
149 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
150 | if (data.success) { | ||
151 | const length = Math.ceil(data.count / 100); | ||
152 | console.log(data.count) | ||
153 | for (let index = 0; index < length; index++) { | ||
154 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
155 | console.log(acountList) | ||
156 | if (acountList.success) { | ||
157 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
158 | const element = acountList.accounts[index]; | ||
159 | if (element.balance == 0) { | ||
160 | balanceIsZero++ | ||
161 | continue; | ||
162 | } | ||
163 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
164 | if (!result) { | ||
165 | errAsyncAccount++; | ||
166 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
167 | } else { | ||
168 | asyncCount++; | ||
169 | } | ||
170 | } | ||
171 | } else { | ||
172 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
173 | } | ||
174 | } | ||
175 | } else { | ||
176 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
177 | } | ||
178 | ctx.helper.success({ | ||
179 | ctx, | ||
180 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
181 | }); | ||
182 | } | ||
183 | } | ||
184 | |||
185 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async getBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async haveBalance() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | let balance | ||
100 | const result = accountData.RECORDS.some(item => { | ||
101 | if (item.address === query.address && item.balance > 0) { | ||
102 | balance = item.balance | ||
103 | return true | ||
104 | } | ||
105 | }) | ||
106 | ctx.helper.success({ | ||
107 | ctx, | ||
108 | data: { | ||
109 | balance | ||
110 | }, | ||
111 | }); | ||
112 | |||
113 | |||
114 | } | ||
115 | async getTransaction() { | ||
116 | const { ctx, config } = this; | ||
117 | const query = ctx.request.query; | ||
118 | const rule = { | ||
119 | address: { type: 'string' }, | ||
120 | }; | ||
121 | console.log(query); | ||
122 | try { | ||
123 | ctx.validate(rule, query); | ||
124 | } catch (error) { | ||
125 | console.log(error); | ||
126 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
127 | return; | ||
128 | } | ||
129 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
130 | ctx.helper.success({ | ||
131 | ctx, | ||
132 | data, | ||
133 | }); | ||
134 | } | ||
135 | async asyncAccount() { | ||
136 | const { ctx, config } = this; | ||
137 | const limit = 100; | ||
138 | let asyncCount = 0; | ||
139 | let errAsyncAccount = 0; | ||
140 | let balanceIsZero = 0; | ||
141 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
142 | if (data.success) { | ||
143 | const length = Math.ceil(data.count / 100); | ||
144 | console.log(data.count) | ||
145 | for (let index = 0; index < length; index++) { | ||
146 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
147 | console.log(acountList) | ||
148 | if (acountList.success) { | ||
149 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
150 | const element = acountList.accounts[index]; | ||
151 | if (element.balance == 0) { | ||
152 | balanceIsZero++ | ||
153 | continue; | ||
154 | } | ||
155 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
156 | if (!result) { | ||
157 | errAsyncAccount++; | ||
158 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
159 | } else { | ||
160 | asyncCount++; | ||
161 | } | ||
162 | } | ||
163 | } else { | ||
164 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
165 | } | ||
166 | } | ||
167 | } else { | ||
168 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
169 | } | ||
170 | ctx.helper.success({ | ||
171 | ctx, | ||
172 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
173 | }); | ||
174 | } | ||
175 | } | ||
176 | |||
177 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async haveBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async getBalance() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | let balance | ||
100 | const result = accountData.RECORDS.some(item => { | ||
101 | if (item.address === query.address && item.balance > 0) { | ||
102 | balance = item.balance | ||
103 | return true | ||
104 | } | ||
105 | }) | ||
106 | ctx.helper.success({ | ||
107 | ctx, | ||
108 | data: { | ||
109 | balance | ||
110 | }, | ||
111 | }); | ||
112 | |||
113 | |||
114 | } | ||
115 | async getTransaction() { | ||
116 | const { ctx, config } = this; | ||
117 | const query = ctx.request.query; | ||
118 | const rule = { | ||
119 | address: { type: 'string' }, | ||
120 | }; | ||
121 | console.log(query); | ||
122 | try { | ||
123 | ctx.validate(rule, query); | ||
124 | } catch (error) { | ||
125 | console.log(error); | ||
126 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
127 | return; | ||
128 | } | ||
129 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
130 | ctx.helper.success({ | ||
131 | ctx, | ||
132 | data, | ||
133 | }); | ||
134 | } | ||
135 | async asyncAccount() { | ||
136 | const { ctx, config } = this; | ||
137 | const limit = 100; | ||
138 | let asyncCount = 0; | ||
139 | let errAsyncAccount = 0; | ||
140 | let balanceIsZero = 0; | ||
141 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
142 | if (data.success) { | ||
143 | const length = Math.ceil(data.count / 100); | ||
144 | console.log(data.count) | ||
145 | for (let index = 0; index < length; index++) { | ||
146 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
147 | console.log(acountList) | ||
148 | if (acountList.success) { | ||
149 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
150 | const element = acountList.accounts[index]; | ||
151 | if (element.balance == 0) { | ||
152 | balanceIsZero++ | ||
153 | continue; | ||
154 | } | ||
155 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
156 | if (!result) { | ||
157 | errAsyncAccount++; | ||
158 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
159 | } else { | ||
160 | asyncCount++; | ||
161 | } | ||
162 | } | ||
163 | } else { | ||
164 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
165 | } | ||
166 | } | ||
167 | } else { | ||
168 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
169 | } | ||
170 | ctx.helper.success({ | ||
171 | ctx, | ||
172 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
173 | }); | ||
174 | } | ||
175 | } | ||
176 | |||
177 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async haveBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async getBalance() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | let balance=0 | ||
100 | const result = accountData.RECORDS.some(item => { | ||
101 | if (item.address === query.address && item.balance > 0) { | ||
102 | balance = item.balance | ||
103 | return true | ||
104 | } | ||
105 | }) | ||
106 | ctx.helper.success({ | ||
107 | ctx, | ||
108 | data: { | ||
109 | balance | ||
110 | }, | ||
111 | }); | ||
112 | |||
113 | |||
114 | } | ||
115 | async getTransaction() { | ||
116 | const { ctx, config } = this; | ||
117 | const query = ctx.request.query; | ||
118 | const rule = { | ||
119 | address: { type: 'string' }, | ||
120 | }; | ||
121 | console.log(query); | ||
122 | try { | ||
123 | ctx.validate(rule, query); | ||
124 | } catch (error) { | ||
125 | console.log(error); | ||
126 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
127 | return; | ||
128 | } | ||
129 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
130 | ctx.helper.success({ | ||
131 | ctx, | ||
132 | data, | ||
133 | }); | ||
134 | } | ||
135 | async asyncAccount() { | ||
136 | const { ctx, config } = this; | ||
137 | const limit = 100; | ||
138 | let asyncCount = 0; | ||
139 | let errAsyncAccount = 0; | ||
140 | let balanceIsZero = 0; | ||
141 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
142 | if (data.success) { | ||
143 | const length = Math.ceil(data.count / 100); | ||
144 | console.log(data.count) | ||
145 | for (let index = 0; index < length; index++) { | ||
146 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
147 | console.log(acountList) | ||
148 | if (acountList.success) { | ||
149 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
150 | const element = acountList.accounts[index]; | ||
151 | if (element.balance == 0) { | ||
152 | balanceIsZero++ | ||
153 | continue; | ||
154 | } | ||
155 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
156 | if (!result) { | ||
157 | errAsyncAccount++; | ||
158 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
159 | } else { | ||
160 | asyncCount++; | ||
161 | } | ||
162 | } | ||
163 | } else { | ||
164 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
165 | } | ||
166 | } | ||
167 | } else { | ||
168 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
169 | } | ||
170 | ctx.helper.success({ | ||
171 | ctx, | ||
172 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
173 | }); | ||
174 | } | ||
175 | } | ||
176 | |||
177 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | if (!oldNetData || !oldNetData.success) { | ||
35 | ctx.helper.err({ | ||
36 | ctx, | ||
37 | data: oldNetData, | ||
38 | }); | ||
39 | return; | ||
40 | } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async haveBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async getBalance() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | let balance = 0 | ||
100 | const result = accountData.RECORDS.some(item => { | ||
101 | if (item.address === query.address && item.balance > 0) { | ||
102 | balance = item.balance | ||
103 | return true | ||
104 | } | ||
105 | }) | ||
106 | ctx.helper.success({ | ||
107 | ctx, | ||
108 | data: { | ||
109 | account: { balance } | ||
110 | }, | ||
111 | }); | ||
112 | |||
113 | |||
114 | } | ||
115 | async getTransaction() { | ||
116 | const { ctx, config } = this; | ||
117 | const query = ctx.request.query; | ||
118 | const rule = { | ||
119 | address: { type: 'string' }, | ||
120 | }; | ||
121 | console.log(query); | ||
122 | try { | ||
123 | ctx.validate(rule, query); | ||
124 | } catch (error) { | ||
125 | console.log(error); | ||
126 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
127 | return; | ||
128 | } | ||
129 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
130 | ctx.helper.success({ | ||
131 | ctx, | ||
132 | data, | ||
133 | }); | ||
134 | } | ||
135 | async asyncAccount() { | ||
136 | const { ctx, config } = this; | ||
137 | const limit = 100; | ||
138 | let asyncCount = 0; | ||
139 | let errAsyncAccount = 0; | ||
140 | let balanceIsZero = 0; | ||
141 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
142 | if (data.success) { | ||
143 | const length = Math.ceil(data.count / 100); | ||
144 | console.log(data.count) | ||
145 | for (let index = 0; index < length; index++) { | ||
146 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
147 | console.log(acountList) | ||
148 | if (acountList.success) { | ||
149 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
150 | const element = acountList.accounts[index]; | ||
151 | if (element.balance == 0) { | ||
152 | balanceIsZero++ | ||
153 | continue; | ||
154 | } | ||
155 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
156 | if (!result) { | ||
157 | errAsyncAccount++; | ||
158 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
159 | } else { | ||
160 | asyncCount++; | ||
161 | } | ||
162 | } | ||
163 | } else { | ||
164 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
165 | } | ||
166 | } | ||
167 | } else { | ||
168 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
169 | } | ||
170 | ctx.helper.success({ | ||
171 | ctx, | ||
172 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
173 | }); | ||
174 | } | ||
175 | } | ||
176 | |||
177 | module.exports = TransferController; |
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | // const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | // console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | // if (!oldNetData || !oldNetData.success) { | ||
35 | // ctx.helper.err({ | ||
36 | // ctx, | ||
37 | // data: oldNetData, | ||
38 | // }); | ||
39 | // return; | ||
40 | // } | ||
41 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
42 | ctx.helper.success({ | ||
43 | ctx, | ||
44 | data: result, | ||
45 | }); | ||
46 | |||
47 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
48 | // const trs = JSON.stringify({ transaction }); | ||
49 | // // 上链操作 | ||
50 | // const data = await this.service.sdk.pushTransaction(trs); | ||
51 | // if (data.success) { | ||
52 | // ctx.helper.success({ | ||
53 | // ctx, | ||
54 | // data, | ||
55 | // }); | ||
56 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
57 | // } else { | ||
58 | // ctx.helper.err({ | ||
59 | // ctx, | ||
60 | // data, | ||
61 | // }); | ||
62 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
63 | // } | ||
64 | |||
65 | } | ||
66 | async haveBalance() { | ||
67 | const { ctx, config } = this; | ||
68 | const query = ctx.request.query; | ||
69 | const rule = { | ||
70 | address: { type: 'string' }, | ||
71 | }; | ||
72 | console.log(query); | ||
73 | try { | ||
74 | ctx.validate(rule, query); | ||
75 | } catch (error) { | ||
76 | console.log(error); | ||
77 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
78 | return; | ||
79 | } | ||
80 | const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
81 | ctx.helper.success({ | ||
82 | ctx, | ||
83 | data, | ||
84 | }); | ||
85 | } | ||
86 | async getBalance() { | ||
87 | const { ctx, config } = this; | ||
88 | const query = ctx.request.query; | ||
89 | const rule = { | ||
90 | address: { type: 'string' }, | ||
91 | }; | ||
92 | try { | ||
93 | ctx.validate(rule, query); | ||
94 | } catch (error) { | ||
95 | console.log(error); | ||
96 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
97 | return; | ||
98 | } | ||
99 | let balance = 0 | ||
100 | const result = accountData.RECORDS.some(item => { | ||
101 | if (item.address === query.address && item.balance > 0) { | ||
102 | balance = item.balance | ||
103 | return true | ||
104 | } | ||
105 | }) | ||
106 | ctx.helper.success({ | ||
107 | ctx, | ||
108 | data: { | ||
109 | account: { balance } | ||
110 | }, | ||
111 | }); | ||
112 | |||
113 | |||
114 | } | ||
115 | async getTransaction() { | ||
116 | const { ctx, config } = this; | ||
117 | const query = ctx.request.query; | ||
118 | const rule = { | ||
119 | address: { type: 'string' }, | ||
120 | }; | ||
121 | console.log(query); | ||
122 | try { | ||
123 | ctx.validate(rule, query); | ||
124 | } catch (error) { | ||
125 | console.log(error); | ||
126 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
127 | return; | ||
128 | } | ||
129 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
130 | ctx.helper.success({ | ||
131 | ctx, | ||
132 | data, | ||
133 | }); | ||
134 | } | ||
135 | async asyncAccount() { | ||
136 | const { ctx, config } = this; | ||
137 | const limit = 100; | ||
138 | let asyncCount = 0; | ||
139 | let errAsyncAccount = 0; | ||
140 | let balanceIsZero = 0; | ||
141 | const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
142 | if (data.success) { | ||
143 | const length = Math.ceil(data.count / 100); | ||
144 | console.log(data.count) | ||
145 | for (let index = 0; index < length; index++) { | ||
146 | const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
147 | console.log(acountList) | ||
148 | if (acountList.success) { | ||
149 | for (let index = 0; index < acountList.accounts.length; index++) { | ||
150 | const element = acountList.accounts[index]; | ||
151 | if (element.balance == 0) { | ||
152 | balanceIsZero++ | ||
153 | continue; | ||
154 | } | ||
155 | const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
156 | if (!result) { | ||
157 | errAsyncAccount++; | ||
158 | this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
159 | } else { | ||
160 | asyncCount++; | ||
161 | } | ||
162 | } | ||
163 | } else { | ||
164 | this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
165 | } | ||
166 | } | ||
167 | } else { | ||
168 | this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
169 | } | ||
170 | ctx.helper.success({ | ||
171 | ctx, | ||
172 | data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
173 | }); | ||
174 | } | ||
175 | } | ||
176 | |||
177 | module.exports = TransferController; |
.history/app/extend/helper_20220215085855.js
0 → 100644
File mode changed
.history/app/extend/helper_20220215085858.js
0 → 100644
1 | 'use strict'; | ||
2 | const moment = require('moment'); | ||
3 | |||
4 | module.exports = { | ||
5 | |||
6 | /** | ||
7 | * 对象拼接为字符串 | ||
8 | * @param {object} object 待拼接的hash对象 | ||
9 | */ | ||
10 | concatHash(object) { | ||
11 | const keys = Object.keys(object).sort(); | ||
12 | let paramsStr = ''; | ||
13 | for (let index = 0; index < keys.length; index++) { | ||
14 | const key = keys[index]; | ||
15 | let value = object[key]; | ||
16 | // object参数类型转换为string | ||
17 | if (typeof (value) === 'object') { | ||
18 | value = JSON.stringify(value); | ||
19 | } | ||
20 | paramsStr = paramsStr + `${key}${value}`; | ||
21 | } | ||
22 | return paramsStr; | ||
23 | }, | ||
24 | err({ ctx, code, err, status }) { | ||
25 | ctx.body = { | ||
26 | success: false, | ||
27 | code: code || 1, | ||
28 | err, | ||
29 | }; | ||
30 | ctx.status = status || 200; | ||
31 | }, | ||
32 | |||
33 | // 优化错误信息可读性 | ||
34 | errorReadable(e) { | ||
35 | switch (e.code) { | ||
36 | case 'invalid_param': { // 参数错误 | ||
37 | const errorHash = { | ||
38 | missing_field: '缺失', | ||
39 | }; | ||
40 | let msg = ''; | ||
41 | for (let i = 0; i < e.errors.length; i++) { | ||
42 | msg += '参数' + e.errors[i].field + ' ' + (errorHash[e.errors[i].code] || e.errors[i].message) + ';'; | ||
43 | } | ||
44 | return msg; | ||
45 | } | ||
46 | default: | ||
47 | console.log('未优化类型错误!'); | ||
48 | return JSON.stringify(e); | ||
49 | } | ||
50 | }, | ||
51 | |||
52 | success({ ctx, data, status }) { | ||
53 | ctx.body = { | ||
54 | success: true, | ||
55 | code: 0, | ||
56 | data, | ||
57 | }; | ||
58 | ctx.status = status || 200; | ||
59 | }, | ||
60 | |||
61 | async verifySign(ctx) { | ||
62 | const authorization = ctx.request.headers.authorization; | ||
63 | const timestamp = ctx.request.headers.timestamp; | ||
64 | const publicKey = ctx.request.headers.publickey; | ||
65 | if (!timestamp) { | ||
66 | this.err({ | ||
67 | ctx, | ||
68 | err: 'hearder: timestamp不能为空', | ||
69 | }); | ||
70 | return false; | ||
71 | } | ||
72 | if (!authorization) { | ||
73 | this.err({ | ||
74 | ctx, | ||
75 | err: 'hearder: authorization不能为空', | ||
76 | }); | ||
77 | return false; | ||
78 | } | ||
79 | if (!publicKey) { | ||
80 | this.err({ | ||
81 | ctx, | ||
82 | err: 'hearder: publicKey不能为空', | ||
83 | }); | ||
84 | return false; | ||
85 | } | ||
86 | // 验证时间不大于5秒 | ||
87 | const time = moment().valueOf(); | ||
88 | if (Math.abs(Number(timestamp) - time) > (ctx.app.config.timeEquation || 5000)) { | ||
89 | ctx.body = { | ||
90 | code: 1, | ||
91 | err: '签名超时', | ||
92 | }; | ||
93 | return false; | ||
94 | } | ||
95 | |||
96 | // 验证签名 | ||
97 | // 1. 获取请求者公钥 | ||
98 | const platformKey = await ctx.model.PlatformKey.findOne({ where: { publicKey } }); | ||
99 | if (!platformKey) { | ||
100 | ctx.body = { | ||
101 | code: 1, | ||
102 | err: 'publicKey不存在', | ||
103 | }; | ||
104 | return false; | ||
105 | } | ||
106 | if (!platformKey.usable) { | ||
107 | ctx.body = { | ||
108 | code: 1, | ||
109 | err: '密钥对不可用', | ||
110 | }; | ||
111 | return; | ||
112 | } | ||
113 | |||
114 | // 2. 对签名进行验证 | ||
115 | |||
116 | // 2.1 合并参数并排序组合拼接 | ||
117 | const allParams = { ...ctx.params, ...ctx.request.query, ...ctx.request.body, timestamp }; | ||
118 | const paramsStr = this.concatHash(allParams); | ||
119 | |||
120 | const verify = this.service.sdk.gm.sm2VerifySign(paramsStr, authorization, publicKey); | ||
121 | // 3. 比对时间戳 | ||
122 | if (!verify) { | ||
123 | ctx.body = { | ||
124 | code: 1, | ||
125 | err: '签名无效', | ||
126 | }; | ||
127 | return false; | ||
128 | } | ||
129 | // 记录当前媒体平台 | ||
130 | ctx.platformId = platformKey.platformId; | ||
131 | return true; | ||
132 | }, | ||
133 | |||
134 | }; |
File mode changed
1 | 'use strict'; | ||
2 | |||
3 | module.exports = app => { | ||
4 | const { STRING, DATE, UUID, UUIDV1, JSON } = app.Sequelize; | ||
5 | |||
6 | const Account = app.model.define('transfer', { | ||
7 | id: { | ||
8 | allowNull: false, | ||
9 | primaryKey: true, | ||
10 | type: UUID, | ||
11 | defaultValue: UUIDV1, | ||
12 | }, | ||
13 | address: { type: STRING, comment: '地址' }, | ||
14 | toAddress: { type: STRING, comment: '接收地址' }, | ||
15 | amount: { type: STRING, comment: '金额' }, | ||
16 | transaction: { type: JSON, comment: '交易体' }, | ||
17 | createdAt: { type: DATE }, | ||
18 | updatedAt: { type: DATE }, | ||
19 | }); | ||
20 | return Account; | ||
21 | }; |
1 | 'use strict'; | ||
2 | |||
3 | module.exports = app => { | ||
4 | const { STRING, DATE, UUID, UUIDV1, JSON, BOOLEAN } = app.Sequelize; | ||
5 | |||
6 | const Account = app.model.define('transfer', { | ||
7 | id: { | ||
8 | allowNull: false, | ||
9 | primaryKey: true, | ||
10 | type: UUID, | ||
11 | defaultValue: UUIDV1, | ||
12 | }, | ||
13 | address: { type: STRING, comment: '地址' }, | ||
14 | toAddress: { type: STRING, comment: '接收地址' }, | ||
15 | amount: { type: STRING, comment: '金额' }, | ||
16 | transaction: { type: JSON, comment: '交易体' }, | ||
17 | finish: { type: BOOLEAN, comment: '是否完成' }, | ||
18 | createdAt: { type: DATE }, | ||
19 | updatedAt: { type: DATE }, | ||
20 | }); | ||
21 | return Account; | ||
22 | }; |
.history/app/router_20220521220804.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | /** | ||
4 | * @param {Egg.Application} app - egg application | ||
5 | */ | ||
6 | module.exports = app => { | ||
7 | const { router, controller } = app; | ||
8 | router.post('/upgrade/transfer/postTransaction', controller.transfer.postTransaction); | ||
9 | router.get('/upgrade/transfer/getBanlance', controller.transfer.getBalance); | ||
10 | router.get('/upgrade/transfer/transaction', controller.transfer.getTransaction); | ||
11 | router.get('/upgrade/transfer/async', controller.transfer.asyncAccount); | ||
12 | }; |
.history/app/router_20220522103212.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | /** | ||
4 | * @param {Egg.Application} app - egg application | ||
5 | */ | ||
6 | module.exports = app => { | ||
7 | const { router, controller } = app; | ||
8 | router.post('/upgrade/transfer/postTransaction', controller.transfer.postTransaction); | ||
9 | router.get('/upgrade/transfer/getBanlance', controller.transfer.getBalance); | ||
10 | router.get('/upgrade/transfer/haveBalance', controller.transfer.haveBalance); | ||
11 | router.get('/upgrade/transfer/transaction', controller.transfer.getTransaction); | ||
12 | router.get('/upgrade/transfer/async', controller.transfer.asyncAccount); | ||
13 | }; |
1 | // eslint-disable-next-line strict | ||
2 | const Subscription = require('egg').Subscription; | ||
3 | const nodeSdk = require('@ddn/node-sdk').default; | ||
4 | class Transfer extends Subscription { | ||
5 | static get schedule() { | ||
6 | return { | ||
7 | interval: '10s', | ||
8 | type: 'worker', | ||
9 | }; | ||
10 | } | ||
11 | |||
12 | async subscribe() { | ||
13 | const { ctx, config } = this; | ||
14 | const trsData = await ctx.model.Transfer.findAll({ where: { finish: false } }); | ||
15 | console.log(trsData) | ||
16 | trsData.map(async item => { | ||
17 | if (item.id != "e2475660-9942-11ec-b873-171b64126906") { | ||
18 | return | ||
19 | } | ||
20 | const transaction = await nodeSdk.transaction.createTransaction(item.toAddress, item.amount, item.remark || '网络升级转账', config.naclSecret); | ||
21 | const trs = JSON.stringify({ transaction }); | ||
22 | // 上链操作 | ||
23 | const data = await this.service.sdk.pushTransaction(trs); | ||
24 | if (data.success) { | ||
25 | ctx.model.Transfer.update({ finish: true }, { where: { id: item.id } }); | ||
26 | } else { | ||
27 | ctx.model.Transfer.update({ finish: false }, { where: { id: item.id } }); | ||
28 | } | ||
29 | }); | ||
30 | } | ||
31 | } | ||
32 | |||
33 | module.exports = Transfer; |
1 | // eslint-disable-next-line strict | ||
2 | const Subscription = require('egg').Subscription; | ||
3 | const nodeSdk = require('@ddn/node-sdk').default; | ||
4 | class Transfer extends Subscription { | ||
5 | static get schedule() { | ||
6 | return { | ||
7 | interval: '10s', | ||
8 | type: 'worker', | ||
9 | }; | ||
10 | } | ||
11 | |||
12 | async subscribe() { | ||
13 | const { ctx, config } = this; | ||
14 | const trsData = await ctx.model.Transfer.findAll({ where: { finish: false } }); | ||
15 | console.log(trsData) | ||
16 | trsData.map(async item => { | ||
17 | // if (item.id != "e2475660-9942-11ec-b873-171b64126906") { | ||
18 | // return | ||
19 | // } | ||
20 | const transaction = await nodeSdk.transaction.createTransaction(item.toAddress, item.amount, item.remark || '网络升级转账', config.naclSecret); | ||
21 | const trs = JSON.stringify({ transaction }); | ||
22 | // 上链操作 | ||
23 | const data = await this.service.sdk.pushTransaction(trs); | ||
24 | if (data.success) { | ||
25 | ctx.model.Transfer.update({ finish: true }, { where: { id: item.id } }); | ||
26 | } else { | ||
27 | ctx.model.Transfer.update({ finish: false }, { where: { id: item.id } }); | ||
28 | } | ||
29 | }); | ||
30 | } | ||
31 | } | ||
32 | |||
33 | module.exports = Transfer; |
File mode changed
1 | 'use strict'; | ||
2 | |||
3 | const Service = require('egg').Service; | ||
4 | const request = require('request'); | ||
5 | class DdnService extends Service { | ||
6 | |||
7 | // 根据前端传过来的地址查询链上数据 | ||
8 | async getDDNDataByUrl(url) { | ||
9 | const { config } = this; | ||
10 | const result = await new Promise((resolve, reject) => { | ||
11 | request({ | ||
12 | url, | ||
13 | method: 'GET', | ||
14 | headers: { | ||
15 | 'Content-Type': 'application/json', | ||
16 | version: '', | ||
17 | nethash: config.nethash, | ||
18 | }, | ||
19 | }, (error, response, body) => { | ||
20 | if (error) { | ||
21 | reject(error); | ||
22 | } else { | ||
23 | resolve(JSON.parse(body)); | ||
24 | } | ||
25 | }); | ||
26 | }); | ||
27 | return result; | ||
28 | } | ||
29 | async getPeers() { | ||
30 | const { config } = this; | ||
31 | const peer_host = await this.getPeerHost(); | ||
32 | const url = `${peer_host}/api/peers`; | ||
33 | const result = await new Promise(resolve => { | ||
34 | request({ | ||
35 | url, | ||
36 | method: 'GET', | ||
37 | headers: { | ||
38 | 'Content-Type': 'application/json', | ||
39 | version: '', | ||
40 | nethash: config.nethash, | ||
41 | }, | ||
42 | }, (error, response, body) => { | ||
43 | resolve(JSON.parse(body)); | ||
44 | }); | ||
45 | }); | ||
46 | return result; | ||
47 | } | ||
48 | // 区块高度 | ||
49 | async getHeight() { | ||
50 | const { config } = this; | ||
51 | const peer_host = await this.getPeerHost(); | ||
52 | const url = `${peer_host}/api/blocks/getHeight`; | ||
53 | const result = await new Promise(resolve => { | ||
54 | request({ | ||
55 | url, | ||
56 | method: 'GET', | ||
57 | headers: { | ||
58 | 'Content-Type': 'application/json', | ||
59 | version: '', | ||
60 | nethash: config.nethash, | ||
61 | }, | ||
62 | }, (error, response, body) => { | ||
63 | resolve(JSON.parse(body)); | ||
64 | }); | ||
65 | }); | ||
66 | return result; | ||
67 | } | ||
68 | // 交易详情 | ||
69 | async getTransaction(id) { | ||
70 | const { config } = this; | ||
71 | const peer_host = await this.getPeerHost(); | ||
72 | const url = `${peer_host}/api/transactions/get?id=${id}`; | ||
73 | const result = await new Promise(resolve => { | ||
74 | request({ | ||
75 | url, | ||
76 | method: 'GET', | ||
77 | headers: { | ||
78 | 'Content-Type': 'application/json', | ||
79 | version: '', | ||
80 | nethash: config.nethash, | ||
81 | }, | ||
82 | }, (error, response, body) => { | ||
83 | resolve(JSON.parse(body)); | ||
84 | }); | ||
85 | }); | ||
86 | return result; | ||
87 | } | ||
88 | // 交易列表 | ||
89 | async getTransactions(con, page = 1, per_page = 10) { | ||
90 | const { config } = this; | ||
91 | const peer_host = await this.getPeerHost(); | ||
92 | const conditions = []; | ||
93 | if (con.sender_id) { | ||
94 | conditions.push('senderId=' + con.sender_id); | ||
95 | } | ||
96 | if (con.recipient_id) { | ||
97 | conditions.push('recipientId=' + con.recipient_id); | ||
98 | } | ||
99 | conditions.push('limit=' + Number(per_page)); | ||
100 | conditions.push('offset=' + (Number(page) - 1) * Number(per_page)); | ||
101 | const url = `${peer_host}/api/transactions?${conditions.join('&')}`; | ||
102 | const result = await new Promise(resolve => { | ||
103 | request({ | ||
104 | url, | ||
105 | method: 'GET', | ||
106 | headers: { | ||
107 | 'Content-Type': 'application/json', | ||
108 | version: '', | ||
109 | nethash: config.nethash, | ||
110 | }, | ||
111 | }, (error, response, body) => { | ||
112 | resolve(JSON.parse(body)); | ||
113 | }); | ||
114 | }); | ||
115 | return result; | ||
116 | } | ||
117 | |||
118 | // 账户信息 | ||
119 | async getAccount(address) { | ||
120 | const { config } = this; | ||
121 | const peer_host = await this.getPeerHost(); | ||
122 | const url = `${peer_host}/api/accounts?address=${address}`; | ||
123 | const result = await new Promise((resolve, reject) => { | ||
124 | request({ | ||
125 | url, | ||
126 | method: 'GET', | ||
127 | headers: { | ||
128 | 'Content-Type': 'application/json', | ||
129 | version: '', | ||
130 | nethash: config.nethash, | ||
131 | }, | ||
132 | }, (error, response, body) => { | ||
133 | if (error) { | ||
134 | reject(error); | ||
135 | } | ||
136 | resolve(JSON.parse(body)); | ||
137 | }); | ||
138 | }); | ||
139 | return result; | ||
140 | } | ||
141 | |||
142 | // 交易上链 | ||
143 | async pushTransaction(trs) { | ||
144 | const { config } = this; | ||
145 | const peer_host = await this.getPeerHost(); | ||
146 | const url = `${peer_host}/peer/transactions`; | ||
147 | let ddn_result = await new Promise(resolve => { | ||
148 | request({ | ||
149 | url, | ||
150 | method: 'POST', | ||
151 | headers: { | ||
152 | 'Content-Type': 'application/json', | ||
153 | version: '', | ||
154 | nethash: config.nethash, | ||
155 | }, | ||
156 | body: trs, | ||
157 | }, (error, response, body) => { | ||
158 | resolve(body); | ||
159 | }); | ||
160 | }); | ||
161 | ddn_result = JSON.parse(ddn_result); | ||
162 | return ddn_result; | ||
163 | } | ||
164 | |||
165 | // 获取结点地址 | ||
166 | async getPeerHost() { | ||
167 | // const peer_host = await this.service.sdk.redis.get('peer_host'); | ||
168 | // if (!peer_host) { | ||
169 | const res = await this.checkPeerHost(); | ||
170 | return res; | ||
171 | // } | ||
172 | // return peer_host.host; | ||
173 | } | ||
174 | |||
175 | // 检查结点并指定可用结点 | ||
176 | async checkPeerHost() { | ||
177 | const { config } = this; | ||
178 | // const peers = this.config.peer_list; | ||
179 | // const peers = [ 'http://120.24.69.99:8003' ]; | ||
180 | const peers = [ 'http://localhost:8001' ]; | ||
181 | const peers_height = {}; | ||
182 | let max_height = null; | ||
183 | let min_height = null; | ||
184 | let best_peer = null; | ||
185 | for (let i = 0; i < peers.length; i++) { | ||
186 | const url = `${peers[i]}/api/blocks/getstatus`; | ||
187 | const result = await new Promise(resolve => { | ||
188 | request({ | ||
189 | url, | ||
190 | method: 'GET', | ||
191 | headers: { | ||
192 | 'Content-Type': 'application/json', | ||
193 | version: '', | ||
194 | nethash: config.nethash, | ||
195 | }, | ||
196 | }, (error, response, body) => { | ||
197 | if (error) { | ||
198 | resolve({ success: false }); | ||
199 | } else { | ||
200 | resolve(JSON.parse(body)); | ||
201 | } | ||
202 | }); | ||
203 | }); | ||
204 | if (result.success) { | ||
205 | peers_height[peers[i]] = result.height; | ||
206 | if (!max_height || Number(result.height) > Number(max_height)) { | ||
207 | max_height = result.height; | ||
208 | } | ||
209 | if (!min_height || Number(result.height) < Number(min_height)) { | ||
210 | min_height = result.height; | ||
211 | } | ||
212 | if (!best_peer || Number(result.height) === Number(max_height)) { | ||
213 | best_peer = peers[i]; | ||
214 | } | ||
215 | } else { | ||
216 | // 节点不可达,报警 | ||
217 | |||
218 | // has_error = true; | ||
219 | // this.service.sdk.alisms.peerWarning(peers[i].split(/\.|\:/)[4] + 'lost', config.admin_phone); | ||
220 | } | ||
221 | } | ||
222 | // // 高度相差3个,就报警 | ||
223 | // if (max_height - min_height > 3) { | ||
224 | // console.log('高度相差3个,报警'); | ||
225 | // has_error = true; | ||
226 | // this.service.sdk.alisms.peerWarning('HeighGt3', config.admin_phone); | ||
227 | // } | ||
228 | // if (!best_peer) { | ||
229 | // has_error = true; | ||
230 | // this.service.sdk.alisms.peerWarning('noPeer', config.admin_phone); | ||
231 | // } | ||
232 | // // 如果没有异常了,就再次打开监控通知,开始监控和通知 | ||
233 | // if (!has_error) { | ||
234 | // await this.service.sdk.redis.set('peer_warning', { status: 'on' }); | ||
235 | // } | ||
236 | // await this.service.sdk.redis.set('peer_host', { host: best_peer }); | ||
237 | // await this.service.sdk.redis.set('peers_height', peers_height); | ||
238 | return best_peer; | ||
239 | } | ||
240 | |||
241 | |||
242 | } | ||
243 | |||
244 | module.exports = DdnService; |
1 | 'use strict'; | ||
2 | |||
3 | const Service = require('egg').Service; | ||
4 | const request = require('request'); | ||
5 | class DdnService extends Service { | ||
6 | |||
7 | // 根据前端传过来的地址查询链上数据 | ||
8 | async getDDNDataByUrl(url) { | ||
9 | const { config } = this; | ||
10 | const result = await new Promise((resolve, reject) => { | ||
11 | request({ | ||
12 | url, | ||
13 | method: 'GET', | ||
14 | headers: { | ||
15 | 'Content-Type': 'application/json', | ||
16 | version: '', | ||
17 | nethash: config.nethash, | ||
18 | }, | ||
19 | }, (error, response, body) => { | ||
20 | if (error) { | ||
21 | reject(error); | ||
22 | } else { | ||
23 | resolve(JSON.parse(body)); | ||
24 | } | ||
25 | }); | ||
26 | }); | ||
27 | return result; | ||
28 | } | ||
29 | async getPeers() { | ||
30 | const { config } = this; | ||
31 | const peer_host = await this.getPeerHost(); | ||
32 | const url = `${peer_host}/api/peers`; | ||
33 | const result = await new Promise(resolve => { | ||
34 | request({ | ||
35 | url, | ||
36 | method: 'GET', | ||
37 | headers: { | ||
38 | 'Content-Type': 'application/json', | ||
39 | version: '', | ||
40 | nethash: config.nethash, | ||
41 | }, | ||
42 | }, (error, response, body) => { | ||
43 | resolve(JSON.parse(body)); | ||
44 | }); | ||
45 | }); | ||
46 | return result; | ||
47 | } | ||
48 | // 区块高度 | ||
49 | async getHeight() { | ||
50 | const { config } = this; | ||
51 | const peer_host = await this.getPeerHost(); | ||
52 | const url = `${peer_host}/api/blocks/getHeight`; | ||
53 | const result = await new Promise(resolve => { | ||
54 | request({ | ||
55 | url, | ||
56 | method: 'GET', | ||
57 | headers: { | ||
58 | 'Content-Type': 'application/json', | ||
59 | version: '', | ||
60 | nethash: config.nethash, | ||
61 | }, | ||
62 | }, (error, response, body) => { | ||
63 | resolve(JSON.parse(body)); | ||
64 | }); | ||
65 | }); | ||
66 | return result; | ||
67 | } | ||
68 | // 交易详情 | ||
69 | async getTransaction(id) { | ||
70 | const { config } = this; | ||
71 | const peer_host = await this.getPeerHost(); | ||
72 | const url = `${peer_host}/api/transactions/get?id=${id}`; | ||
73 | const result = await new Promise(resolve => { | ||
74 | request({ | ||
75 | url, | ||
76 | method: 'GET', | ||
77 | headers: { | ||
78 | 'Content-Type': 'application/json', | ||
79 | version: '', | ||
80 | nethash: config.nethash, | ||
81 | }, | ||
82 | }, (error, response, body) => { | ||
83 | resolve(JSON.parse(body)); | ||
84 | }); | ||
85 | }); | ||
86 | return result; | ||
87 | } | ||
88 | // 交易列表 | ||
89 | async getTransactions(con, page = 1, per_page = 10) { | ||
90 | const { config } = this; | ||
91 | const peer_host = await this.getPeerHost(); | ||
92 | const conditions = []; | ||
93 | if (con.sender_id) { | ||
94 | conditions.push('senderId=' + con.sender_id); | ||
95 | } | ||
96 | if (con.recipient_id) { | ||
97 | conditions.push('recipientId=' + con.recipient_id); | ||
98 | } | ||
99 | conditions.push('limit=' + Number(per_page)); | ||
100 | conditions.push('offset=' + (Number(page) - 1) * Number(per_page)); | ||
101 | const url = `${peer_host}/api/transactions?${conditions.join('&')}`; | ||
102 | const result = await new Promise(resolve => { | ||
103 | request({ | ||
104 | url, | ||
105 | method: 'GET', | ||
106 | headers: { | ||
107 | 'Content-Type': 'application/json', | ||
108 | version: '', | ||
109 | nethash: config.nethash, | ||
110 | }, | ||
111 | }, (error, response, body) => { | ||
112 | resolve(JSON.parse(body)); | ||
113 | }); | ||
114 | }); | ||
115 | return result; | ||
116 | } | ||
117 | |||
118 | // 账户信息 | ||
119 | async getAccount(address) { | ||
120 | const { config } = this; | ||
121 | const peer_host = await this.getPeerHost(); | ||
122 | const url = `${peer_host}/api/accounts?address=${address}`; | ||
123 | const result = await new Promise((resolve, reject) => { | ||
124 | request({ | ||
125 | url, | ||
126 | method: 'GET', | ||
127 | headers: { | ||
128 | 'Content-Type': 'application/json', | ||
129 | version: '', | ||
130 | nethash: config.nethash, | ||
131 | }, | ||
132 | }, (error, response, body) => { | ||
133 | if (error) { | ||
134 | reject(error); | ||
135 | } | ||
136 | resolve(JSON.parse(body)); | ||
137 | }); | ||
138 | }); | ||
139 | return result; | ||
140 | } | ||
141 | |||
142 | // 交易上链 | ||
143 | async pushTransaction(trs) { | ||
144 | const { config } = this; | ||
145 | const peer_host = await this.getPeerHost(); | ||
146 | const url = `${peer_host}/peer/transactions`; | ||
147 | let ddn_result = await new Promise(resolve => { | ||
148 | request({ | ||
149 | url, | ||
150 | method: 'POST', | ||
151 | headers: { | ||
152 | 'Content-Type': 'application/json', | ||
153 | version: '', | ||
154 | nethash: config.nethash, | ||
155 | }, | ||
156 | body: trs, | ||
157 | }, (error, response, body) => { | ||
158 | resolve(body); | ||
159 | }); | ||
160 | }); | ||
161 | ddn_result = JSON.parse(ddn_result); | ||
162 | return ddn_result; | ||
163 | } | ||
164 | |||
165 | // 获取结点地址 | ||
166 | async getPeerHost() { | ||
167 | // const peer_host = await this.service.sdk.redis.get('peer_host'); | ||
168 | // if (!peer_host) { | ||
169 | const res = await this.checkPeerHost(); | ||
170 | return res; | ||
171 | // } | ||
172 | // return peer_host.host; | ||
173 | } | ||
174 | |||
175 | // 检查结点并指定可用结点 | ||
176 | async checkPeerHost() { | ||
177 | const { config } = this; | ||
178 | // const peers = this.config.peer_list; | ||
179 | // const peers = [ 'http://120.24.69.99:8003' ]; | ||
180 | const peers = ['http://localhost:8001']; | ||
181 | const peers_height = {}; | ||
182 | let max_height = null; | ||
183 | let min_height = null; | ||
184 | let best_peer = null; | ||
185 | for (let i = 0; i < peers.length; i++) { | ||
186 | const url = `${peers[i]}/api/blocks/getstatus`; | ||
187 | const result = await new Promise(resolve => { | ||
188 | request({ | ||
189 | url, | ||
190 | method: 'GET', | ||
191 | headers: { | ||
192 | 'Content-Type': 'application/json', | ||
193 | version: '', | ||
194 | nethash: config.nethash, | ||
195 | }, | ||
196 | }, (error, response, body) => { | ||
197 | if (error) { | ||
198 | resolve({ success: false }); | ||
199 | } else { | ||
200 | resolve(JSON.parse(body)); | ||
201 | } | ||
202 | }); | ||
203 | }); | ||
204 | if (result.success) { | ||
205 | peers_height[peers[i]] = result.height; | ||
206 | if (!max_height || Number(result.height) > Number(max_height)) { | ||
207 | max_height = result.height; | ||
208 | } | ||
209 | if (!min_height || Number(result.height) < Number(min_height)) { | ||
210 | min_height = result.height; | ||
211 | } | ||
212 | if (!best_peer || Number(result.height) === Number(max_height)) { | ||
213 | best_peer = peers[i]; | ||
214 | } | ||
215 | } else { | ||
216 | } | ||
217 | } | ||
218 | |||
219 | return best_peer; | ||
220 | } | ||
221 | |||
222 | |||
223 | } | ||
224 | |||
225 | module.exports = DdnService; |
1 | 'use strict'; | ||
2 | |||
3 | const Service = require('egg').Service; | ||
4 | const request = require('request'); | ||
5 | class DdnService extends Service { | ||
6 | |||
7 | async getPeers() { | ||
8 | const { config } = this; | ||
9 | const peer_host = await this.getPeerHost(); | ||
10 | const url = `${peer_host}/api/peers`; | ||
11 | const result = await new Promise(resolve => { | ||
12 | request({ | ||
13 | url, | ||
14 | method: 'GET', | ||
15 | headers: { | ||
16 | 'Content-Type': 'application/json', | ||
17 | version: '', | ||
18 | nethash: config.nethash, | ||
19 | }, | ||
20 | }, (error, response, body) => { | ||
21 | resolve(JSON.parse(body)); | ||
22 | }); | ||
23 | }); | ||
24 | return result; | ||
25 | } | ||
26 | // 区块高度 | ||
27 | async getHeight() { | ||
28 | const { config } = this; | ||
29 | const peer_host = await this.getPeerHost(); | ||
30 | const url = `${peer_host}/api/blocks/getHeight`; | ||
31 | const result = await new Promise(resolve => { | ||
32 | request({ | ||
33 | url, | ||
34 | method: 'GET', | ||
35 | headers: { | ||
36 | 'Content-Type': 'application/json', | ||
37 | version: '', | ||
38 | nethash: config.nethash, | ||
39 | }, | ||
40 | }, (error, response, body) => { | ||
41 | resolve(JSON.parse(body)); | ||
42 | }); | ||
43 | }); | ||
44 | return result; | ||
45 | } | ||
46 | // 交易详情 | ||
47 | async getTransaction(id) { | ||
48 | const { config } = this; | ||
49 | const peer_host = await this.getPeerHost(); | ||
50 | const url = `${peer_host}/api/transactions/get?id=${id}`; | ||
51 | const result = await new Promise(resolve => { | ||
52 | request({ | ||
53 | url, | ||
54 | method: 'GET', | ||
55 | headers: { | ||
56 | 'Content-Type': 'application/json', | ||
57 | version: '', | ||
58 | nethash: config.nethash, | ||
59 | }, | ||
60 | }, (error, response, body) => { | ||
61 | resolve(JSON.parse(body)); | ||
62 | }); | ||
63 | }); | ||
64 | return result; | ||
65 | } | ||
66 | // 交易列表 | ||
67 | async getTransactions(con, page = 1, per_page = 10) { | ||
68 | const { config } = this; | ||
69 | const peer_host = await this.getPeerHost(); | ||
70 | const conditions = []; | ||
71 | if (con.sender_id) { | ||
72 | conditions.push('senderId=' + con.sender_id); | ||
73 | } | ||
74 | if (con.recipient_id) { | ||
75 | conditions.push('recipientId=' + con.recipient_id); | ||
76 | } | ||
77 | conditions.push('limit=' + Number(per_page)); | ||
78 | conditions.push('offset=' + (Number(page) - 1) * Number(per_page)); | ||
79 | const url = `${peer_host}/api/transactions?${conditions.join('&')}`; | ||
80 | const result = await new Promise(resolve => { | ||
81 | request({ | ||
82 | url, | ||
83 | method: 'GET', | ||
84 | headers: { | ||
85 | 'Content-Type': 'application/json', | ||
86 | version: '', | ||
87 | nethash: config.nethash, | ||
88 | }, | ||
89 | }, (error, response, body) => { | ||
90 | resolve(JSON.parse(body)); | ||
91 | }); | ||
92 | }); | ||
93 | return result; | ||
94 | } | ||
95 | |||
96 | // 账户信息 | ||
97 | async getAccount(address) { | ||
98 | const { config } = this; | ||
99 | const peer_host = await this.getPeerHost(); | ||
100 | const url = `${peer_host}/api/accounts?address=${address}`; | ||
101 | const result = await new Promise((resolve, reject) => { | ||
102 | request({ | ||
103 | url, | ||
104 | method: 'GET', | ||
105 | headers: { | ||
106 | 'Content-Type': 'application/json', | ||
107 | version: '', | ||
108 | nethash: config.nethash, | ||
109 | }, | ||
110 | }, (error, response, body) => { | ||
111 | if (error) { | ||
112 | reject(error); | ||
113 | } | ||
114 | resolve(JSON.parse(body)); | ||
115 | }); | ||
116 | }); | ||
117 | return result; | ||
118 | } | ||
119 | |||
120 | // 交易上链 | ||
121 | async pushTransaction(trs) { | ||
122 | const { config } = this; | ||
123 | const peer_host = await this.getPeerHost(); | ||
124 | const url = `${peer_host}/peer/transactions`; | ||
125 | let ddn_result = await new Promise(resolve => { | ||
126 | request({ | ||
127 | url, | ||
128 | method: 'POST', | ||
129 | headers: { | ||
130 | 'Content-Type': 'application/json', | ||
131 | version: '', | ||
132 | nethash: config.nethash, | ||
133 | }, | ||
134 | body: trs, | ||
135 | }, (error, response, body) => { | ||
136 | resolve(body); | ||
137 | }); | ||
138 | }); | ||
139 | ddn_result = JSON.parse(ddn_result); | ||
140 | return ddn_result; | ||
141 | } | ||
142 | |||
143 | // 获取结点地址 | ||
144 | async getPeerHost() { | ||
145 | // const peer_host = await this.service.sdk.redis.get('peer_host'); | ||
146 | // if (!peer_host) { | ||
147 | const res = await this.checkPeerHost(); | ||
148 | return res; | ||
149 | // } | ||
150 | // return peer_host.host; | ||
151 | } | ||
152 | |||
153 | // 检查结点并指定可用结点 | ||
154 | async checkPeerHost() { | ||
155 | const { config } = this; | ||
156 | // const peers = this.config.peer_list; | ||
157 | // const peers = [ 'http://120.24.69.99:8003' ]; | ||
158 | const peers = ['http://localhost:8001']; | ||
159 | const peers_height = {}; | ||
160 | let max_height = null; | ||
161 | let min_height = null; | ||
162 | let best_peer = null; | ||
163 | for (let i = 0; i < peers.length; i++) { | ||
164 | const url = `${peers[i]}/api/blocks/getstatus`; | ||
165 | const result = await new Promise(resolve => { | ||
166 | request({ | ||
167 | url, | ||
168 | method: 'GET', | ||
169 | headers: { | ||
170 | 'Content-Type': 'application/json', | ||
171 | version: '', | ||
172 | nethash: config.nethash, | ||
173 | }, | ||
174 | }, (error, response, body) => { | ||
175 | if (error) { | ||
176 | resolve({ success: false }); | ||
177 | } else { | ||
178 | resolve(JSON.parse(body)); | ||
179 | } | ||
180 | }); | ||
181 | }); | ||
182 | if (result.success) { | ||
183 | peers_height[peers[i]] = result.height; | ||
184 | if (!max_height || Number(result.height) > Number(max_height)) { | ||
185 | max_height = result.height; | ||
186 | } | ||
187 | if (!min_height || Number(result.height) < Number(min_height)) { | ||
188 | min_height = result.height; | ||
189 | } | ||
190 | if (!best_peer || Number(result.height) === Number(max_height)) { | ||
191 | best_peer = peers[i]; | ||
192 | } | ||
193 | } else { | ||
194 | } | ||
195 | } | ||
196 | |||
197 | return best_peer; | ||
198 | } | ||
199 | |||
200 | |||
201 | } | ||
202 | |||
203 | module.exports = DdnService; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | /** | ||
10 | * built-in config | ||
11 | * @type {Egg.EggAppConfig} | ||
12 | **/ | ||
13 | const config = exports = {}; | ||
14 | |||
15 | // use for cookie sign key, should change to your own and keep security | ||
16 | config.keys = appInfo.name + '_1644800905769_2309'; | ||
17 | |||
18 | // add your middleware config here | ||
19 | config.middleware = []; | ||
20 | |||
21 | // add your user config here | ||
22 | const userConfig = { | ||
23 | // myAppName: 'egg', | ||
24 | }; | ||
25 | |||
26 | return { | ||
27 | ...config, | ||
28 | ...userConfig, | ||
29 | }; | ||
30 | }; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | /** | ||
10 | * built-in config | ||
11 | * @type {Egg.EggAppConfig} | ||
12 | **/ | ||
13 | const config = exports = {}; | ||
14 | |||
15 | // use for cookie sign key, should change to your own and keep security | ||
16 | config.keys = appInfo.name + '_1644800905769_2309'; | ||
17 | |||
18 | // add your middleware config here | ||
19 | config.middleware = []; | ||
20 | |||
21 | config.sequelize = { | ||
22 | host: 'localhost', | ||
23 | port: '5432', | ||
24 | username: 'postgres', | ||
25 | password: 'wawjr1314', | ||
26 | database: 'jh', | ||
27 | dialect: 'postgres', | ||
28 | pool: { | ||
29 | max: 5, | ||
30 | min: 0, | ||
31 | idle: 10000, | ||
32 | }, | ||
33 | logging: true, | ||
34 | }; | ||
35 | |||
36 | // add your user config here | ||
37 | const userConfig = { | ||
38 | // myAppName: 'egg', | ||
39 | }; | ||
40 | |||
41 | return { | ||
42 | ...config, | ||
43 | ...userConfig, | ||
44 | }; | ||
45 | }; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | /** | ||
10 | * built-in config | ||
11 | * @type {Egg.EggAppConfig} | ||
12 | **/ | ||
13 | const config = exports = {}; | ||
14 | |||
15 | // use for cookie sign key, should change to your own and keep security | ||
16 | config.keys = appInfo.name + '_1644800905769_2309'; | ||
17 | |||
18 | // add your middleware config here | ||
19 | config.middleware = []; | ||
20 | |||
21 | config.sequelize = { | ||
22 | host: 'localhost', | ||
23 | port: '5432', | ||
24 | username: 'postgres', | ||
25 | password: 'wawjr1314', | ||
26 | database: 'ddn', | ||
27 | dialect: 'postgres', | ||
28 | pool: { | ||
29 | max: 5, | ||
30 | min: 0, | ||
31 | idle: 10000, | ||
32 | }, | ||
33 | logging: true, | ||
34 | }; | ||
35 | |||
36 | // add your user config here | ||
37 | const userConfig = { | ||
38 | // myAppName: 'egg', | ||
39 | }; | ||
40 | |||
41 | return { | ||
42 | ...config, | ||
43 | ...userConfig, | ||
44 | }; | ||
45 | }; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | /** | ||
10 | * built-in config | ||
11 | * @type {Egg.EggAppConfig} | ||
12 | **/ | ||
13 | const config = exports = {}; | ||
14 | |||
15 | // use for cookie sign key, should change to your own and keep security | ||
16 | config.keys = appInfo.name + '_1644800905769_2309'; | ||
17 | |||
18 | // add your middleware config here | ||
19 | config.middleware = []; | ||
20 | |||
21 | config.sequelize = { | ||
22 | host: 'localhost', | ||
23 | port: '5432', | ||
24 | username: 'postgres', | ||
25 | password: 'wawjr1314', | ||
26 | database: 'ddn', | ||
27 | dialect: 'postgres', | ||
28 | pool: { | ||
29 | max: 5, | ||
30 | min: 0, | ||
31 | idle: 10000, | ||
32 | }, | ||
33 | logging: true, | ||
34 | }; | ||
35 | config.ed25519Address = '', | ||
36 | config.naclAddress = '', | ||
37 | // add your user config here | ||
38 | const userConfig = { | ||
39 | // myAppName: 'egg', | ||
40 | }; | ||
41 | |||
42 | return { | ||
43 | ...config, | ||
44 | ...userConfig, | ||
45 | }; | ||
46 | }; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | /** | ||
10 | * built-in config | ||
11 | * @type {Egg.EggAppConfig} | ||
12 | **/ | ||
13 | const config = exports = {}; | ||
14 | |||
15 | // use for cookie sign key, should change to your own and keep security | ||
16 | config.keys = appInfo.name + '_1644800905769_2309'; | ||
17 | |||
18 | // add your middleware config here | ||
19 | config.middleware = []; | ||
20 | |||
21 | config.sequelize = { | ||
22 | host: 'localhost', | ||
23 | port: '5432', | ||
24 | username: 'postgres', | ||
25 | password: 'wawjr1314', | ||
26 | database: 'ddn', | ||
27 | dialect: 'postgres', | ||
28 | pool: { | ||
29 | max: 5, | ||
30 | min: 0, | ||
31 | idle: 10000, | ||
32 | }, | ||
33 | logging: true, | ||
34 | }; | ||
35 | config.ed25519Address = ''; | ||
36 | config.naclAddress = ''; | ||
37 | // add your user config here | ||
38 | const userConfig = { | ||
39 | // myAppName: 'egg', | ||
40 | }; | ||
41 | |||
42 | return { | ||
43 | ...config, | ||
44 | ...userConfig, | ||
45 | }; | ||
46 | }; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | /** | ||
10 | * built-in config | ||
11 | * @type {Egg.EggAppConfig} | ||
12 | **/ | ||
13 | const config = exports = {}; | ||
14 | |||
15 | // use for cookie sign key, should change to your own and keep security | ||
16 | config.keys = appInfo.name + '_1644800905769_2309'; | ||
17 | |||
18 | // add your middleware config here | ||
19 | config.middleware = []; | ||
20 | |||
21 | config.sequelize = { | ||
22 | host: 'localhost', | ||
23 | port: '5432', | ||
24 | username: 'postgres', | ||
25 | password: 'wawjr1314', | ||
26 | database: 'ddn', | ||
27 | dialect: 'postgres', | ||
28 | pool: { | ||
29 | max: 5, | ||
30 | min: 0, | ||
31 | idle: 10000, | ||
32 | }, | ||
33 | logging: true, | ||
34 | }; | ||
35 | config.ed25519Address = ''; | ||
36 | config.naclAddress = ''; | ||
37 | config.naclSecret = ''; | ||
38 | // add your user config here | ||
39 | const userConfig = { | ||
40 | // myAppName: 'egg', | ||
41 | }; | ||
42 | |||
43 | return { | ||
44 | ...config, | ||
45 | ...userConfig, | ||
46 | }; | ||
47 | }; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | const config = exports = {}; | ||
10 | config.ed25519Address = 'DFy6P2sN1KLDNtppnqLBPWcnH8GTJRouGj'; // 旧网接收钱包地址 | ||
11 | // config.naclAddress = 'D3EFYncByWwzsSQvRsVbufBfmVstuf11QW'; // 新网转账钱包地址 | ||
12 | config.naclSecret = 'predict upon can egg glare desk draw arm hub auction language upper'; // 新网转账钱包秘钥 | ||
13 | config.ed25519Url = 'http://120.24.69.99:8001'; // 旧网节点地址 | ||
14 | // config.naclUrl = 'http://8.142.20.158:9000'; // 新网节点地址 | ||
15 | config.naclUrl = 'http://localhost:8001'; // 测试地址 | ||
16 | config.ed25519NetHash = 'b11fa2f2';// 旧网nethash | ||
17 | config.naclNetHash = '0ab796cd'; // 新网nethash | ||
18 | // add your user config here | ||
19 | const userConfig = { | ||
20 | // myAppName: 'egg', | ||
21 | }; | ||
22 | |||
23 | return { | ||
24 | ...config, | ||
25 | ...userConfig, | ||
26 | }; | ||
27 | }; |
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | const config = exports = {}; | ||
10 | config.ed25519Address = 'DFy6P2sN1KLDNtppnqLBPWcnH8GTJRouGj'; // 旧网接收钱包地址 | ||
11 | // config.naclAddress = 'D3EFYncByWwzsSQvRsVbufBfmVstuf11QW'; // 新网转账钱包地址 | ||
12 | config.naclSecret = 'predict upon can egg glare desk draw arm hub auction language upper'; // 新网转账钱包秘钥 | ||
13 | config.ed25519Url = 'http://120.24.69.99:8001'; // 旧网节点地址 | ||
14 | config.naclUrl = 'http://8.142.20.158:8001'; // 新网节点地址 | ||
15 | // config.naclUrl = 'http://localhost:8001'; // 测试地址 | ||
16 | config.ed25519NetHash = 'b11fa2f2';// 旧网nethash | ||
17 | config.naclNetHash = '0ab796cd'; // 新网nethash | ||
18 | // add your user config here | ||
19 | const userConfig = { | ||
20 | // myAppName: 'egg', | ||
21 | }; | ||
22 | |||
23 | return { | ||
24 | ...config, | ||
25 | ...userConfig, | ||
26 | }; | ||
27 | }; |
.history/config/plugin_20220214090848.js
0 → 100644
.history/config/plugin_20220214094957.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | /** @type Egg.EggPlugin */ | ||
4 | module.exports = { | ||
5 | // had enabled by egg | ||
6 | // static: { | ||
7 | // enable: true, | ||
8 | // } | ||
9 | cors: { | ||
10 | enable: true, | ||
11 | package: 'egg-cors', | ||
12 | }, | ||
13 | sequelize: { | ||
14 | enable: true, | ||
15 | package: 'egg-sequelize', | ||
16 | }, | ||
17 | validate: { | ||
18 | enable: true, | ||
19 | package: 'egg-validate', | ||
20 | }, | ||
21 | }; |
.history/config/plugin_20220215084010.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | /** @type Egg.EggPlugin */ | ||
4 | module.exports = { | ||
5 | // had enabled by egg | ||
6 | // static: { | ||
7 | // enable: true, | ||
8 | // } | ||
9 | // cors: { | ||
10 | // enable: true, | ||
11 | // package: 'egg-cors', | ||
12 | // }, | ||
13 | sequelize: { | ||
14 | enable: true, | ||
15 | package: 'egg-sequelize', | ||
16 | }, | ||
17 | validate: { | ||
18 | enable: true, | ||
19 | package: 'egg-validate', | ||
20 | }, | ||
21 | }; |
.history/package_20220214090848.json
0 → 100644
1 | { | ||
2 | "name": "DDNTrs", | ||
3 | "version": "1.0.0", | ||
4 | "description": "DDN", | ||
5 | "private": true, | ||
6 | "egg": { | ||
7 | "declarations": true | ||
8 | }, | ||
9 | "dependencies": { | ||
10 | "egg": "^2.15.1", | ||
11 | "egg-scripts": "^2.11.0" | ||
12 | }, | ||
13 | "devDependencies": { | ||
14 | "autod": "^3.0.1", | ||
15 | "autod-egg": "^1.1.0", | ||
16 | "egg-bin": "^4.11.0", | ||
17 | "egg-ci": "^1.11.0", | ||
18 | "egg-mock": "^3.21.0", | ||
19 | "eslint": "^5.13.0", | ||
20 | "eslint-config-egg": "^7.1.0" | ||
21 | }, | ||
22 | "engines": { | ||
23 | "node": ">=10.0.0" | ||
24 | }, | ||
25 | "scripts": { | ||
26 | "start": "egg-scripts start --daemon --title=egg-server-DDNTrs", | ||
27 | "stop": "egg-scripts stop --title=egg-server-DDNTrs", | ||
28 | "dev": "egg-bin dev", | ||
29 | "debug": "egg-bin debug", | ||
30 | "test": "npm run lint -- --fix && npm run test-local", | ||
31 | "test-local": "egg-bin test", | ||
32 | "cov": "egg-bin cov", | ||
33 | "lint": "eslint .", | ||
34 | "ci": "npm run lint && npm run cov", | ||
35 | "autod": "autod" | ||
36 | }, | ||
37 | "ci": { | ||
38 | "version": "10" | ||
39 | }, | ||
40 | "repository": { | ||
41 | "type": "git", | ||
42 | "url": "" | ||
43 | }, | ||
44 | "author": "creazy", | ||
45 | "license": "MIT" | ||
46 | } |
.history/package_20220214090924.json
0 → 100644
1 | { | ||
2 | "name": "DDNTrs", | ||
3 | "version": "1.0.0", | ||
4 | "description": "DDN upgrade server", | ||
5 | "private": true, | ||
6 | "egg": { | ||
7 | "declarations": true | ||
8 | }, | ||
9 | "dependencies": { | ||
10 | "egg": "^2.15.1", | ||
11 | "egg-scripts": "^2.11.0" | ||
12 | }, | ||
13 | "devDependencies": { | ||
14 | "autod": "^3.0.1", | ||
15 | "autod-egg": "^1.1.0", | ||
16 | "egg-bin": "^4.11.0", | ||
17 | "egg-ci": "^1.11.0", | ||
18 | "egg-mock": "^3.21.0", | ||
19 | "eslint": "^5.13.0", | ||
20 | "eslint-config-egg": "^7.1.0" | ||
21 | }, | ||
22 | "engines": { | ||
23 | "node": ">=10.0.0" | ||
24 | }, | ||
25 | "scripts": { | ||
26 | "start": "egg-scripts start --daemon --title=egg-server-DDNTrs", | ||
27 | "stop": "egg-scripts stop --title=egg-server-DDNTrs", | ||
28 | "dev": "egg-bin dev", | ||
29 | "debug": "egg-bin debug", | ||
30 | "test": "npm run lint -- --fix && npm run test-local", | ||
31 | "test-local": "egg-bin test", | ||
32 | "cov": "egg-bin cov", | ||
33 | "lint": "eslint .", | ||
34 | "ci": "npm run lint && npm run cov", | ||
35 | "autod": "autod" | ||
36 | }, | ||
37 | "ci": { | ||
38 | "version": "10" | ||
39 | }, | ||
40 | "repository": { | ||
41 | "type": "git", | ||
42 | "url": "" | ||
43 | }, | ||
44 | "author": "creazy", | ||
45 | "license": "MIT" | ||
46 | } |
.history/package_20220215084056.json
0 → 100644
1 | { | ||
2 | "name": "DDNTrs", | ||
3 | "version": "1.0.0", | ||
4 | "description": "DDN upgrade server", | ||
5 | "private": true, | ||
6 | "egg": { | ||
7 | "declarations": true | ||
8 | }, | ||
9 | "dependencies": { | ||
10 | "@ddn/node-sdk": "^2.1.2", | ||
11 | "egg": "^2.15.1", | ||
12 | "egg-scripts": "^2.11.0", | ||
13 | "egg-sequelize": "^6.0.0", | ||
14 | }, | ||
15 | "devDependencies": { | ||
16 | "autod": "^3.0.1", | ||
17 | "autod-egg": "^1.1.0", | ||
18 | "egg-bin": "^4.11.0", | ||
19 | "egg-ci": "^1.11.0", | ||
20 | "egg-mock": "^3.21.0", | ||
21 | "eslint": "^5.13.0", | ||
22 | "eslint-config-egg": "^7.1.0" | ||
23 | }, | ||
24 | "engines": { | ||
25 | "node": ">=10.0.0" | ||
26 | }, | ||
27 | "scripts": { | ||
28 | "start": "egg-scripts start --daemon --title=egg-server-DDNTrs", | ||
29 | "stop": "egg-scripts stop --title=egg-server-DDNTrs", | ||
30 | "dev": "egg-bin dev", | ||
31 | "debug": "egg-bin debug", | ||
32 | "test": "npm run lint -- --fix && npm run test-local", | ||
33 | "test-local": "egg-bin test", | ||
34 | "cov": "egg-bin cov", | ||
35 | "lint": "eslint .", | ||
36 | "ci": "npm run lint && npm run cov", | ||
37 | "autod": "autod" | ||
38 | }, | ||
39 | "ci": { | ||
40 | "version": "10" | ||
41 | }, | ||
42 | "repository": { | ||
43 | "type": "git", | ||
44 | "url": "" | ||
45 | }, | ||
46 | "author": "creazy", | ||
47 | "license": "MIT" | ||
48 | } |
.history/package_20220215084141.json
0 → 100644
1 | { | ||
2 | "name": "DDNTrs", | ||
3 | "version": "1.0.0", | ||
4 | "description": "DDN upgrade server", | ||
5 | "private": true, | ||
6 | "egg": { | ||
7 | "declarations": true | ||
8 | }, | ||
9 | "dependencies": { | ||
10 | "@ddn/node-sdk": "^2.1.2", | ||
11 | "egg": "^2.15.1", | ||
12 | "egg-scripts": "^2.11.0", | ||
13 | "egg-sequelize": "^6.0.0" | ||
14 | }, | ||
15 | "devDependencies": { | ||
16 | "autod": "^3.0.1", | ||
17 | "autod-egg": "^1.1.0", | ||
18 | "egg-bin": "^4.11.0", | ||
19 | "egg-ci": "^1.11.0", | ||
20 | "egg-mock": "^3.21.0", | ||
21 | "eslint": "^5.13.0", | ||
22 | "eslint-config-egg": "^7.1.0" | ||
23 | }, | ||
24 | "engines": { | ||
25 | "node": ">=10.0.0" | ||
26 | }, | ||
27 | "scripts": { | ||
28 | "start": "egg-scripts start --daemon --title=egg-server-DDNTrs", | ||
29 | "stop": "egg-scripts stop --title=egg-server-DDNTrs", | ||
30 | "dev": "egg-bin dev", | ||
31 | "debug": "egg-bin debug", | ||
32 | "test": "npm run lint -- --fix && npm run test-local", | ||
33 | "test-local": "egg-bin test", | ||
34 | "cov": "egg-bin cov", | ||
35 | "lint": "eslint .", | ||
36 | "ci": "npm run lint && npm run cov", | ||
37 | "autod": "autod" | ||
38 | }, | ||
39 | "ci": { | ||
40 | "version": "10" | ||
41 | }, | ||
42 | "repository": { | ||
43 | "type": "git", | ||
44 | "url": "" | ||
45 | }, | ||
46 | "author": "creazy", | ||
47 | "license": "MIT" | ||
48 | } |
.sequelizerc
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | const path = require('path'); | ||
4 | |||
5 | module.exports = { | ||
6 | config: path.join(__dirname, 'database/config.json'), | ||
7 | 'migrations-path': path.join(__dirname, 'database/migrations'), | ||
8 | 'seeders-path': path.join(__dirname, 'database/seeders'), | ||
9 | 'models-path': path.join(__dirname, 'app/model'), | ||
10 | }; | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
.travis.yml
0 → 100644
README.md
0 → 100644
1 | # DDNTrs | ||
2 | |||
3 | DDN | ||
4 | |||
5 | ## QuickStart | ||
6 | |||
7 | <!-- add docs here for user --> | ||
8 | |||
9 | see [egg docs][egg] for more detail. | ||
10 | |||
11 | ### Development | ||
12 | |||
13 | ```bash | ||
14 | $ npm i | ||
15 | $ npm run dev | ||
16 | $ open http://localhost:7001/ | ||
17 | ``` | ||
18 | |||
19 | ### Deploy | ||
20 | |||
21 | ```bash | ||
22 | $ npm start | ||
23 | $ npm stop | ||
24 | ``` | ||
25 | |||
26 | ### npm scripts | ||
27 | |||
28 | - Use `npm run lint` to check code style. | ||
29 | - Use `npm test` to run unit test. | ||
30 | - Use `npm run autod` to auto detect dependencies upgrade, see [autod](https://www.npmjs.com/package/autod) for more detail. | ||
31 | |||
32 | |||
33 | [egg]: https://eggjs.org | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
app/controller/home.js
0 → 100644
app/controller/transfer.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | const Controller = require('egg').Controller; | ||
4 | const nodeSdk = require('@ddn/node-sdk').default; | ||
5 | const accountData = require('../../config/mem_accounts.json') | ||
6 | class TransferController extends Controller { | ||
7 | async postTransaction() { | ||
8 | const { ctx, config } = this; | ||
9 | const body = ctx.request.body; | ||
10 | const rule = { | ||
11 | secret: { type: 'string' }, | ||
12 | amount: { type: 'string' }, | ||
13 | transaction: { type: 'string' }, | ||
14 | }; | ||
15 | console.log(body); | ||
16 | try { | ||
17 | ctx.validate(rule); | ||
18 | } catch (error) { | ||
19 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
20 | return; | ||
21 | } | ||
22 | const oldNetTransaction = JSON.parse(body.transaction); | ||
23 | if (oldNetTransaction.recipientId !== config.ed25519Address) { | ||
24 | ctx.helper.err({ | ||
25 | ctx, | ||
26 | err: '接收地址不正确,请使用正确的地址', | ||
27 | }); | ||
28 | return; | ||
29 | } | ||
30 | // const oldNetTransaction = JSON.stringify(body.transaction); | ||
31 | // 旧网转出 | ||
32 | // const oldNetData = await this.service.sdk.pushTransaction(JSON.stringify({ transaction: oldNetTransaction }), config.ed25519Url); | ||
33 | // console.log('就往转账', oldNetData, typeof oldNetData); | ||
34 | // if (!oldNetData || !oldNetData.success) { | ||
35 | // ctx.helper.err({ | ||
36 | // ctx, | ||
37 | // data: oldNetData, | ||
38 | // }); | ||
39 | // return; | ||
40 | // } | ||
41 | const some = accountData.RECORDS.some(item => { | ||
42 | if (item.address === body.senderAddress) { | ||
43 | return body.amount * 10 ** 8 == item.balance; | ||
44 | } | ||
45 | }); | ||
46 | // 加上手续费 | ||
47 | body.amount = (body.amount + 0.1) * 10 ** 8; | ||
48 | if (!some) { | ||
49 | ctx.helper.err({ | ||
50 | ctx, | ||
51 | err: '金额不正确,请联系社区工作人员', | ||
52 | }); | ||
53 | return; | ||
54 | } | ||
55 | const result = await ctx.model.Transfer.create({ toAddress: body.receiverAddress, amount: body.amount, transaction: body.transaction, address: body.senderAddress }); | ||
56 | ctx.helper.success({ | ||
57 | ctx, | ||
58 | data: result, | ||
59 | }); | ||
60 | |||
61 | // const transaction = await nodeSdk.transaction.createTransaction(body.receiverAccount, body.amount, body.remark || '网络升级转账', config.naclSecret); | ||
62 | // const trs = JSON.stringify({ transaction }); | ||
63 | // // 上链操作 | ||
64 | // const data = await this.service.sdk.pushTransaction(trs); | ||
65 | // if (data.success) { | ||
66 | // ctx.helper.success({ | ||
67 | // ctx, | ||
68 | // data, | ||
69 | // }); | ||
70 | // ctx.model.Transfer.update({ id: result.id }, { finish: true }); | ||
71 | // } else { | ||
72 | // ctx.helper.err({ | ||
73 | // ctx, | ||
74 | // data, | ||
75 | // }); | ||
76 | // ctx.model.Transfer.update({ id: result.id }, { finish: false }); | ||
77 | // } | ||
78 | |||
79 | } | ||
80 | // async haveBalance() { | ||
81 | // const { ctx, config } = this; | ||
82 | // const query = ctx.request.query; | ||
83 | // const rule = { | ||
84 | // address: { type: 'string' }, | ||
85 | // }; | ||
86 | // console.log(query); | ||
87 | // try { | ||
88 | // ctx.validate(rule, query); | ||
89 | // } catch (error) { | ||
90 | // console.log(error); | ||
91 | // ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
92 | // return; | ||
93 | // } | ||
94 | // const data = await this.service.sdk.getAccount(query.address, config.ed25519Url); | ||
95 | // ctx.helper.success({ | ||
96 | // ctx, | ||
97 | // data, | ||
98 | // }); | ||
99 | // } | ||
100 | async getBalance() { | ||
101 | const { ctx, config } = this; | ||
102 | const query = ctx.request.query; | ||
103 | let balance = 0; | ||
104 | let total = 0 | ||
105 | const rule = { | ||
106 | address: { type: 'string' }, | ||
107 | }; | ||
108 | try { | ||
109 | ctx.validate(rule, query); | ||
110 | } catch (error) { | ||
111 | console.log(error); | ||
112 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
113 | return; | ||
114 | } | ||
115 | const transferCount = await this.ctx.model.Transfer.count({ address: query.address }); | ||
116 | if (transferCount === 0) { | ||
117 | balance = 0; | ||
118 | } else { | ||
119 | accountData.RECORDS.some(item => { | ||
120 | if (item.address === query.address && item.balance > 0) { | ||
121 | balance = item.balance / (10 ** 8); | ||
122 | return true; | ||
123 | } | ||
124 | if (item.balance > 0) { | ||
125 | total += Number(item.balance) | ||
126 | } | ||
127 | }); | ||
128 | } | ||
129 | console.log(total / (10 ** 8)) | ||
130 | ctx.helper.success({ | ||
131 | ctx, | ||
132 | data: { | ||
133 | account: { balance } | ||
134 | }, | ||
135 | }); | ||
136 | |||
137 | |||
138 | } | ||
139 | async getTransaction() { | ||
140 | const { ctx, config } = this; | ||
141 | const query = ctx.request.query; | ||
142 | const rule = { | ||
143 | address: { type: 'string' }, | ||
144 | }; | ||
145 | console.log(query); | ||
146 | try { | ||
147 | ctx.validate(rule, query); | ||
148 | } catch (error) { | ||
149 | console.log(error); | ||
150 | ctx.helper.err({ ctx, err: ctx.helper.errorReadable(error) }); | ||
151 | return; | ||
152 | } | ||
153 | const data = await this.service.sdk.getAccount(query.address, config.naclUrl); | ||
154 | ctx.helper.success({ | ||
155 | ctx, | ||
156 | data, | ||
157 | }); | ||
158 | } | ||
159 | // async asyncAccount() { | ||
160 | // const { ctx, config } = this; | ||
161 | // const limit = 100; | ||
162 | // let asyncCount = 0; | ||
163 | // let errAsyncAccount = 0; | ||
164 | // let balanceIsZero = 0; | ||
165 | // const data = await this.service.sdk.getAccountCount(config.ed25519Url); | ||
166 | // if (data.success) { | ||
167 | // const length = Math.ceil(data.count / 100); | ||
168 | // console.log(data.count) | ||
169 | // for (let index = 0; index < length; index++) { | ||
170 | // const acountList = await this.service.sdk.getAccountList(index + 1, limit, config.ed25519Url); | ||
171 | // console.log(acountList) | ||
172 | // if (acountList.success) { | ||
173 | // for (let index = 0; index < acountList.accounts.length; index++) { | ||
174 | // const element = acountList.accounts[index]; | ||
175 | // if (element.balance == 0) { | ||
176 | // balanceIsZero++ | ||
177 | // continue; | ||
178 | // } | ||
179 | // const result = await this.app.model.Accounts.create({ balance: element.balance, address: element.address, publicKey: element.publicKey }); | ||
180 | // if (!result) { | ||
181 | // errAsyncAccount++; | ||
182 | // this.ctx.logger.error(`存入账户数据出错 数据:${JSON.stringify(element)},地址:${config.ed25519Url},error: ${JSON.stringify(result)}`); | ||
183 | // } else { | ||
184 | // asyncCount++; | ||
185 | // } | ||
186 | // } | ||
187 | // } else { | ||
188 | // this.ctx.logger.error(`同步账户数据出错:页码:${index + 1},每页条数:${limit},地址:${config.ed25519Url}`); | ||
189 | // } | ||
190 | // } | ||
191 | // } else { | ||
192 | // this.ctx.logger.error(`同步账户数据请求账户数量出错:${config.ed25519Url}`); | ||
193 | // } | ||
194 | // ctx.helper.success({ | ||
195 | // ctx, | ||
196 | // data: { 出错数量: errAsyncAccount, 同步数量: data.count, 已同步数量: asyncCount, 余额为零数量: balanceIsZero }, | ||
197 | // }); | ||
198 | // } | ||
199 | } | ||
200 | |||
201 | module.exports = TransferController; |
app/extend/helper.js
0 → 100644
1 | 'use strict'; | ||
2 | const moment = require('moment'); | ||
3 | |||
4 | module.exports = { | ||
5 | |||
6 | /** | ||
7 | * 对象拼接为字符串 | ||
8 | * @param {object} object 待拼接的hash对象 | ||
9 | */ | ||
10 | concatHash(object) { | ||
11 | const keys = Object.keys(object).sort(); | ||
12 | let paramsStr = ''; | ||
13 | for (let index = 0; index < keys.length; index++) { | ||
14 | const key = keys[index]; | ||
15 | let value = object[key]; | ||
16 | // object参数类型转换为string | ||
17 | if (typeof (value) === 'object') { | ||
18 | value = JSON.stringify(value); | ||
19 | } | ||
20 | paramsStr = paramsStr + `${key}${value}`; | ||
21 | } | ||
22 | return paramsStr; | ||
23 | }, | ||
24 | err({ ctx, code, err, status }) { | ||
25 | ctx.body = { | ||
26 | success: false, | ||
27 | code: code || 1, | ||
28 | err, | ||
29 | }; | ||
30 | ctx.status = status || 200; | ||
31 | }, | ||
32 | |||
33 | // 优化错误信息可读性 | ||
34 | errorReadable(e) { | ||
35 | switch (e.code) { | ||
36 | case 'invalid_param': { // 参数错误 | ||
37 | const errorHash = { | ||
38 | missing_field: '缺失', | ||
39 | }; | ||
40 | let msg = ''; | ||
41 | for (let i = 0; i < e.errors.length; i++) { | ||
42 | msg += '参数' + e.errors[i].field + ' ' + (errorHash[e.errors[i].code] || e.errors[i].message) + ';'; | ||
43 | } | ||
44 | return msg; | ||
45 | } | ||
46 | default: | ||
47 | console.log('未优化类型错误!'); | ||
48 | return JSON.stringify(e); | ||
49 | } | ||
50 | }, | ||
51 | |||
52 | success({ ctx, data, status }) { | ||
53 | ctx.body = { | ||
54 | success: true, | ||
55 | code: 0, | ||
56 | data, | ||
57 | }; | ||
58 | ctx.status = status || 200; | ||
59 | }, | ||
60 | |||
61 | async verifySign(ctx) { | ||
62 | const authorization = ctx.request.headers.authorization; | ||
63 | const timestamp = ctx.request.headers.timestamp; | ||
64 | const publicKey = ctx.request.headers.publickey; | ||
65 | if (!timestamp) { | ||
66 | this.err({ | ||
67 | ctx, | ||
68 | err: 'hearder: timestamp不能为空', | ||
69 | }); | ||
70 | return false; | ||
71 | } | ||
72 | if (!authorization) { | ||
73 | this.err({ | ||
74 | ctx, | ||
75 | err: 'hearder: authorization不能为空', | ||
76 | }); | ||
77 | return false; | ||
78 | } | ||
79 | if (!publicKey) { | ||
80 | this.err({ | ||
81 | ctx, | ||
82 | err: 'hearder: publicKey不能为空', | ||
83 | }); | ||
84 | return false; | ||
85 | } | ||
86 | // 验证时间不大于5秒 | ||
87 | const time = moment().valueOf(); | ||
88 | if (Math.abs(Number(timestamp) - time) > (ctx.app.config.timeEquation || 5000)) { | ||
89 | ctx.body = { | ||
90 | code: 1, | ||
91 | err: '签名超时', | ||
92 | }; | ||
93 | return false; | ||
94 | } | ||
95 | |||
96 | // 验证签名 | ||
97 | // 1. 获取请求者公钥 | ||
98 | const platformKey = await ctx.model.PlatformKey.findOne({ where: { publicKey } }); | ||
99 | if (!platformKey) { | ||
100 | ctx.body = { | ||
101 | code: 1, | ||
102 | err: 'publicKey不存在', | ||
103 | }; | ||
104 | return false; | ||
105 | } | ||
106 | if (!platformKey.usable) { | ||
107 | ctx.body = { | ||
108 | code: 1, | ||
109 | err: '密钥对不可用', | ||
110 | }; | ||
111 | return; | ||
112 | } | ||
113 | |||
114 | // 2. 对签名进行验证 | ||
115 | |||
116 | // 2.1 合并参数并排序组合拼接 | ||
117 | const allParams = { ...ctx.params, ...ctx.request.query, ...ctx.request.body, timestamp }; | ||
118 | const paramsStr = this.concatHash(allParams); | ||
119 | |||
120 | const verify = this.service.sdk.gm.sm2VerifySign(paramsStr, authorization, publicKey); | ||
121 | // 3. 比对时间戳 | ||
122 | if (!verify) { | ||
123 | ctx.body = { | ||
124 | code: 1, | ||
125 | err: '签名无效', | ||
126 | }; | ||
127 | return false; | ||
128 | } | ||
129 | // 记录当前媒体平台 | ||
130 | ctx.platformId = platformKey.platformId; | ||
131 | return true; | ||
132 | }, | ||
133 | |||
134 | }; |
app/model/accounts.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | module.exports = app => { | ||
4 | const { STRING, DATE, UUID, UUIDV1, TEXT, BOOLEAN } = app.Sequelize; | ||
5 | |||
6 | const Account = app.model.define('account', { | ||
7 | id: { | ||
8 | allowNull: false, | ||
9 | primaryKey: true, | ||
10 | type: UUID, | ||
11 | defaultValue: UUIDV1, | ||
12 | }, | ||
13 | address: { type: STRING, unique: true }, | ||
14 | balance: { type: STRING }, | ||
15 | publicKey: { type: STRING, unique: true }, | ||
16 | created_at: { type: DATE }, | ||
17 | updated_at: { type: DATE }, | ||
18 | }); | ||
19 | return Account; | ||
20 | }; |
app/model/transfer.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | module.exports = app => { | ||
4 | const { STRING, DATE, UUID, UUIDV1, TEXT, BOOLEAN } = app.Sequelize; | ||
5 | |||
6 | const Transfer = app.model.define('transfer', { | ||
7 | id: { | ||
8 | allowNull: false, | ||
9 | primaryKey: true, | ||
10 | type: UUID, | ||
11 | defaultValue: UUIDV1, | ||
12 | }, | ||
13 | address: { type: STRING, comment: '地址' }, | ||
14 | // sendTrsId: { type: STRING, comment: '发送交易成功的id' }, | ||
15 | // toTrsId: { type: STRING, comment: '接收成功的交易id' }, | ||
16 | toAddress: { type: STRING, comment: '接收地址' }, | ||
17 | amount: { type: STRING, comment: '金额' }, | ||
18 | transaction: { type: TEXT, comment: '交易体' }, | ||
19 | finish: { type: BOOLEAN, comment: '是否完成', defaultValue: false }, | ||
20 | createdAt: { type: DATE }, | ||
21 | updatedAt: { type: DATE }, | ||
22 | }); | ||
23 | return Transfer; | ||
24 | }; |
app/router.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | /** | ||
4 | * @param {Egg.Application} app - egg application | ||
5 | */ | ||
6 | module.exports = app => { | ||
7 | const { router, controller } = app; | ||
8 | router.post('/upgrade/transfer/postTransaction', controller.transfer.postTransaction); | ||
9 | router.get('/upgrade/transfer/getBanlance', controller.transfer.getBalance); | ||
10 | // router.get('/upgrade/transfer/haveBalance', controller.transfer.haveBalance); | ||
11 | router.get('/upgrade/transfer/transaction', controller.transfer.getTransaction); | ||
12 | // router.get('/upgrade/transfer/async', controller.transfer.asyncAccount); | ||
13 | }; |
app/schedule/transfer.js
0 → 100644
1 | // eslint-disable-next-line strict | ||
2 | const Subscription = require('egg').Subscription; | ||
3 | const nodeSdk = require('@ddn/node-sdk').default; | ||
4 | class Transfer extends Subscription { | ||
5 | static get schedule() { | ||
6 | return { | ||
7 | interval: '10s', | ||
8 | type: 'worker', | ||
9 | }; | ||
10 | } | ||
11 | |||
12 | async subscribe() { | ||
13 | const { ctx, config } = this; | ||
14 | const trsData = await ctx.model.Transfer.findAll({ where: { finish: false } }); | ||
15 | console.log(trsData) | ||
16 | trsData.map(async item => { | ||
17 | // if (item.id != "e2475660-9942-11ec-b873-171b64126906") { | ||
18 | // return | ||
19 | // } | ||
20 | const transaction = await nodeSdk.transaction.createTransaction(item.toAddress, item.amount, item.remark || '网络升级转账', config.naclSecret); | ||
21 | const trs = JSON.stringify({ transaction }); | ||
22 | // 上链操作 | ||
23 | const data = await this.service.sdk.pushTransaction(trs); | ||
24 | console.log('向新网地址转账结果',data) | ||
25 | if (data.success) { | ||
26 | ctx.model.Transfer.update({ finish: true }, { where: { id: item.id } }); | ||
27 | } else { | ||
28 | ctx.model.Transfer.update({ finish: false }, { where: { id: item.id } }); | ||
29 | } | ||
30 | }); | ||
31 | } | ||
32 | } | ||
33 | |||
34 | module.exports = Transfer; |
app/service/sdk.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | const Service = require('egg').Service; | ||
4 | const request = require('request'); | ||
5 | const net = { | ||
6 | oldNet: '', | ||
7 | newNet: '' | ||
8 | } | ||
9 | class DdnService extends Service { | ||
10 | |||
11 | async getPeers() { | ||
12 | const { config } = this; | ||
13 | const peer_host = await this.getPeerHost(); | ||
14 | const url = `${peer_host}/api/peers`; | ||
15 | const result = await new Promise(resolve => { | ||
16 | request({ | ||
17 | url, | ||
18 | method: 'GET', | ||
19 | headers: { | ||
20 | 'Content-Type': 'application/json', | ||
21 | version: '', | ||
22 | nethash: config.nethash, | ||
23 | }, | ||
24 | }, (error, response, body) => { | ||
25 | resolve(JSON.parse(body)); | ||
26 | }); | ||
27 | }); | ||
28 | return result; | ||
29 | } | ||
30 | // 区块高度 | ||
31 | async getHeight() { | ||
32 | const { config } = this; | ||
33 | const peer_host = await this.getPeerHost(); | ||
34 | const url = `${peer_host}/api/blocks/getHeight`; | ||
35 | const result = await new Promise(resolve => { | ||
36 | request({ | ||
37 | url, | ||
38 | method: 'GET', | ||
39 | headers: { | ||
40 | 'Content-Type': 'application/json', | ||
41 | version: '', | ||
42 | nethash: config.nethash, | ||
43 | }, | ||
44 | }, (error, response, body) => { | ||
45 | resolve(JSON.parse(body)); | ||
46 | }); | ||
47 | }); | ||
48 | return result; | ||
49 | } | ||
50 | // 交易详情 | ||
51 | async getTransaction(id) { | ||
52 | const { config } = this; | ||
53 | const peer_host = await this.getPeerHost(); | ||
54 | const url = `${peer_host}/api/transactions/get?id=${id}`; | ||
55 | const result = await new Promise(resolve => { | ||
56 | request({ | ||
57 | url, | ||
58 | method: 'GET', | ||
59 | headers: { | ||
60 | 'Content-Type': 'application/json', | ||
61 | version: '', | ||
62 | nethash: config.nethash, | ||
63 | }, | ||
64 | }, (error, response, body) => { | ||
65 | resolve(JSON.parse(body)); | ||
66 | }); | ||
67 | }); | ||
68 | return result; | ||
69 | } | ||
70 | // 交易列表 | ||
71 | async getTransactions(con, page = 1, per_page = 10) { | ||
72 | const { config } = this; | ||
73 | const peer_host = await this.getPeerHost(); | ||
74 | const conditions = []; | ||
75 | if (con.sender_id) { | ||
76 | conditions.push('senderId=' + con.sender_id); | ||
77 | } | ||
78 | if (con.recipient_id) { | ||
79 | conditions.push('recipientId=' + con.recipient_id); | ||
80 | } | ||
81 | conditions.push('limit=' + Number(per_page)); | ||
82 | conditions.push('offset=' + (Number(page) - 1) * Number(per_page)); | ||
83 | const url = `${peer_host}/api/transactions?${conditions.join('&')}`; | ||
84 | const result = await new Promise(resolve => { | ||
85 | request({ | ||
86 | url, | ||
87 | method: 'GET', | ||
88 | headers: { | ||
89 | 'Content-Type': 'application/json', | ||
90 | version: '', | ||
91 | nethash: config.nethash, | ||
92 | }, | ||
93 | }, (error, response, body) => { | ||
94 | resolve(JSON.parse(body)); | ||
95 | }); | ||
96 | }); | ||
97 | return result; | ||
98 | } | ||
99 | |||
100 | // 账户信息 | ||
101 | async getAccount(address, peer_url) { | ||
102 | const { config } = this; | ||
103 | const peer_host = await this.getPeerHost(); | ||
104 | const url = peer_url ? `${peer_url}/api/accounts?address=${address}` : `${peer_host}/api/accounts?address=${address}`; | ||
105 | const result = await new Promise((resolve, reject) => { | ||
106 | request({ | ||
107 | url, | ||
108 | method: 'GET', | ||
109 | headers: { | ||
110 | 'Content-Type': 'application/json', | ||
111 | version: '', | ||
112 | nethash: config.nethash, | ||
113 | }, | ||
114 | }, (error, response, body) => { | ||
115 | if (error) { | ||
116 | reject(error); | ||
117 | } | ||
118 | console.log(url, body) | ||
119 | resolve(JSON.parse(body)); | ||
120 | }); | ||
121 | }); | ||
122 | return result; | ||
123 | } | ||
124 | |||
125 | // 账户信息列表 | ||
126 | async getAccountList(page, per_page, peer_url) { | ||
127 | const { config } = this; | ||
128 | const peer_host = await this.getPeerHost(); | ||
129 | const offect = per_page * page | ||
130 | const url = peer_url ? `${peer_url}/api/accounts/top?offect=${offect}&limit=${per_page}` : `${peer_host}/api/accounts/top?page=${page}&per_page=${per_page}`; | ||
131 | const result = await new Promise((resolve, reject) => { | ||
132 | request({ | ||
133 | url, | ||
134 | method: 'GET', | ||
135 | headers: { | ||
136 | 'Content-Type': 'application/json', | ||
137 | version: '', | ||
138 | nethash: config.nethash, | ||
139 | }, | ||
140 | }, (error, response, body) => { | ||
141 | if (error) { | ||
142 | reject(error); | ||
143 | } | ||
144 | resolve(JSON.parse(body)); | ||
145 | }); | ||
146 | }); | ||
147 | return result; | ||
148 | } | ||
149 | // 账户信息列表 | ||
150 | async getAccountCount(peer_url) { | ||
151 | const { config } = this; | ||
152 | const peer_host = await this.getPeerHost(); | ||
153 | const url = peer_url ? `${peer_url}/api/accounts/count` : `${peer_host}/api/accounts/count`; | ||
154 | const result = await new Promise((resolve, reject) => { | ||
155 | request({ | ||
156 | url, | ||
157 | method: 'GET', | ||
158 | headers: { | ||
159 | 'Content-Type': 'application/json', | ||
160 | version: '', | ||
161 | nethash: config.nethash, | ||
162 | }, | ||
163 | }, (error, response, body) => { | ||
164 | if (error) { | ||
165 | reject(error); | ||
166 | } | ||
167 | resolve(JSON.parse(body)); | ||
168 | }); | ||
169 | }); | ||
170 | return result; | ||
171 | } | ||
172 | |||
173 | // 交易上链 | ||
174 | async pushTransaction(trs, peer_url) { | ||
175 | console.log(trs) | ||
176 | const { config } = this; | ||
177 | const peer_host = await this.getPeerHost(); | ||
178 | const url = peer_url ? `${peer_url}/peer/transactions` : `${peer_host}/api/transactions`; | ||
179 | let ddn_result = await new Promise(resolve => { | ||
180 | request({ | ||
181 | url, | ||
182 | method: 'POST', | ||
183 | headers: { | ||
184 | 'Content-Type': 'application/json', | ||
185 | version: '', | ||
186 | nethash: config.ed25519NetHash, | ||
187 | }, | ||
188 | body: trs, | ||
189 | }, (error, response, body) => { | ||
190 | console.log(error, 'body', body) | ||
191 | resolve(JSON.parse(body)); | ||
192 | }); | ||
193 | }); | ||
194 | console.log('ddn_result', ddn_result) | ||
195 | // ddn_result = JSON.parse(ddn_result); | ||
196 | return ddn_result;// ddn_result; | ||
197 | } | ||
198 | |||
199 | // // 获取结点地址 | ||
200 | async getPeerHost() { | ||
201 | // const peer_host = await this.service.sdk.redis.get('peer_host'); | ||
202 | // if (!peer_host) { | ||
203 | const res = await this.checkPeerHost(); | ||
204 | return res; | ||
205 | // } | ||
206 | // return peer_host.host; | ||
207 | } | ||
208 | |||
209 | // 检查结点并指定可用结点 | ||
210 | async checkPeerHost() { | ||
211 | const { config } = this; | ||
212 | // const peers = this.config.peer_list; | ||
213 | // const peers = [ 'http://120.24.69.99:8003' ]; | ||
214 | const peers = ['http://localhost:8001']; | ||
215 | const peers_height = {}; | ||
216 | let max_height = null; | ||
217 | let min_height = null; | ||
218 | let best_peer = null; | ||
219 | for (let i = 0; i < peers.length; i++) { | ||
220 | const url = `${peers[i]}/api/blocks/getstatus`; | ||
221 | const result = await new Promise(resolve => { | ||
222 | request({ | ||
223 | url, | ||
224 | method: 'GET', | ||
225 | headers: { | ||
226 | 'Content-Type': 'application/json', | ||
227 | version: '', | ||
228 | nethash: config.nethash, | ||
229 | }, | ||
230 | }, (error, response, body) => { | ||
231 | if (error) { | ||
232 | resolve({ success: false }); | ||
233 | } else { | ||
234 | resolve(JSON.parse(body)); | ||
235 | } | ||
236 | }); | ||
237 | }); | ||
238 | if (result.success) { | ||
239 | peers_height[peers[i]] = result.height; | ||
240 | if (!max_height || Number(result.height) > Number(max_height)) { | ||
241 | max_height = result.height; | ||
242 | } | ||
243 | if (!min_height || Number(result.height) < Number(min_height)) { | ||
244 | min_height = result.height; | ||
245 | } | ||
246 | if (!best_peer || Number(result.height) === Number(max_height)) { | ||
247 | best_peer = peers[i]; | ||
248 | } | ||
249 | } else { | ||
250 | } | ||
251 | } | ||
252 | |||
253 | return best_peer; | ||
254 | } | ||
255 | |||
256 | |||
257 | } | ||
258 | |||
259 | module.exports = DdnService; |
appveyor.yml
0 → 100644
config/config.default.js
0 → 100644
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | /** | ||
10 | * built-in config | ||
11 | * @type {Egg.EggAppConfig} | ||
12 | **/ | ||
13 | const config = exports = {}; | ||
14 | |||
15 | config.cluster = { | ||
16 | listen: { | ||
17 | port: 7009, | ||
18 | }, | ||
19 | }; | ||
20 | |||
21 | // use for cookie sign key, should change to your own and keep security | ||
22 | config.keys = appInfo.name + '_1644800905769_2309'; | ||
23 | |||
24 | // add your middleware config here | ||
25 | config.middleware = []; | ||
26 | |||
27 | config.security = { | ||
28 | csrf: { | ||
29 | enable: false, | ||
30 | ignoreJSON: true, | ||
31 | }, | ||
32 | }; | ||
33 | |||
34 | config.cors = { | ||
35 | origin: '*', | ||
36 | allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH', | ||
37 | }; | ||
38 | |||
39 | config.sequelize = { | ||
40 | host: 'localhost', | ||
41 | port: '5432', | ||
42 | username: 'postgres', | ||
43 | password: 'wawjr1314', | ||
44 | database: 'ddn', | ||
45 | dialect: 'postgres', | ||
46 | pool: { | ||
47 | max: 5, | ||
48 | min: 0, | ||
49 | idle: 10000, | ||
50 | }, | ||
51 | logging: false, | ||
52 | }; | ||
53 | // config.ed25519Address = 'DFy6P2sN1KLDNtppnqLBPWcnH8GTJRouGj'; // 旧网接收钱包地址 弃用 | ||
54 | config.naclSecret = 'puzzle elite rescue gun blush top floor surge injury popular pole inquiry'; // 新网转账钱包秘钥 | ||
55 | // config.ed25519Url = 'http://120.24.69.99:8001'; // 旧网节点地址 弃用 | ||
56 | config.naclUrl = 'http://8.142.20.158:8001'; // 新网节点地址 | ||
57 | // config.naclUrl = 'http://localhost:8001'; // 测试地址 | ||
58 | config.ed25519NetHash = 'b11fa2f2';// 旧网nethash | ||
59 | config.naclNetHash = '0ab796cd'; // 新网nethash | ||
60 | // add your user config here | ||
61 | const userConfig = { | ||
62 | // myAppName: 'egg', | ||
63 | }; | ||
64 | |||
65 | return { | ||
66 | ...config, | ||
67 | ...userConfig, | ||
68 | }; | ||
69 | }; |
config/config.local.js
0 → 100644
1 | /* eslint valid-jsdoc: "off" */ | ||
2 | |||
3 | 'use strict'; | ||
4 | |||
5 | /** | ||
6 | * @param {Egg.EggAppInfo} appInfo app info | ||
7 | */ | ||
8 | module.exports = appInfo => { | ||
9 | const config = exports = {}; | ||
10 | // config.ed25519Address = 'DFy6P2sN1KLDNtppnqLBPWcnH8GTJRouGj'; // 旧网接收钱包地址 | ||
11 | // config.naclAddress = 'D3EFYncByWwzsSQvRsVbufBfmVstuf11QW'; // 新网转账钱包地址 | ||
12 | config.naclSecret = 'puzzle elite rescue gun blush top floor surge injury popular pole inquiry'; // 新网转账钱包秘钥 | ||
13 | // config.ed25519Url = 'http://120.24.69.99:8001'; // 旧网节点地址 | ||
14 | config.naclUrl = 'http://8.142.20.158:8001'; // 新网节点地址 | ||
15 | // config.naclUrl = 'http://localhost:8001'; // 测试地址 | ||
16 | config.ed25519NetHash = 'b11fa2f2';// 旧网nethash | ||
17 | config.naclNetHash = '0ab796cd'; // 新网nethash | ||
18 | // add your user config here | ||
19 | const userConfig = { | ||
20 | // myAppName: 'egg', | ||
21 | }; | ||
22 | |||
23 | return { | ||
24 | ...config, | ||
25 | ...userConfig, | ||
26 | }; | ||
27 | }; |
config/constants.js
0 → 100644
config/mem_accounts.json
0 → 100644
This diff could not be displayed because it is too large.
config/plugin.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | /** @type Egg.EggPlugin */ | ||
4 | module.exports = { | ||
5 | // had enabled by egg | ||
6 | // static: { | ||
7 | // enable: true, | ||
8 | // } | ||
9 | cors: { | ||
10 | enable: true, | ||
11 | package: 'egg-cors', | ||
12 | }, | ||
13 | sequelize: { | ||
14 | enable: true, | ||
15 | package: 'egg-sequelize', | ||
16 | }, | ||
17 | validate: { | ||
18 | enable: true, | ||
19 | package: 'egg-validate', | ||
20 | }, | ||
21 | }; |
database/config.json
0 → 100644
1 | { | ||
2 | "development": { | ||
3 | "username": "postgres", | ||
4 | "password": "wawjr1314", | ||
5 | "database": "ddn", | ||
6 | "host": "localhost", | ||
7 | "dialect": "postgres" | ||
8 | |||
9 | }, | ||
10 | "test": { | ||
11 | "username": "root", | ||
12 | "password": null, | ||
13 | "database": "database_test", | ||
14 | "host": "127.0.0.1", | ||
15 | "dialect": "mysql" | ||
16 | }, | ||
17 | "production": { | ||
18 | "username": "root", | ||
19 | "password": null, | ||
20 | "database": "database_production", | ||
21 | "host": "127.0.0.1", | ||
22 | "dialect": "mysql" | ||
23 | } | ||
24 | } |
1 | 'use strict'; | ||
2 | |||
3 | module.exports = { | ||
4 | async up(queryInterface, Sequelize) { | ||
5 | const { UUID, DATE, STRING, TEXT, BOOLEAN, UUIDV1 } = Sequelize; | ||
6 | await queryInterface.createTable('transfers', { | ||
7 | id: { | ||
8 | allowNull: false, | ||
9 | primaryKey: true, | ||
10 | type: UUID, | ||
11 | defaultValue: UUIDV1, | ||
12 | }, | ||
13 | address: { type: STRING }, | ||
14 | to_address: { type: STRING }, | ||
15 | amount: { type: STRING }, | ||
16 | transaction: { type: TEXT }, | ||
17 | finish: { type: BOOLEAN }, | ||
18 | created_at: { type: DATE }, | ||
19 | updated_at: { type: DATE }, | ||
20 | }); | ||
21 | }, | ||
22 | |||
23 | async down(queryInterface, Sequelize) { | ||
24 | /** | ||
25 | * Add reverting commands here. | ||
26 | * | ||
27 | * Example: | ||
28 | * await queryInterface.dropTable('users'); | ||
29 | */ | ||
30 | await queryInterface.dropTable('transfer'); | ||
31 | } | ||
32 | }; |
1 | 'use strict'; | ||
2 | |||
3 | module.exports = { | ||
4 | async up (queryInterface, Sequelize) { | ||
5 | const { UUID, DATE, STRING, TEXT, BOOLEAN, UUIDV1 } = Sequelize; | ||
6 | await queryInterface.createTable('accounts', { | ||
7 | id: { | ||
8 | allowNull: false, | ||
9 | primaryKey: true, | ||
10 | type: UUID, | ||
11 | defaultValue: UUIDV1, | ||
12 | }, | ||
13 | address: { type: STRING, unique: true }, | ||
14 | balance: { type: STRING }, | ||
15 | publicKey: { type: STRING, unique: true }, | ||
16 | created_at: { type: DATE }, | ||
17 | updated_at: { type: DATE }, | ||
18 | }); | ||
19 | }, | ||
20 | |||
21 | async down (queryInterface, Sequelize) { | ||
22 | /** | ||
23 | * Add reverting commands here. | ||
24 | * | ||
25 | * Example: | ||
26 | * await queryInterface.dropTable('users'); | ||
27 | */ | ||
28 | await queryInterface.dropTable('accounts'); | ||
29 | } | ||
30 | }; |
dump.rdb
0 → 100644
No preview for this file type
jsconfig.json
0 → 100644
package.json
0 → 100644
1 | { | ||
2 | "name": "DDNTrs", | ||
3 | "version": "1.0.0", | ||
4 | "description": "DDN upgrade server", | ||
5 | "private": true, | ||
6 | "egg": { | ||
7 | "declarations": true | ||
8 | }, | ||
9 | "dependencies": { | ||
10 | "@ddn/node-sdk": "^2.2.0", | ||
11 | "egg": "^2.15.1", | ||
12 | "egg-cors": "^2.2.3", | ||
13 | "egg-scripts": "^2.11.0", | ||
14 | "egg-sequelize": "^6.0.0", | ||
15 | "egg-validate": "^2.0.2", | ||
16 | "pg": "^8.7.3" | ||
17 | }, | ||
18 | "devDependencies": { | ||
19 | "autod": "^3.0.1", | ||
20 | "autod-egg": "^1.1.0", | ||
21 | "egg-bin": "^4.11.0", | ||
22 | "egg-ci": "^1.11.0", | ||
23 | "egg-mock": "^3.21.0", | ||
24 | "eslint": "^5.13.0", | ||
25 | "eslint-config-egg": "^7.1.0", | ||
26 | "sequelize-cli": "^6.4.1" | ||
27 | }, | ||
28 | "engines": { | ||
29 | "node": ">=10.0.0" | ||
30 | }, | ||
31 | "scripts": { | ||
32 | "start": "egg-scripts start --daemon --title=egg-server-DDNTrs", | ||
33 | "stop": "egg-scripts stop --title=egg-server-DDNTrs", | ||
34 | "dev": "egg-bin dev", | ||
35 | "debug": "egg-bin debug", | ||
36 | "test": "npm run lint -- --fix && npm run test-local", | ||
37 | "test-local": "egg-bin test", | ||
38 | "cov": "egg-bin cov", | ||
39 | "lint": "eslint .", | ||
40 | "ci": "npm run lint && npm run cov", | ||
41 | "autod": "autod", | ||
42 | "init":"npx sequelize db:migrate" | ||
43 | }, | ||
44 | "ci": { | ||
45 | "version": "10" | ||
46 | }, | ||
47 | "repository": { | ||
48 | "type": "git", | ||
49 | "url": "" | ||
50 | }, | ||
51 | "author": "creazy", | ||
52 | "license": "MIT" | ||
53 | } |
test/app/controller/home.test.js
0 → 100644
1 | 'use strict'; | ||
2 | |||
3 | const { app, assert } = require('egg-mock/bootstrap'); | ||
4 | |||
5 | describe('test/app/controller/home.test.js', () => { | ||
6 | it('should assert', () => { | ||
7 | const pkg = require('../../../package.json'); | ||
8 | assert(app.config.keys.startsWith(pkg.name)); | ||
9 | |||
10 | // const ctx = app.mockContext({}); | ||
11 | // yield ctx.service.xx(); | ||
12 | }); | ||
13 | |||
14 | it('should GET /', () => { | ||
15 | return app.httpRequest() | ||
16 | .get('/') | ||
17 | .expect('hi, egg') | ||
18 | .expect(200); | ||
19 | }); | ||
20 | }); |
-
Please register or sign in to post a comment