Skip to content

Commit

Permalink
client/vm: small fixes (#1541)
Browse files Browse the repository at this point in the history
* fix generateGenesis setting toBalance, don't overwrite codeHash and stateRoot, tidy

* fix chalk output, update chalk to latest, tidy file and add typedocs

* attempt to resolve peer:error event handler memory leak by removing bound listener after disconnect, tidy

* fix new webpack polyfill errors from node-fetch, which we don't use so can safely pass false

* nit: more stateManager generateGenesis code tidying

* update multiaddrs to latest to fix libp2p so it doesn't bring node-fetch into webpack/karma
  • Loading branch information
ryanio authored Oct 22, 2021
1 parent 2dfa7ee commit 125e210
Show file tree
Hide file tree
Showing 21 changed files with 3,796 additions and 3,684 deletions.
7,205 changes: 3,646 additions & 3,559 deletions package-lock.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions packages/client/browser/libp2pnode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import LibP2p from 'libp2p'
import { NOISE } from '@chainsafe/libp2p-noise'
import PeerId from 'peer-id'
import multiaddr from 'multiaddr'
import { Multiaddr } from 'multiaddr'
// types currently unavailable for below libp2p deps,
// tracking issue: https://github.com/libp2p/js-libp2p/issues/659
const LibP2pWebsockets = require('libp2p-websockets')
Expand All @@ -22,11 +22,11 @@ export interface Libp2pNodeOptions {
addresses?: {
listen?: string[]
announce?: string[]
announceFilter?: (ma: multiaddr[]) => multiaddr[]
announceFilter?: (ma: Multiaddr[]) => Multiaddr[]
}

/* Bootnodes */
bootnodes?: multiaddr[]
bootnodes?: Multiaddr[]
}

export class Libp2pNode extends LibP2p {
Expand Down
2 changes: 1 addition & 1 deletion packages/client/lib/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Common, { Hardfork } from '@ethereumjs/common'
import VM from '@ethereumjs/vm'
import { genPrivateKey } from '@ethereumjs/devp2p'
import { Address } from 'ethereumjs-util'
import Multiaddr from 'multiaddr'
import { Multiaddr } from 'multiaddr'
import { Logger, getLogger } from './logging'
import { Libp2pServer, RlpxServer } from './net/server'
import { parseTransports } from './util'
Expand Down
104 changes: 59 additions & 45 deletions packages/client/lib/logging.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,41 @@ const DailyRotateFile = require('winston-daily-rotate-file')

export type Logger = WinstonLogger

const levelColors = {
error: 'red',
warn: 'yellow',
info: 'green',
debug: 'white',
}

const { combine, timestamp, label, printf } = format

/**
* Colors for logger levels
*/
enum LevelColors {
error = 'red',
warn = 'yellow',
info = 'green',
debug = 'white',
}

/*
* Adds stack trace to error message if included
*/
const errorFormat = format((info: any) => {
if (info.message instanceof Error && info.message.stack) {
info.message = info.message.stack
return { ...info, message: info.message.stack }
}
if (info instanceof Error && info.stack) {
return Object.assign({}, info, { message: info.stack })
return { ...info, message: info.stack }
}
return info
})

function logFormat(colors = true) {
/**
* Returns the formatted log output optionally with colors enabled
*/
function logFormat(colors = false) {
return printf((info: any) => {
let level = info.level.toUpperCase()
if (colors) {
// @ts-ignore: implicitly has an 'any' TODO
const color = chalk[levelColors[info.level]].bind(chalk)
level = color(info.level.toUpperCase())
const colorLevel = LevelColors[info.level as keyof typeof LevelColors]
const color = chalk.keyword(colorLevel).bind(chalk)
level = color(level)
const re = /(\w+)=(.+?)(?:\s|$)/g
info.message = info.message.replace(
re,
Expand All @@ -40,7 +49,10 @@ function logFormat(colors = true) {
})
}

function formatConfig(colors = true) {
/**
* Returns the complete logger format
*/
function formatConfig(colors = false) {
return combine(
errorFormat(),
format.splat(),
Expand All @@ -50,44 +62,46 @@ function formatConfig(colors = true) {
)
}

/**
* Returns a transport with log file saving (rotates if args.logRotate is true)
*/
function logFileTransport(args: any) {
let filename = args.logFile === true ? 'ethereumjs.log' : args.logFile
const opts = {
level: args.logLevelFile,
format: formatConfig(),
}
if (!args.logRotate) {
return new wTransports.File({
...opts,
filename,
})
} else {
// Insert %DATE% before the last period
const lastPeriod = filename.lastIndexOf('.')
filename = `${filename.substring(0, lastPeriod)}.%DATE%${filename.substring(lastPeriod)}`
return new DailyRotateFile({
...opts,
filename,
maxFiles: args.logMaxFiles,
})
}
}

/**
* Returns a formatted {@link Logger}
*/
export function getLogger(args: { [key: string]: any } = { loglevel: 'info' }) {
const transports: any[] = [
new wTransports.Console({
level: args.loglevel,
silent: args.loglevel === 'off',
format: formatConfig(),
format: formatConfig(true),
}),
]
let filename = args.logFile === true ? 'ethereumjs.log' : args.logFile
if (filename) {
const opts = {
level: args.logLevelFile,
format: formatConfig(false),
}
if (args.logRotate) {
// Insert %DATE% before the last period
const lastPeriod = filename.lastIndexOf('.')
filename = `${filename.substring(0, lastPeriod)}.%DATE%${filename.substring(lastPeriod)}`
transports.push(
new DailyRotateFile({
...opts,
filename,
maxFiles: args.logMaxFiles,
})
)
} else {
transports.push(
new wTransports.File({
...opts,
filename,
})
)
}
}

const logger = createLogger({ format: formatConfig(), transports })
if (filename) {
logger.debug(`Writing log file=${filename}`)
if (args.logFile) {
transports.push(logFileTransport(args))
}
const logger = createLogger({ transports })
return logger
}
6 changes: 3 additions & 3 deletions packages/client/lib/net/peer/libp2pnode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* @memberof module:net/peer
*/

import multiaddr from 'multiaddr'
import { Multiaddr } from 'multiaddr'
import LibP2p from 'libp2p'
import { NOISE } from '@chainsafe/libp2p-noise'
import PeerId from 'peer-id'
Expand All @@ -24,11 +24,11 @@ export interface Libp2pNodeOptions {
addresses?: {
listen?: string[]
announce?: string[]
announceFilter?: (ma: multiaddr[]) => multiaddr[]
announceFilter?: (ma: Multiaddr[]) => Multiaddr[]
}

/* Bootnodes */
bootnodes?: multiaddr[]
bootnodes?: Multiaddr[]
}

export class Libp2pNode extends LibP2p {
Expand Down
15 changes: 8 additions & 7 deletions packages/client/lib/net/peer/libp2ppeer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import multiaddr from 'multiaddr'
import { Multiaddr, multiaddr } from 'multiaddr'
import PeerId from 'peer-id'
import { Libp2pMuxedStream as MuxedStream } from '../../types'
import { Libp2pSender } from '../protocol/libp2psender'
Expand All @@ -7,17 +7,18 @@ import { Libp2pNode } from './libp2pnode'
import { Protocol } from '../protocol'
import { Libp2pServer } from '../server'
import { Event } from '../../types'

export interface Libp2pPeerOptions extends Omit<PeerOptions, 'address' | 'transport'> {
/* Multiaddrs to listen on */
multiaddrs?: multiaddr[]
multiaddrs?: Multiaddr[]
}

/**
* Libp2p peer
* @memberof module:net/peer
* @example
* ```typescript
* import multiaddr from 'multiaddr'
* import { multiaddr } from 'multiaddr'
* import { Libp2pPeer } from './lib/net/peer'
* import { Chain } from './lib/blockchain'
* import { EthProtocol } from './lib/net/protocol'
Expand All @@ -35,7 +36,7 @@ export interface Libp2pPeerOptions extends Omit<PeerOptions, 'address' | 'transp
* ```
*/
export class Libp2pPeer extends Peer {
private multiaddrs: multiaddr[]
private multiaddrs: Multiaddr[]
private connected: boolean

/**
Expand Down Expand Up @@ -63,7 +64,7 @@ export class Libp2pPeer extends Peer {
const node = new Libp2pNode({ peerId, addresses })
await node.start()
for (const ma of this.multiaddrs) {
await node.dial(ma)
await node.dial(ma as any)
await this.bindProtocols(node, ma)
}
this.config.events.emit(Event.PEER_CONNECTED, this)
Expand All @@ -86,15 +87,15 @@ export class Libp2pPeer extends Peer {
*/
async bindProtocols(
node: Libp2pNode,
peer: PeerId | multiaddr,
peer: PeerId | Multiaddr,
server?: Libp2pServer
): Promise<void> {
await Promise.all(
this.protocols.map(async (p) => {
await p.open()
const protocol = `/${p.name}/${p.versions[0]}`
try {
const { stream } = await node.dialProtocol(peer, protocol)
const { stream } = await node.dialProtocol(peer as any, protocol)
await this.bindProtocol(p, new Libp2pSender(stream))
} catch (err: any) {
const peerInfo = peer instanceof PeerId ? `id=${peer.toB58String()}` : `multiaddr=${peer}`
Expand Down
32 changes: 17 additions & 15 deletions packages/client/lib/net/peer/rlpxpeer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,29 +109,31 @@ export class RlpxPeer extends Peer {
address: this.host,
tcpPort: this.port,
})
this.rlpx.on('peer:error', (_: Devp2pRlpxPeer, error: Error) => {

const peerErrorHandler = (_: Devp2pRlpxPeer, error: Error) => {
this.config.events.emit(Event.PEER_ERROR, error, this)
})
this.rlpx.once('peer:added', async (rlpxPeer: Devp2pRlpxPeer) => {
}
const peerErrorHandlerBound = peerErrorHandler.bind(this)
const peerAddedHandler = async (rlpxPeer: Devp2pRlpxPeer) => {
try {
await this.bindProtocols(rlpxPeer)
this.config.events.emit(Event.PEER_CONNECTED, this)
} catch (error: any) {
this.config.events.emit(Event.PEER_ERROR, error, this)
}
})
this.rlpx.once('peer:removed', (rlpxPeer: Devp2pRlpxPeer) => {
try {
if (rlpxPeer !== this.rlpxPeer) {
return
}
this.rlpxPeer = null
this.connected = false
this.config.events.emit(Event.PEER_DISCONNECTED, this)
} catch (error: any) {
this.config.events.emit(Event.PEER_ERROR, error, this)
}
const peerRemovedHandler = (rlpxPeer: Devp2pRlpxPeer) => {
if (rlpxPeer !== this.rlpxPeer) {
return
}
})
this.rlpxPeer = null
this.connected = false
this.config.events.emit(Event.PEER_DISCONNECTED, this)
this.rlpx?.removeListener('peer:error', peerErrorHandlerBound)
}
this.rlpx.on('peer:error', peerErrorHandlerBound)
this.rlpx.once('peer:added', peerAddedHandler.bind(this))
this.rlpx.once('peer:removed', peerRemovedHandler.bind(this))
}

/**
Expand Down
10 changes: 5 additions & 5 deletions packages/client/lib/net/server/libp2pserver.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import PeerId from 'peer-id'
// eslint-disable-next-line implicit-dependencies/no-implicit
import crypto from 'libp2p-crypto'
import multiaddr from 'multiaddr'
import { Multiaddr, multiaddr } from 'multiaddr'
import { Event, Libp2pConnection as Connection } from '../../types'
import { Libp2pNode } from '../peer/libp2pnode'
import { Libp2pPeer } from '../peer'
import { Server, ServerOptions } from './server'

export interface Libp2pServerOptions extends ServerOptions {
/* Multiaddrs to listen on */
multiaddrs?: multiaddr[]
multiaddrs?: Multiaddr[]
}

/**
Expand All @@ -19,7 +19,7 @@ export interface Libp2pServerOptions extends ServerOptions {
export class Libp2pServer extends Server {
private peers: Map<string, Libp2pPeer> = new Map()
private banned: Map<string, number> = new Map()
private multiaddrs: multiaddr[]
private multiaddrs: Multiaddr[]
private node: Libp2pNode | null

/**
Expand Down Expand Up @@ -156,11 +156,11 @@ export class Libp2pServer extends Server {
return PeerId.createFromPrivKey(protoBuf)
}

getPeerInfo(connection: Connection): [PeerId, multiaddr] {
getPeerInfo(connection: Connection): [PeerId, Multiaddr] {
return [connection.remotePeer, connection.remoteAddr]
}

createPeer(peerId: PeerId, multiaddrs?: multiaddr[]) {
createPeer(peerId: PeerId, multiaddrs?: Multiaddr[]) {
const peer = new Libp2pPeer({
config: this.config,
id: peerId.toB58String(),
Expand Down
4 changes: 2 additions & 2 deletions packages/client/lib/net/server/server.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import multiaddr from 'multiaddr'
import { Multiaddr } from 'multiaddr'
import { Config } from '../../config'
import { MultiaddrLike, KeyLike, DnsNetwork } from '../../types'
import { parseKey, parseMultiaddrs } from '../../util/parse'
Expand Down Expand Up @@ -28,7 +28,7 @@ export interface ServerOptions {
export class Server {
public config: Config
public key: Buffer
public bootnodes: multiaddr[] = []
public bootnodes: Multiaddr[] = []
public dnsNetworks: DnsNetwork[]

protected refreshInterval: number
Expand Down
4 changes: 2 additions & 2 deletions packages/client/lib/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { EventEmitter } from 'events'
import type multiaddr from 'multiaddr'
import { BN } from 'ethereumjs-util'
import type { Multiaddr } from 'multiaddr'
import type { Block, BlockHeader } from '@ethereumjs/block'
import type Connection from '../../../node_modules/libp2p-interfaces/dist/src/connection/connection'
import type { MuxedStream } from '../../../node_modules/libp2p-interfaces/dist/src/stream-muxer/types'
Expand Down Expand Up @@ -78,7 +78,7 @@ export type EventBusType = EventBus<Event.CHAIN_UPDATED> &
export type Key = Buffer
export type KeyLike = string | Key

export type MultiaddrLike = string | string[] | multiaddr | multiaddr[]
export type MultiaddrLike = string | string[] | Multiaddr | Multiaddr[]

/**
* DNS
Expand Down
Loading

0 comments on commit 125e210

Please sign in to comment.