Skip to content

Commit 83c0117

Browse files
committed
feat: assume_valid_target
1 parent a73282e commit 83c0117

File tree

7 files changed

+69
-57
lines changed

7 files changed

+69
-57
lines changed

packages/neuron-wallet/.env

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,4 @@ MULTISIG_CODE_HASH=0x5c5069eb0857efc65e1bca0c07df34c31663b3622fd3876c876320fc963
118118

119119
# CKB NODE OPTIONS
120120
CKB_NODE_ASSUME_VALID_TARGET='0x1381f9e4f70ce521256c4095fa536d11165488171a8a2cbac687f8cf53907afa'
121-
CKB_NODE_ASSUME_VALID_TARGET_BLOCK_NUMBER=15119157
122121
CKB_NODE_DATA_SIZE=118

packages/neuron-wallet/src/controllers/sync-api.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import EventEmiter from 'events'
22
import { debounceTime } from 'rxjs/operators'
3-
import env from '../env'
43
import RpcService from '../services/rpc-service'
54
import SyncedBlockNumber from '../models/synced-block-number'
65
import SyncStateSubject from '../models/subjects/sync-state-subject'
@@ -11,7 +10,6 @@ import { NetworkType } from '../models/network'
1110

1211
const TEN_MINS = 600000
1312
const MAX_TIP_BLOCK_DELAY = 180000
14-
const { app } = env
1513

