Skip to content

Commit 582b4ef

Browse files
authored
Merge pull request #1020 from ethereumjs/client-eth64-update
Integrate ETH/64 Protocol into Client
2 parents 9b1a95a + bed89dc commit 582b4ef

File tree

14 files changed

+49
-44
lines changed

14 files changed

+49
-44
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { parseMultiaddrs } from '../../util'
55
import { Libp2pSender } from '../protocol/libp2psender'
66
import { Peer, PeerOptions } from './peer'
77
import { Libp2pNode } from './libp2pnode'
8+
import { Protocol } from '../protocol'
9+
import { Libp2pServer } from '../server'
810

911
export interface Libp2pPeerOptions extends Omit<PeerOptions, 'address' | 'transport'> {
1012
/* Multiaddrs to listen on (can be a comma separated string or list) */
@@ -73,7 +75,7 @@ export class Libp2pPeer extends Peer {
7375
* @private
7476
* @return {Promise}
7577
*/
76-
async accept(protocol: any, connection: any, server: any): Promise<void> {
78+
async accept(protocol: Protocol, connection: any, server: Libp2pServer): Promise<void> {
7779
await this.bindProtocol(protocol, new Libp2pSender(connection))
7880
this.inbound = true
7981
this.server = server
@@ -87,7 +89,7 @@ export class Libp2pPeer extends Peer {
8789
* @param {Server} [server] optional server that initiated connection
8890
* @return {Promise}
8991
*/
90-
async bindProtocols(node: any, peerInfo: any, server: any = null): Promise<void> {
92+
async bindProtocols(node: Libp2pNode, peerInfo: any, server?: Libp2pServer): Promise<void> {
9193
await Promise.all(
9294
this.protocols.map(async (p: any) => {
9395
await p.open()

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ import {
88
} from '@ethereumjs/devp2p'
99
import { Protocol, RlpxSender } from '../protocol'
1010
import { Peer, PeerOptions } from './peer'
11+
import { RlpxServer } from '../server'
1112

1213
const devp2pCapabilities: any = {
13-
eth62: Devp2pETH.eth62,
1414
eth63: Devp2pETH.eth63,
15+
eth64: Devp2pETH.eth64,
1516
les2: Devp2pLES.les2,
1617
}
1718

@@ -140,7 +141,7 @@ export class RlpxPeer extends Peer {
140141
* @private
141142
* @return {Promise}
142143
*/
143-
async accept(rlpxPeer: Devp2pRlpxPeer, server: any): Promise<void> {
144+
async accept(rlpxPeer: Devp2pRlpxPeer, server: RlpxServer): Promise<void> {
144145
if (this.connected) {
145146
return
146147
}
@@ -157,9 +158,9 @@ export class RlpxPeer extends Peer {
157158
async bindProtocols(rlpxPeer: Devp2pRlpxPeer): Promise<void> {
158159
this.rlpxPeer = rlpxPeer
159160
await Promise.all(
160-
rlpxPeer.getProtocols().map((rlpxProtocol: any) => {
161+
rlpxPeer.getProtocols().map((rlpxProtocol) => {
161162
const name = rlpxProtocol.constructor.name.toLowerCase()
162-
const protocol = this.protocols.find((p: any) => p.name === name)
163+
const protocol = this.protocols.find((p) => p.name === name)
163164
if (protocol) {
164165
return this.bindProtocol(protocol, new RlpxSender(rlpxProtocol))
165166
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { EventEmitter } from 'events'
2-
import { Protocol } from '../protocol/protocol'
2+
import { Message, Protocol } from '../protocol/protocol'
33
import { Peer } from '../peer/peer'
44
import { Sender } from './sender'
55
import { Config } from '../../config'
@@ -31,7 +31,7 @@ export class BoundProtocol extends EventEmitter {
3131
private versions: number[]
3232
private timeout: number
3333
private _status: any
34-
private resolvers: Map<string, any>
34+
private resolvers: Map<string | number, any>
3535

3636
/**
3737
* Create bound protocol
@@ -80,9 +80,9 @@ export class BoundProtocol extends EventEmitter {
8080
* @param {Object} message message object
8181
* @emits message
8282
*/
83-
handle(incoming: any) {
83+
handle(incoming: Message) {
8484
const messages = this.protocol.messages
85-
const message = messages.find((m: any) => m.code === incoming.code)
85+
const message = messages.find((m) => m.code === incoming.code)
8686
if (!message) {
8787
return
8888
}
@@ -117,16 +117,16 @@ export class BoundProtocol extends EventEmitter {
117117
* @param name message name
118118
* @param args message arguments
119119
*/
120-
send(name: string, args?: any): any {
120+
send(name: string, args?: any) {
121121
const messages = this.protocol.messages
122-
const message = messages.find((m: any) => m.name === name)
122+
const message = messages.find((m) => m.name === name)
123123
if (message) {
124124
const encoded = this.protocol.encode(message, args)
125125
this.sender.sendMessage(message.code, encoded)
126-
return message
127126
} else {
128127
throw new Error(`Unknown message: ${name}`)
129128
}
129+
return message
130130
}
131131

132132
/**
@@ -143,14 +143,14 @@ export class BoundProtocol extends EventEmitter {
143143
resolve: null,
144144
reject: null,
145145
}
146-
if (this.resolvers.get(message.response)) {
146+
if (this.resolvers.get(message.response!)) {
147147
throw new Error(`Only one active request allowed per message type (${name})`)
148148
}
149-
this.resolvers.set(message.response, resolver)
149+
this.resolvers.set(message.response!, resolver)
150150
return new Promise((resolve, reject) => {
151151
resolver.timeout = setTimeout(() => {
152152
resolver.timeout = null
153-
this.resolvers.delete(message.response)
153+
this.resolvers.delete(message.response!)
154154
reject(new Error(`Request timed out after ${this.timeout}ms`))
155155
}, this.timeout)
156156
resolver.resolve = resolve
@@ -163,9 +163,9 @@ export class BoundProtocol extends EventEmitter {
163163
* corresponding response message.
164164
*/
165165
addMethods() {
166-
const messages = this.protocol.messages.filter((m: any) => m.response)
166+
const messages = this.protocol.messages.filter((m) => m.response)
167167
for (const message of messages) {
168-
const name = message.name as string
168+
const name = message.name
169169
const camel = name[0].toLowerCase() + name.slice(1)
170170
;(this as any)[camel] = async (args: any[]) =>
171171
this.request(name, args).catch((error: Error) => {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class EthProtocol extends Protocol {
9999
* @type {number[]}
100100
*/
101101
get versions(): number[] {
102-
return [63, 62]
102+
return [64, 63]
103103
}
104104

105105
/**
@@ -127,6 +127,7 @@ export class EthProtocol extends Protocol {
127127
* @return {Object}
128128
*/
129129
encodeStatus(): any {
130+
// TODO: add latestBlock for more precise ETH/64 forkhash switch
130131
return {
131132
networkId: this.chain.networkId,
132133
td: this.chain.blocks.td.toArrayLike(Buffer),

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ export class LesProtocol extends Protocol {
130130
* Messages defined by this protocol
131131
* @type {Protocol~Message[]}
132132
*/
133-
get messages(): any {
133+
get messages(): Message[] {
134134
return messages
135135
}
136136

@@ -161,8 +161,8 @@ export class LesProtocol extends Protocol {
161161
txRelay: 1,
162162
'flowControl/BL': new BN(this.flow.bl).toArrayLike(Buffer),
163163
'flowControl/MRR': new BN(this.flow.mrr).toArrayLike(Buffer),
164-
'flowControl/MRC': Object.entries(this.flow.mrc).map(([name, { base, req }]: any) => {
165-
const { code }: any = messages.find((m) => m.name === name)
164+
'flowControl/MRC': Object.entries(this.flow.mrc).map(([name, { base, req }]) => {
165+
const { code } = messages.find((m) => m.name === name)!
166166
return [code, base, req]
167167
}),
168168
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface ProtocolOptions {
1414
export type Message = {
1515
name: string
1616
code: number
17+
payload?: any
1718
// TODO: check semantics of this field
1819
response?: number
1920
// TODO: check if this should be optional

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Sender } from './sender'
22
import { rlp } from 'ethereumjs-util'
3+
import { ETH as Devp2pETH, LES as Devp2pLES } from '@ethereumjs/devp2p'
34

45
/**
56
* DevP2P/RLPx protocol sender
@@ -8,12 +9,12 @@ import { rlp } from 'ethereumjs-util'
89
* @memberof module:net/protocol
910
*/
1011
export class RlpxSender extends Sender {
11-
private sender: any
12+
private sender: Devp2pETH | Devp2pLES
1213
/**
1314
* Creates a new DevP2P/Rlpx protocol sender
14-
* @param {Object} rlpxProtocol protocol object from ethereumjs-devp2p
15+
* @param {Object} rlpxProtocol protocol object from @ethereumjs/devp2p
1516
*/
16-
constructor(rlpxProtocol: any) {
17+
constructor(rlpxProtocol: Devp2pETH | Devp2pLES) {
1718
super()
1819

1920
this.sender = rlpxProtocol

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export class Libp2pServer extends Server {
8585
return
8686
}
8787
const peer = this.createPeer(peerInfo)
88-
await peer.bindProtocols(this.node, peerInfo, this)
88+
await peer.bindProtocols(this.node as Libp2pNode, peerInfo, this)
8989
this.config.logger.debug(`Peer discovered: ${peer}`)
9090
this.emit('connected', peer)
9191
} catch (e) {

packages/client/test/integration/fullethereumservice.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ tape('[Integration:FullEthereumService]', async (t) => {
3434
t.ok(headers![1].hash().equals(hash), 'handled GetBlockHeaders')
3535
const bodies = await peer.eth!.getBlockBodies([hash])
3636
t.deepEquals(bodies, [[[], []]], 'handled GetBlockBodies')
37-
await peer.eth!.send('NewBlockHashes', [[hash, new BN(2)]])
37+
peer.eth!.send('NewBlockHashes', [[hash, new BN(2)]])
3838
t.pass('handled NewBlockHashes')
3939
await destroy(server, service)
4040
t.end()

packages/client/test/net/peer/libp2ppeer.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ tape('[Libp2pPeer]', async (t) => {
5959

6060
t.test('should connect to peer', async (t) => {
6161
const config = new Config({ loglevel: 'error' })
62-
const peer = new Libp2pPeer({ config })
62+
const peer: any = new Libp2pPeer({ config })
6363
peer.bindProtocols = td.func<typeof peer['bindProtocol']>()
64-
td.when(peer.bindProtocols(td.matchers.anything(), peerInfo)).thenResolve()
64+
td.when(peer.bindProtocols(td.matchers.anything(), peerInfo)).thenResolve(null)
6565
peer.on('connected', () => {
6666
t.pass('connected')
6767
t.end()
@@ -71,9 +71,9 @@ tape('[Libp2pPeer]', async (t) => {
7171

7272
t.test('should accept peer connection', async (t) => {
7373
const config = new Config({ loglevel: 'error' })
74-
const peer = new Libp2pPeer({ config })
74+
const peer: any = new Libp2pPeer({ config })
7575
peer.bindProtocol = td.func<typeof peer['bindProtocol']>()
76-
td.when(peer.bindProtocol('proto' as any, 'conn' as any)).thenResolve()
76+
td.when(peer.bindProtocol('proto' as any, 'conn' as any)).thenResolve(null)
7777
await peer.accept('proto', 'conn', 'server')
7878
t.equals(peer.server, 'server', 'server set')
7979
t.ok(peer.inbound, 'inbound set to true')
@@ -84,12 +84,12 @@ tape('[Libp2pPeer]', async (t) => {
8484
const config = new Config({ loglevel: 'error' })
8585
const protocol = { name: 'proto', versions: [1], open: () => {} } as Protocol
8686
const badProto = { name: 'bad', versions: [1], open: () => {} } as Protocol
87-
const peer = new Libp2pPeer({ config, protocols: [protocol, badProto] })
87+
const peer: any = new Libp2pPeer({ config, protocols: [protocol, badProto] })
8888
const node = new Libp2pNode() as any
8989
peer.bindProtocol = td.func<typeof peer['bindProtocol']>()
9090
protocol.open = td.func<Protocol['open']>()
9191
badProto.open = td.func<Protocol['open']>()
92-
td.when(peer.bindProtocol(protocol, td.matchers.isA(Libp2pSender))).thenResolve()
92+
td.when(peer.bindProtocol(protocol, td.matchers.isA(Libp2pSender))).thenResolve(null)
9393
td.when(protocol.open()).thenResolve()
9494
td.when(node.asyncDialProtocol(peerInfo, '/proto/1')).thenResolve(null)
9595
td.when(node.asyncDialProtocol(peerInfo, '/bad/1')).thenReject(new Error('bad'))

0 commit comments

Comments
 (0)