Skip to content

Commit 83d111e

Browse files
simplify p2p - fix reorg and parentChain
1 parent 6dc72bd commit 83d111e

File tree

13 files changed

+340
-859
lines changed

13 files changed

+340
-859
lines changed

packages/bitcore-node/src/models/block.ts

+14-33
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { CoinModel } from './coin';
22
import { TransactionModel } from './transaction';
33
import { TransformOptions } from '../types/TransformOptions';
4-
import { ChainNetwork } from '../types/ChainNetwork';
54
import { LoggifyClass } from '../decorators/Loggify';
65
import { Bitcoin } from '../types/namespaces/Bitcoin';
76
import { BaseModel } from './base';
87
import logger from '../logger';
8+
import { ChainStateProvider } from '../providers/chain-state';
99

1010
export type IBlock = {
1111
chain: string;
@@ -47,7 +47,7 @@ export class Block extends BaseModel<IBlock> {
4747
}
4848

4949
async addBlock(params: {
50-
block: Bitcoin.Block;
50+
block: any;
5151
parentChain?: string;
5252
forkHeight?: number;
5353
chain: string;
@@ -57,7 +57,11 @@ export class Block extends BaseModel<IBlock> {
5757
const header = block.header.toObject();
5858
const blockTime = header.time * 1000;
5959

60-
await this.handleReorg({ header, chain, network });
60+
const reorg = await this.handleReorg({ header, chain, network });
61+
62+
if (reorg) {
63+
return Promise.reject('reorg');
64+
}
6165

6266
const previousBlock = await this.collection.findOne({ hash: header.prevHash, chain, network });
6367

@@ -125,38 +129,14 @@ export class Block extends BaseModel<IBlock> {
125129
return coinbase;
126130
}
127131

128-
async getLocalTip(params: ChainNetwork) {
129-
const { chain, network } = params;
130-
const [bestBlock] = await this.collection
131-
.find({ processed: true, chain, network })
132-
.sort({ height: -1 })
133-
.limit(1)
134-
.toArray();
135-
return bestBlock || { height: 0 };
136-
}
137-
138-
async getLocatorHashes(params: ChainNetwork) {
139-
const { chain, network } = params;
140-
const locatorBlocks = await this.collection
141-
.find({ processed: true, chain, network })
142-
.sort({ height: -1 })
143-
.limit(30)
144-
.toArray();
145-
146-
if (locatorBlocks.length < 2) {
147-
return [Array(65).join('0')];
148-
}
149-
return locatorBlocks.map(block => block.hash);
150-
}
151-
152-
async handleReorg(params: { header?: Bitcoin.Block.HeaderObj; chain: string; network: string }) {
132+
async handleReorg(params: { header?: Bitcoin.Block.HeaderObj; chain: string; network: string }): Promise<boolean> {
153133
const { header, chain, network } = params;
154-
const localTip = await BlockModel.getLocalTip(params);
155-
if (header && localTip.hash === header.prevHash) {
156-
return;
134+
const localTip = await ChainStateProvider.getLocalTip(params);
135+
if (header && localTip && localTip.hash === header.prevHash) {
136+
return false;
157137
}
158-
if (localTip.height === 0) {
159-
return;
138+
if (!localTip || localTip.height === 0) {
139+
return false;
160140
}
161141
logger.info(`Resetting tip to ${localTip.previousBlockHash}`, { chain, network });
162142
await this.collection.remove({ chain, network, height: { $gte: localTip.height } });
@@ -169,6 +149,7 @@ export class Block extends BaseModel<IBlock> {
169149
);
170150

171151
logger.debug('Removed data from above blockHeight: ', localTip.height);
152+
return true;
172153
}
173154

174155
_apiTransform(block: IBlock, options: TransformOptions): any {

packages/bitcore-node/src/providers/chain-state/index.ts

+8
Original file line numberDiff line numberDiff line change
@@ -95,5 +95,13 @@ class ChainStateProxy implements CSP.ChainStateProvider {
9595
async getCoinsForTx(params: { chain: string; network: string; txid: string }) {
9696
return this.get(params).getCoinsForTx(params);
9797
}
98+
99+
async getLocalTip(params) {
100+
return this.get(params).getLocalTip(params);
101+
}
102+
103+
async getLocatorHashes(params) {
104+
return this.get(params).getLocatorHashes(params);
105+
}
98106
}
99107
export let ChainStateProvider = new ChainStateProxy();

packages/bitcore-node/src/providers/chain-state/internal/internal.ts

+17
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,21 @@ export class InternalStateProvider implements CSP.IChainStateService {
282282
outputs: outputs.map(output => CoinModel._apiTransform(output, { object: true }))
283283
};
284284
}
285+
286+
async getLocalTip({ chain, network }) {
287+
return BlockModel.collection.findOne({ chain, network, processed: true}, { sort: { height: -1 }});
288+
}
289+
290+
async getLocatorHashes(params) {
291+
const { chain, network } = params;
292+
const locatorBlocks = await BlockModel.collection.find({
293+
processed: true,
294+
chain,
295+
network
296+
}, { sort: { height: -1 }, limit: 30}).toArray();
297+
if (locatorBlocks.length < 2) {
298+
return [Array(65).join('0')];
299+
}
300+
return locatorBlocks.map(block => block.hash);
301+
}
285302
}

packages/bitcore-node/src/server.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { P2pProvider } from './services/p2p';
1+
import { P2pService } from './services/p2p';
22
import { Storage } from './services/storage';
33
import { Worker } from './services/worker';
44
import { Api } from './services/api';
@@ -9,7 +9,7 @@ let args = parseArgv([], ['DEBUG']);
99
const startServices = async () => {
1010
await Storage.start({});
1111
await Worker.start();
12-
P2pProvider.startConfiguredChains();
12+
P2pService.startConfiguredChains();
1313
};
1414

1515
const runMaster = async() => {

0 commit comments

Comments
 (0)