1614
export enum SyncStatus {
1715
SyncNotStart,
@@ -133,22 +131,16 @@ export default class SyncApiController {
133131
const currentTimestamp = Date.now()
134132
const network = NetworksService.getInstance().getCurrent()
135133
const tipHeader = await new RpcService(network.remote, network.type).getTipHeader()
134+
const syncState = await new RpcService(network.remote, network.type).getSyncState()
136135

137136
const { bestKnownBlockNumber, bestKnownBlockTimestamp } = await this.#fetchBestKnownBlockInfo()
138137
const foundBestKnownBlockNumber = this.#foundBestKnownBlockNumber(bestKnownBlockNumber)
139138

140139
const remainingBlocksToCache = bestKnownBlockNumber - cacheTipNumber
141140
const remainingBlocksToIndex = bestKnownBlockNumber - indexerTipNumber
142-
const setAssumeValidTargetBlockNumber =
143-
app.isPackaged &&
144-
process.env.CKB_NODE_ASSUME_VALID_TARGET &&
145-
process.env.CKB_NODE_ASSUME_VALID_TARGET_BLOCK_NUMBER
146-
? +process.env.CKB_NODE_ASSUME_VALID_TARGET_BLOCK_NUMBER
147-
: undefined
141+
148142
const isLookingValidTarget =
149-
network.type === NetworkType.Default &&
150-
!!setAssumeValidTargetBlockNumber &&
151-
bestKnownBlockNumber < setAssumeValidTargetBlockNumber
143+
network.type === NetworkType.Default && !syncState.assumeValidTargetReached && syncState.assumeValidTarget
152144

153145
const newSyncState: SyncState = {
154146
nodeUrl: network.remote,
@@ -162,7 +154,7 @@ export default class SyncApiController {
162154
estimate: undefined,
163155
status: SyncStatus.Syncing,
164156
isLookingValidTarget,
165-
validTarget: process.env.CKB_NODE_ASSUME_VALID_TARGET,
157+
validTarget: syncState.assumeValidTarget || '0x',
166158
}
167159

168160
if (foundBestKnownBlockNumber) {

packages/neuron-wallet/src/services/rpc-service.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,14 @@ export default class RpcService {
6969
})
7070
}
7171

72-
public async getSyncState(): Promise<CKBComponents.SyncState> {
72+
public async getSyncState(): Promise<
73+
CKBComponents.SyncState & {
74+
assumeValidTarget: string
75+
assumeValidTargetReached: boolean
76+
}
77+
> {
7378
const syncState = await this.retry(async () => {
74-
return await this.rpc.syncState()
79+
return await this.rpc.getSyncState()
7580
})
7681
return syncState
7782
}

packages/neuron-wallet/src/types/rpc.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ declare namespace RPC {
251251
txs_fee: string
252252
}
253253
export interface SyncState {
254+
assume_valid_target: string
255+
assume_valid_target_reached: boolean
254256
best_known_block_number: string
255257
best_known_block_timestamp: string
256258
fast_time: string

packages/neuron-wallet/src/utils/ckb-rpc.ts

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,19 +118,62 @@ const lightRPCProperties: Record<string, Omit<Parameters<CKBRPC['addMethod']>[0]
118118
},
119119
}
120120

121+
class Method extends SdkRpcMethod {
122+
constructor(node: CKBComponents.Node, options: CKBComponents.Method) {
123+
super(node, options, rpcConfig)
124+
}
125+
}
126+
121127
export class FullCKBRPC extends CKBRPC {
128+
constructor(url: string, rpcConfig: Partial<RPCConfig>) {
129+
super(url, rpcConfig)
130+
this.setNode({ url })
131+
132+
this.getSyncState = new Method(this.node, {
133+
name: 'getSyncState',
134+
method: 'sync_state',
135+
paramsFormatters: [],
136+
resultFormatters: (state: {
137+
assume_valid_target: string
138+
assume_valid_target_reached: boolean
139+
best_known_block_number: any
140+
best_known_block_timestamp: any
141+
fast_time: any
142+
ibd: any
143+
inflight_blocks_count: any
144+
low_time: any
145+
normal_time: any
146+
orphan_blocks_count: any
147+
}) => {
148+
if (!state) {
149+
return state
150+
}
151+
return {
152+
assumeValidTarget: state.assume_valid_target,
153+
assumeValidTargetReached: state.assume_valid_target_reached,
154+
bestKnownBlockNumber: state.best_known_block_number,
155+
bestKnownBlockTimestamp: state.best_known_block_timestamp,
156+
fastTime: state.fast_time,
157+
ibd: state.ibd,
158+
inflightBlocksCount: state.inflight_blocks_count,
159+
lowTime: state.low_time,
160+
normalTime: state.normal_time,
161+
orphanBlocksCount: state.orphan_blocks_count,
162+
}
163+
},
164+
}).call
165+
}
166+
122167
getGenesisBlockHash = async () => {
123168
return this.getBlockHash('0x0')
124169
}
125170

126171
getGenesisBlock = async (): Promise<Block> => {
127172
return this.getBlockByNumber('0x0')
128173
}
129-
}
130174

131-
class Method extends SdkRpcMethod {
132-
constructor(node: CKBComponents.Node, options: CKBComponents.Method) {
133-
super(node, options, rpcConfig)
175+
getSyncState = async (): Promise<CKBComponents.SyncState> => {
176+
return this.getSyncState()
134177
}
135178
}
136179

@@ -233,6 +276,14 @@ export class LightRPC extends Base {
233276
return genesisBlock.header.hash
234277
}
235278

279+
getSyncState = async () => {
280+
const headerTip = await this.getTipHeader()
281+
return {
282+
bestKnownBlockNumber: headerTip.number,
283+
bestKnownBlockTimestamp: headerTip.timestamp,
284+
} as CKBComponents.SyncState
285+
}
286+
236287
syncState = async () => {
237288
const headerTip = await this.getTipHeader()
238289
return {

packages/neuron-wallet/tests/controllers/sync-api.test.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ jest.doMock('models/subjects/networks', () => {
4747
jest.mock('services/multisig', () => ({
4848
syncMultisigOutput: () => jest.fn(),
4949
}))
50-
jest.mock('env', () => ({
51-
app: {
52-
isPackaged: true,
53-
},
54-
}))
5550

5651
describe('SyncApiController', () => {
5752
const emitter = new Emitter()

scripts/update-wallet-env.js

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,9 @@
11
const fs = require('node:fs')
22
const path = require('node:path')
33

4-
async function rpcRequest(method, params = []) {
5-
const result = await fetch(
6-
'https://mainnet.ckb.dev/rpc',
7-
{
8-
method: 'POST',
9-
headers: {
10-
'Content-Type': 'application/json',
11-
},
12-
body: JSON.stringify({
13-
id: 0,
14-
jsonrpc: '2.0',
15-
method,
16-
params,
17-
}),
18-
timeout: 10000,
19-
}
20-
)
21-
return result.json()
22-
}
23-
24-
const ESTIMATE_BLOCK_COUNT_PER_DAY = 8_000
254
const envFilePath = path.resolve(__dirname, '../packages/neuron-wallet/.env')
26-
const validTargetReg = /(CKB_NODE_ASSUME_VALID_TARGET=)[\S]*/
27-
const blockNumberReg = /(CKB_NODE_ASSUME_VALID_TARGET_BLOCK_NUMBER=)[\S]*/
285
const ckbNodeDataSizeReg = /(CKB_NODE_DATA_SIZE=)[\S]*/
296

30-
async function getValidTarget() {
31-
const tipBlockNumber = (await rpcRequest('get_tip_block_number')).result
32-
const validTargetBlockNumber = `0x${(BigInt(tipBlockNumber) - BigInt(ESTIMATE_BLOCK_COUNT_PER_DAY)).toString(16)}`
33-
return [validTargetBlockNumber, (await rpcRequest('get_block_hash', [validTargetBlockNumber])).result]
34-
}
35-
367
async function getCKBNodeSize() {
378
const res = await fetch('https://ckb-node-info.magickbase.com/api')
389
const { data_size_g } = await res.json()
@@ -42,14 +13,11 @@ async function getCKBNodeSize() {
4213
;(async function () {
4314
try {
4415
console.info('start updating env file')
45-
const [blockNumber, blockHash] = await getValidTarget()
4616
const ckbNodeDataSize = await getCKBNodeSize()
4717
const originEnvContent = fs.readFileSync(envFilePath).toString('utf-8')
4818
fs.writeFileSync(
4919
envFilePath,
50-
originEnvContent.replace(validTargetReg, `CKB_NODE_ASSUME_VALID_TARGET='${blockHash}'`)
51-
.replace(blockNumberReg, `CKB_NODE_ASSUME_VALID_TARGET_BLOCK_NUMBER=${+blockNumber}`)
52-
.replace(ckbNodeDataSizeReg, `CKB_NODE_DATA_SIZE=${ckbNodeDataSize}`)
20+
originEnvContent.replace(ckbNodeDataSizeReg, `CKB_NODE_DATA_SIZE=${ckbNodeDataSize}`)
5321
)
5422
console.info('write success')
5523
} catch (error) {

0 commit comments

Comments
 (0)