Skip to content

Commit 9b1a95a

Browse files
authored
Merge pull request #1019 from ethereumjs/client-fix-undefined-result
client: fix undefined BlockHeaders value when syncing
2 parents a855765 + 5a1789e commit 9b1a95a

File tree

19 files changed

+553
-811
lines changed

19 files changed

+553
-811
lines changed

package-lock.json

Lines changed: 462 additions & 743 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/client/lib/net/peer/peer.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,14 @@ export class Peer extends events.EventEmitter {
9999
* @param {Sender} sender Sender instance provided by subclass
100100
* @return {Promise}
101101
* @example
102-
*
103102
* await peer.bindProtocol(ethProtocol, sender)
104103
* // Example: Directly call message name as a method on the bound protocol
105-
* const headers1 = await peer.eth.getBlockHeaders(1, 100, 0, 0)
104+
* const headers1 = await peer.eth.getBlockHeaders({ block: new BN(1), max: 100 })
106105
* // Example: Call request() method with message name as first parameter
107-
* const headers2 = await peer.eth.request('getBlockHeaders', 1, 100, 0, 0)
106+
* const headers2 = await peer.eth.request('getBlockHeaders', { block: new BN(1), max: 100 })
108107
* // Example: Call send() method with message name as first parameter and
109108
* // wait for response message as an event
110-
* peer.eth.send('getBlockHeaders', 1, 100, 0, 0)
109+
* peer.eth.send('getBlockHeaders', { block: new BN(1), max: 100 })
111110
* peer.eth.on('message', ({ data }) => console.log(`Received ${data.length} headers`))
112111
*/
113112
async bindProtocol(protocol: Protocol, sender: Sender): Promise<void> {

packages/client/lib/net/peer/rlpxpeer.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import { randomBytes } from 'crypto'
22
import {
33
Capabilities as Devp2pCapabilities,
4-
DPT as Devp2pDPT,
54
ETH as Devp2pETH,
65
LES as Devp2pLES,
76
Peer as Devp2pRlpxPeer,
87
RLPx as Devp2pRLPx,
9-
} from 'ethereumjs-devp2p'
8+
} from '@ethereumjs/devp2p'
109
import { Protocol, RlpxSender } from '../protocol'
1110
import { Peer, PeerOptions } from './peer'
1211

@@ -103,9 +102,7 @@ export class RlpxPeer extends Peer {
103102
await Promise.all(this.protocols.map((p) => p.open()))
104103
this.rlpx = new Devp2pRLPx(key, {
105104
capabilities: RlpxPeer.capabilities(this.protocols),
106-
listenPort: null,
107-
dpt: (<unknown>null) as Devp2pDPT, // TODO: required option
108-
maxPeers: (<unknown>null) as number, // TODO: required option
105+
common: this.config.common,
109106
})
110107
await this.rlpx.connect({
111108
id: Buffer.from(this.id, 'hex'),

packages/client/lib/net/protocol/boundprotocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ export class BoundProtocol extends EventEmitter {
170170
;(this as any)[camel] = async (args: any[]) =>
171171
this.request(name, args).catch((error: Error) => {
172172
this.emit('error', error)
173+
return []
173174
})
174175
}
175176
}

packages/client/lib/net/protocol/ethprotocol.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,22 @@ interface EthProtocolOptions extends ProtocolOptions {
88
chain: Chain
99
}
1010

11-
/* Messages with responses that are added as methods in camelCase to BoundProtocol. */
11+
type GetBlockHeadersOpts = {
12+
/* The block's number or hash */
13+
block: BN | Buffer
14+
/* Max number of blocks to return */
15+
max: number
16+
/* Number of blocks to skip apart (default: 0) */
17+
skip?: number
18+
/* Fetch blocks in reverse (default: false) */
19+
reverse?: boolean
20+
}
21+
/*
22+
* Messages with responses that are added as
23+
* methods in camelCase to BoundProtocol.
24+
*/
1225
export interface EthProtocolMethods {
13-
getBlockHeaders: (opts: {
14-
block: BN | Buffer
15-
max: number
16-
skip?: number
17-
reverse?: number
18-
}) => Promise<BlockHeader[]>
26+
getBlockHeaders: (opts: GetBlockHeadersOpts) => Promise<BlockHeader[]>
1927
getBlockBodies: (hashes: Buffer[]) => Promise<Block[]>
2028
}
2129

@@ -30,17 +38,17 @@ const messages: Message[] = [
3038
name: 'GetBlockHeaders',
3139
code: 0x03,
3240
response: 0x04,
33-
encode: ({ block, max, skip = 0, reverse = 0 }: any) => [
41+
encode: ({ block, max, skip = 0, reverse = false }: GetBlockHeadersOpts) => [
3442
BN.isBN(block) ? block.toArrayLike(Buffer) : block,
3543
max,
3644
skip,
37-
reverse,
45+
!reverse ? 0 : 1,
3846
],
3947
decode: ([block, max, skip, reverse]: any) => ({
4048
block: block.length === 32 ? block : new BN(block),
4149
max: bufferToInt(max),
4250
skip: bufferToInt(skip),
43-
reverse: bufferToInt(reverse),
51+
reverse: bufferToInt(reverse) === 0 ? false : true,
4452
}),
4553
},
4654
{

packages/client/lib/net/protocol/lesprotocol.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,26 @@ export interface LesProtocolOptions extends ProtocolOptions {
1212
flow?: FlowControl
1313
}
1414

15-
/* Messages with responses that are added as methods in camelCase to BoundProtocol. */
15+
type GetBlockHeadersOpts = {
16+
/* Request id (default: next internal id) */
17+
reqId?: BN
18+
/* The block's number or hash */
19+
block: BN | Buffer
20+
/* Max number of blocks to return */
21+
max: number
22+
/* Number of blocks to skip apart (default: 0) */
23+
skip?: number
24+
/* Fetch blocks in reverse (default: false) */
25+
reverse?: boolean
26+
}
27+
/*
28+
* Messages with responses that are added as
29+
* methods in camelCase to BoundProtocol.
30+
*/
1631
export interface LesProtocolMethods {
17-
getBlockHeaders: (opts: {
18-
reqId?: BN
19-
block: BN | Buffer
20-
max: number
21-
skip?: number
22-
reverse?: number
23-
}) => Promise<{ reqId: BN; bv: BN; headers: BlockHeader[] }>
32+
getBlockHeaders: (
33+
opts: GetBlockHeadersOpts
34+
) => Promise<{ reqId: BN; bv: BN; headers: BlockHeader[] }>
2435
}
2536

2637
const id = new BN(0)
@@ -48,16 +59,16 @@ const messages: Message[] = [
4859
name: 'GetBlockHeaders',
4960
code: 0x02,
5061
response: 0x03,
51-
encode: ({ reqId, block, max, skip = 0, reverse = 0 }: any) => [
62+
encode: ({ reqId, block, max, skip = 0, reverse = false }: GetBlockHeadersOpts) => [
5263
(reqId === undefined ? id.iaddn(1) : new BN(reqId)).toArrayLike(Buffer),
53-
[BN.isBN(block) ? block.toArrayLike(Buffer) : block, max, skip, reverse],
64+
[BN.isBN(block) ? block.toArrayLike(Buffer) : block, max, skip, !reverse ? 0 : 1],
5465
],
5566
decode: ([reqId, [block, max, skip, reverse]]: any) => ({
5667
reqId: new BN(reqId),
5768
block: block.length === 32 ? block : new BN(block),
5869
max: bufferToInt(max),
5970
skip: bufferToInt(skip),
60-
reverse: bufferToInt(reverse),
71+
reverse: bufferToInt(reverse) === 0 ? false : true,
6172
}),
6273
},
6374
{

packages/client/lib/net/server/rlpxserver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { randomBytes } from 'crypto'
2-
import { RLPx as Devp2pRLPx, Peer as Devp2pRLPxPeer, DPT as Devp2pDPT } from 'ethereumjs-devp2p'
2+
import { RLPx as Devp2pRLPx, Peer as Devp2pRLPxPeer, DPT as Devp2pDPT } from '@ethereumjs/devp2p'
33
import { RlpxPeer } from '../peer/rlpxpeer'
44
import { Server, ServerOptions } from './server'
55

@@ -212,6 +212,7 @@ export class RlpxServer extends Server {
212212
capabilities: RlpxPeer.capabilities(Array.from(this.protocols)),
213213
remoteClientIdFilter: this.clientFilter,
214214
listenPort: this.port,
215+
common: this.config.common,
215216
})
216217

217218
this.rlpx.on('peer:added', async (rlpxPeer: Devp2pRLPxPeer) => {

packages/client/lib/sync/fetcher/blockfetcher.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Fetcher, FetcherOptions } from './fetcher'
22
import { Block, BlockBodyBuffer } from '@ethereumjs/block'
33
import { BN } from 'ethereumjs-util'
44
import { Peer } from '../../net/peer'
5+
import { EthProtocolMethods } from '../../net/protocol'
56
import { Chain } from '../../blockchain'
67

78
export interface BlockFetcherOptions extends FetcherOptions {
@@ -58,13 +59,16 @@ export class BlockFetcher extends Fetcher {
5859

5960
/**
6061
* Requests blocks associated with this job
61-
* @param job
62+
* @param job
6263
*/
6364
async request(job: any): Promise<any> {
6465
const { task, peer } = job
6566
const { first, count } = task
66-
const headers = await peer.eth.getBlockHeaders({ block: first, max: count })
67-
const bodies = await peer.eth.getBlockBodies(headers.map((h: any) => h.hash()))
67+
const headers = await (peer.eth as EthProtocolMethods).getBlockHeaders({
68+
block: first,
69+
max: count,
70+
})
71+
const bodies = await peer.eth.getBlockBodies(headers.map((h) => h.hash()))
6872
const blocks = bodies.map(([txsData, unclesData]: BlockBodyBuffer, i: number) =>
6973
Block.fromValuesArray([headers[i].raw(), txsData, unclesData], { common: this.config.common })
7074
)

packages/client/lib/sync/fetcher/headerfetcher.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { BlockFetcher, BlockFetcherOptions } from './blockfetcher'
22
import { Peer } from '../../net/peer'
3-
import { FlowControl } from '../../net/protocol'
3+
import { FlowControl, LesProtocolMethods } from '../../net/protocol'
44

55
export interface HeaderFetcherOptions extends BlockFetcherOptions {
66
/* Flow control manager */
@@ -26,16 +26,15 @@ export class HeaderFetcher extends BlockFetcher {
2626

2727
/**
2828
* Requests block headers for the given task
29-
* @param job
30-
* @return {Promise}
29+
* @param job
3130
*/
32-
async request(job: any): Promise<any[] | boolean> {
31+
async request(job: any) {
3332
const { task, peer } = job
3433
if (this.flow.maxRequestCount(peer, 'GetBlockHeaders') < this.maxPerRequest) {
3534
// we reached our request limit. try with a different peer.
3635
return false
3736
}
38-
return peer.les.getBlockHeaders({ block: task.first, max: task.count })
37+
return (peer.les as LesProtocolMethods).getBlockHeaders({ block: task.first, max: task.count })
3938
}
4039

4140
/**

packages/client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@
5454
"@ethereumjs/block": "^3.0.0",
5555
"@ethereumjs/blockchain": "^5.0.0",
5656
"@ethereumjs/common": "^2.0.0",
57+
"@ethereumjs/devp2p": "^3.0.3",
5758
"@ethereumjs/trie": "^4.0.0",
5859
"@ethereumjs/vm": "^5.0.0",
5960
"chalk": "^2.4.2",
60-
"ethereumjs-devp2p": "^3.0.3",
6161
"ethereumjs-util": "^7.0.7",
6262
"fs-extra": "^7.0.1",
6363
"jayson": "^3.3.4",

0 commit comments

Comments
 (0)