diff --git a/packages/neuron-ui/package.json b/packages/neuron-ui/package.json index d84cbe4cd1..4ad3d65ab4 100644 --- a/packages/neuron-ui/package.json +++ b/packages/neuron-ui/package.json @@ -43,7 +43,7 @@ "last 2 chrome versions" ], "dependencies": { - "@nervosnetwork/ckb-sdk-core": "0.19.0", + "@nervosnetwork/ckb-sdk-core": "0.19.1", "@uifabric/experiments": "7.10.0", "@uifabric/styling": "7.4.0", "canvg": "2.0.0", diff --git a/packages/neuron-wallet/package.json b/packages/neuron-wallet/package.json index b898710641..f8601a9d96 100644 --- a/packages/neuron-wallet/package.json +++ b/packages/neuron-wallet/package.json @@ -34,8 +34,8 @@ ] }, "dependencies": { - "@nervosnetwork/ckb-sdk-core": "0.19.0", - "@nervosnetwork/ckb-sdk-utils": "0.19.0", + "@nervosnetwork/ckb-sdk-core": "0.19.1", + "@nervosnetwork/ckb-sdk-utils": "0.19.1", "bn.js": "4.11.8", "chalk": "2.4.2", "electron-log": "3.0.7", @@ -51,7 +51,7 @@ "uuid": "3.3.2" }, "devDependencies": { - "@nervosnetwork/ckb-types": "0.19.0", + "@nervosnetwork/ckb-types": "0.19.1", "@types/electron-devtools-installer": "2.2.0", "@types/elliptic": "6.4.8", "@types/sqlite3": "3.1.5", diff --git a/packages/neuron-wallet/src/services/indexer/indexer-rpc.ts b/packages/neuron-wallet/src/services/indexer/indexer-rpc.ts index 5f1201df2b..be389a51cd 100644 --- a/packages/neuron-wallet/src/services/indexer/indexer-rpc.ts +++ b/packages/neuron-wallet/src/services/indexer/indexer-rpc.ts @@ -1,10 +1,11 @@ import Core from '@nervosnetwork/ckb-sdk-core' +import { generateCore } from 'services/sdk-core' export default class IndexerRPC { private core: Core constructor(url: string) { - this.core = new Core(url) + this.core = generateCore(url) } public deindexLockHash = async (lockHash: string) => { diff --git a/packages/neuron-wallet/src/services/indexer/queue.ts b/packages/neuron-wallet/src/services/indexer/queue.ts index 6f319a58e7..bb7e8d5d73 100644 --- a/packages/neuron-wallet/src/services/indexer/queue.ts +++ b/packages/neuron-wallet/src/services/indexer/queue.ts @@ -44,7 +44,7 @@ export default class IndexerQueue { // this.lockHashes = lockHashes this.lockHashInfos = lockHashInfos this.indexerRPC = new IndexerRPC(url) - this.getBlocksService = new GetBlocks() + this.getBlocksService = new GetBlocks(url) this.blockNumberService = new BlockNumber() this.tipNumberListener = tipNumberSubject.subscribe(async (num: string) => { if (num) { diff --git a/packages/neuron-wallet/src/services/node.ts b/packages/neuron-wallet/src/services/node.ts index 683b6d2eec..b7ccb17f06 100644 --- a/packages/neuron-wallet/src/services/node.ts +++ b/packages/neuron-wallet/src/services/node.ts @@ -1,6 +1,8 @@ import Core from '@nervosnetwork/ckb-sdk-core' import { interval, BehaviorSubject, merge } from 'rxjs' import { distinctUntilChanged, sampleTime, flatMap, delay, retry, debounceTime } from 'rxjs/operators' +import https from 'https' +import http from 'http' import { ShouldBeTypeOf } from 'exceptions' import { ConnectionStatusSubject } from 'models/subjects/node' import { CurrentNetworkIDSubject } from 'models/subjects/networks' @@ -51,7 +53,13 @@ class NodeService { if (!url.startsWith('http')) { throw new Error('Protocol of url should be specified') } - this.core.setNode({ url }) + if (url.startsWith('https')) { + const httpsAgent = new https.Agent({ keepAlive: true }) + this.core.setNode({ url, httpsAgent }) + } else { + const httpAgent = new http.Agent({ keepAlive: true }) + this.core.setNode({ url, httpAgent }) + } this.tipNumberSubject.next('0') this.connectionStatusSubject.next(false) return this.core diff --git a/packages/neuron-wallet/src/services/sdk-core.ts b/packages/neuron-wallet/src/services/sdk-core.ts new file mode 100644 index 0000000000..33f7c6bb2f --- /dev/null +++ b/packages/neuron-wallet/src/services/sdk-core.ts @@ -0,0 +1,19 @@ +import Core from '@nervosnetwork/ckb-sdk-core' +import https from 'https' +import http from 'http' + +export const generateCore = (url: string): Core => { + const core = new Core(url) + if (url.startsWith('https')) { + const httpsAgent = new https.Agent({ keepAlive: true }) + core.rpc.setNode({ url, httpsAgent }) + } else { + const httpAgent = new http.Agent({ keepAlive: true }) + core.rpc.setNode({ url, httpAgent }) + } + return core +} + +export default { + generateCore, +} diff --git a/packages/neuron-wallet/src/services/sync/block-listener.ts b/packages/neuron-wallet/src/services/sync/block-listener.ts index 3d0df5425a..92932aa024 100644 --- a/packages/neuron-wallet/src/services/sync/block-listener.ts +++ b/packages/neuron-wallet/src/services/sync/block-listener.ts @@ -16,14 +16,17 @@ export default class BlockListener { private currentBlockNumber: BlockNumber private tipNumberSubject: BehaviorSubject private tipNumberListener: Subscription | undefined + private url: string constructor( + url: string, lockHashes: string[], tipNumberSubject: BehaviorSubject = NodeService.getInstance().tipNumberSubject ) { + this.url = url this.lockHashes = lockHashes this.currentBlockNumber = new BlockNumber() - this.rangeForCheck = new RangeForCheck() + this.rangeForCheck = new RangeForCheck(url) this.tipNumberSubject = tipNumberSubject } @@ -51,10 +54,17 @@ export default class BlockListener { } try { - const getBlocksService = new GetBlocks() + const getBlocksService = new GetBlocks(this.url) const currentTip = await getBlocksService.getTipBlockNumber() const startBlockNumber = await this.getStartBlockNumber() - this.queue = new Queue(this.lockHashes, startBlockNumber, currentTip, this.currentBlockNumber, this.rangeForCheck) + this.queue = new Queue( + this.url, + this.lockHashes, + startBlockNumber, + currentTip, + this.currentBlockNumber, + this.rangeForCheck + ) } catch (err) { logger.error(`BlockListener start error:`, err) } @@ -119,6 +129,7 @@ export default class BlockListener { } else { const startBlockNumber: string = await this.getStartBlockNumber() this.queue = new Queue( + this.url, this.lockHashes, startBlockNumber, endBlockNumber, diff --git a/packages/neuron-wallet/src/services/sync/get-blocks.ts b/packages/neuron-wallet/src/services/sync/get-blocks.ts index 34656c4d38..8e280c17c0 100644 --- a/packages/neuron-wallet/src/services/sync/get-blocks.ts +++ b/packages/neuron-wallet/src/services/sync/get-blocks.ts @@ -1,27 +1,20 @@ import Core from '@nervosnetwork/ckb-sdk-core' +import { generateCore } from 'services/sdk-core' import { Block, BlockHeader } from 'types/cell-types' import TypeConvert from 'types/type-convert' -import { NetworkWithID } from 'services/networks' import CheckAndSave from './check-and-save' import Utils from './utils' -import { networkSwitchSubject } from './renderer-params' - -let core: Core -networkSwitchSubject.subscribe((network: NetworkWithID | undefined) => { - if (network) { - core = new Core(network.remote) - } -}) - export default class GetBlocks { private retryTime: number private retryInterval: number + private core: Core - constructor(retryTime: number = 3, retryInterval: number = 100) { + constructor(url: string, retryTime: number = 3, retryInterval: number = 100) { this.retryTime = retryTime this.retryInterval = retryInterval + this.core = generateCore(url) } public getRangeBlocks = async (blockNumbers: string[]): Promise => { @@ -35,7 +28,7 @@ export default class GetBlocks { } public getTipBlockNumber = async (): Promise => { - const tip: string = await core.rpc.getTipBlockNumber() + const tip: string = await this.core.rpc.getTipBlockNumber() return tip } @@ -48,7 +41,7 @@ export default class GetBlocks { public retryGetBlock = async (num: string): Promise => { const block: Block = await Utils.retry(this.retryTime, this.retryInterval, async () => { - const b: Block = await GetBlocks.getBlockByNumber(num) + const b: Block = await this.getBlockByNumber(num) return b }) @@ -56,23 +49,23 @@ export default class GetBlocks { } public getTransaction = async (hash: string): Promise => { - const tx = await core.rpc.getTransaction(hash) + const tx = await this.core.rpc.getTransaction(hash) return tx } public getHeader = async (hash: string): Promise => { - const result = await core.rpc.getHeader(hash) + const result = await this.core.rpc.getHeader(hash) return TypeConvert.toBlockHeader(result) } - public static getBlockByNumber = async (num: string): Promise => { - const block = await core.rpc.getBlockByNumber(num) + public getBlockByNumber = async (num: string): Promise => { + const block = await this.core.rpc.getBlockByNumber(num) return TypeConvert.toBlock(block) } - public static genesisBlockHash = async (): Promise => { + public genesisBlockHash = async (): Promise => { const hash: string = await Utils.retry(3, 100, async () => { - const h: string = await core.rpc.getBlockHash('0') + const h: string = await this.core.rpc.getBlockHash('0') return h }) diff --git a/packages/neuron-wallet/src/services/sync/queue.ts b/packages/neuron-wallet/src/services/sync/queue.ts index d8dc2a689d..68dd417d24 100644 --- a/packages/neuron-wallet/src/services/sync/queue.ts +++ b/packages/neuron-wallet/src/services/sync/queue.ts @@ -23,15 +23,16 @@ export default class Queue { private yieldTime = 1 constructor( + url: string, lockHashes: string[], startBlockNumber: string, endBlockNumber: string, currentBlockNumber: BlockNumber = new BlockNumber(), - rangeForCheck: RangeForCheck = new RangeForCheck(), + rangeForCheck: RangeForCheck = new RangeForCheck(url), start: boolean = true ) { this.lockHashes = lockHashes - this.getBlocksService = new GetBlocks() + this.getBlocksService = new GetBlocks(url) this.startBlockNumber = BigInt(startBlockNumber) this.endBlockNumber = BigInt(endBlockNumber) this.rangeForCheck = rangeForCheck diff --git a/packages/neuron-wallet/src/services/sync/range-for-check.ts b/packages/neuron-wallet/src/services/sync/range-for-check.ts index e0273e2c4c..0a79888712 100644 --- a/packages/neuron-wallet/src/services/sync/range-for-check.ts +++ b/packages/neuron-wallet/src/services/sync/range-for-check.ts @@ -11,6 +11,11 @@ export enum CheckResultType { export default class RangeForCheck { private range: BlockHeader[] = [] private checkSize = 12 + private url: string + + constructor(url: string) { + this.url = url + } public getRange = async (): Promise => { if (this.range.length <= 0) { @@ -26,7 +31,7 @@ export default class RangeForCheck { const realStartBlockNumber: bigint = startBlockNumber > BigInt(0) ? startBlockNumber : BigInt(0) const blockNumbers = Utils.range(realStartBlockNumber.toString(), currentBlockNumber.toString()) - const getBlocksService = new GetBlocks() + const getBlocksService = new GetBlocks(this.url) const blocks: Block[] = await getBlocksService.getRangeBlocks(blockNumbers) const blockHeaders: BlockHeader[] = blocks.map((block: Block) => { return block.header diff --git a/packages/neuron-wallet/src/startup/sync-block-task/sync.ts b/packages/neuron-wallet/src/startup/sync-block-task/sync.ts index 87f2e48171..b6dd49929d 100644 --- a/packages/neuron-wallet/src/startup/sync-block-task/sync.ts +++ b/packages/neuron-wallet/src/startup/sync-block-task/sync.ts @@ -26,7 +26,7 @@ export const loadAddressesAndConvert = async (): Promise => { // call this after network switched let blockListener: BlockListener | undefined -export const switchNetwork = async () => { +export const switchNetwork = async (url: string) => { // stop all blocks service if (blockListener) { await blockListener.stopAndWait() @@ -37,7 +37,7 @@ export const switchNetwork = async () => { // load lockHashes const lockHashes: string[] = await loadAddressesAndConvert() // start sync blocks service - blockListener = new BlockListener(lockHashes, nodeService.tipNumberSubject) + blockListener = new BlockListener(url, lockHashes, nodeService.tipNumberSubject) // listen to address created addressCreatedSubject.subscribe(async (addresses: Address[]) => { @@ -70,7 +70,7 @@ export const switchNetwork = async () => { } // wait former queue to be drained const hashes: string[] = await loadAddressesAndConvert() - blockListener = new BlockListener(hashes, nodeService.tipNumberSubject) + blockListener = new BlockListener(url, hashes, nodeService.tipNumberSubject) await blockListener.start(true) } diff --git a/packages/neuron-wallet/src/startup/sync-block-task/task.ts b/packages/neuron-wallet/src/startup/sync-block-task/task.ts index 80def9a331..1660234dc4 100644 --- a/packages/neuron-wallet/src/startup/sync-block-task/task.ts +++ b/packages/neuron-wallet/src/startup/sync-block-task/task.ts @@ -38,7 +38,7 @@ export const run = async () => { if (indexerEnabled) { await indexerSwitchNetwork(network.remote) } else { - await syncSwitchNetwork() + await syncSwitchNetwork(network.remote) } } }) diff --git a/packages/neuron-wallet/src/utils/blake2b.ts b/packages/neuron-wallet/src/utils/blake2b.ts index 3134de0403..5fc73dce2f 100644 --- a/packages/neuron-wallet/src/utils/blake2b.ts +++ b/packages/neuron-wallet/src/utils/blake2b.ts @@ -1,17 +1,14 @@ -import Core from '@nervosnetwork/ckb-sdk-core' -import NodeService from 'services/node' +import { blake2b, PERSONAL, hexToBytes } from '@nervosnetwork/ckb-sdk-utils' export default class Blake2b { private blake2b: any - private core: Core constructor() { - this.core = NodeService.getInstance().core - this.blake2b = this.core.utils.blake2b(32, null, null, this.core.utils.PERSONAL) + this.blake2b = blake2b(32, null, null, PERSONAL) } public update = (message: string): void => { - const msg = this.core.utils.hexToBytes(message.replace(/0x/, '')) + const msg = hexToBytes(message.replace(/0x/, '')) this.blake2b.update(msg) } @@ -20,8 +17,8 @@ export default class Blake2b { } public static digest = (message: string): string => { - const blake2b = new Blake2b() - blake2b.update(message) - return blake2b.digest() + const blake2bHash = new Blake2b() + blake2bHash.update(message) + return blake2bHash.digest() } } diff --git a/yarn.lock b/yarn.lock index bc96a19a02..0c95602738 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2294,45 +2294,45 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" -"@nervosnetwork/ckb-sdk-address@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-address/-/ckb-sdk-address-0.19.0.tgz#50bac7dcc2dd15e22b472b7bc1b6502802739e35" - integrity sha512-+EXQD7PBwEJvxbLUYR2DOiArtksvQV9y2E7FyW1tHYsiJlCe5ho65sKA93u4RWnMrOcpy716F7QTnd3oUs6UoA== +"@nervosnetwork/ckb-sdk-address@0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-address/-/ckb-sdk-address-0.19.1.tgz#ec1927310a88a87759010b9e0089e2fce87371f3" + integrity sha512-ZEVX49G1PoXH2+qd4KMnrbYTU4U7fF3uJww/09OIS5xP285Gqb19JBjNCY+tnRj/hSC6HLp9/UqZex1vUZWOWg== dependencies: - "@nervosnetwork/ckb-sdk-utils" "0.19.0" - "@nervosnetwork/ckb-types" "0.19.0" + "@nervosnetwork/ckb-sdk-utils" "0.19.1" + "@nervosnetwork/ckb-types" "0.19.1" -"@nervosnetwork/ckb-sdk-core@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-core/-/ckb-sdk-core-0.19.0.tgz#4aebac1eac86669c3e13d62be05e61c6055d95a2" - integrity sha512-GmoKw2glk0eYiJhaNPXPK0w6MU3WAg3uKnUA/e6ziIqeUftfj/b89/Jm2En/FOtHGWsa/C0po+i3UVeppQJhTg== +"@nervosnetwork/ckb-sdk-core@0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-core/-/ckb-sdk-core-0.19.1.tgz#23042993d083cfc21629bebf5c8270c1878df7dd" + integrity sha512-nWj2BZ4letebndIC+Ohd+eqanYJFF/FLEy1h3nhpN+jPPwKwhHNnt3QARTOOqAOBxUFIz7t6WNXFI7icvmxdTA== dependencies: - "@nervosnetwork/ckb-sdk-address" "0.19.0" - "@nervosnetwork/ckb-sdk-rpc" "0.19.0" - "@nervosnetwork/ckb-sdk-utils" "0.19.0" - "@nervosnetwork/ckb-types" "0.19.0" + "@nervosnetwork/ckb-sdk-address" "0.19.1" + "@nervosnetwork/ckb-sdk-rpc" "0.19.1" + "@nervosnetwork/ckb-sdk-utils" "0.19.1" + "@nervosnetwork/ckb-types" "0.19.1" -"@nervosnetwork/ckb-sdk-rpc@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-rpc/-/ckb-sdk-rpc-0.19.0.tgz#9ca23480987ca8c10e6f4eac4bb4de24e137cac4" - integrity sha512-wrqQPw2rGmvftSlh9scGDIiocJVAbJfbD0nuEAZFHnrbwlsXLGsePcNYbeZx2GgB/a4/525oHro1698HRhCYmw== +"@nervosnetwork/ckb-sdk-rpc@0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-rpc/-/ckb-sdk-rpc-0.19.1.tgz#1f6505e08d989da51a6025c7c6600aaffbce86a9" + integrity sha512-HdeoXUd4s44de9rRYKk/33pOzdfBWP83zUGbQWgFUeTPgNTKd/poCJB9PKChb1HgZENkz2aQgRyY5hObPE1pJA== dependencies: - "@nervosnetwork/ckb-sdk-utils" "0.19.0" + "@nervosnetwork/ckb-sdk-utils" "0.19.1" axios "0.19.0" -"@nervosnetwork/ckb-sdk-utils@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-utils/-/ckb-sdk-utils-0.19.0.tgz#b54237b9ee147f1aa64a7c765812416c72c01b79" - integrity sha512-h2RMkvjlYv9t3atafz5w6qkzSzfooMsw9v3jGYAWHLrQ2Vhd5iCZXB6SEM9xTfkOwOKNpV7E0n8GtzrpwjWEjQ== +"@nervosnetwork/ckb-sdk-utils@0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-sdk-utils/-/ckb-sdk-utils-0.19.1.tgz#86edd68b568596b50fd5a6801d9e52280c31376b" + integrity sha512-xRx8P9L3YBWdE4Itw/VTLENhx4xsagg5C79Jgy+E8NexuMDqEjiZD78Qz0/5LyZ3CaolsN4TwfNjRD3/5fb2kg== dependencies: - "@nervosnetwork/ckb-types" "0.19.0" + "@nervosnetwork/ckb-types" "0.19.1" blake2b-wasm "1.1.7" elliptic "6.4.1" -"@nervosnetwork/ckb-types@0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-types/-/ckb-types-0.19.0.tgz#ce9ca96a7b98fd69621949394c3b571c6ab10614" - integrity sha512-DuNvUNQ0vGKsu0VNwakNfvXK4oH/mP+Ud0rCXAHGq3VCg9ddkz/rH8Jlz2U3/ErrGgCLg56ZuwMVzIn7Klb8Eg== +"@nervosnetwork/ckb-types@0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@nervosnetwork/ckb-types/-/ckb-types-0.19.1.tgz#4e819152b0985a6b8fdd221e6e283c898235dc20" + integrity sha512-Bdlbd2jdSGCZ27Lb0tKTWS8YT01+bLKvpk6Ypnth+nutAywGnh13EOyhXluK6WKXq6uNytBnnBac4O8mccDeVQ== "@nodelib/fs.stat@^1.1.2": version "1.1.3"