Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

client: update multiaddr dep #3384

Merged
merged 11 commits into from
Apr 29, 2024
388 changes: 220 additions & 168 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/client/archive/libp2p/libp2pnode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { NOISE } from '@chainsafe/libp2p-noise'
import Libp2p from 'libp2p'
import Bootstrap from 'libp2p-bootstrap'

import type { Multiaddr } from 'multiaddr'
import type { Multiaddr } from '@multiformats/multiaddr'
import type { PeerId } from '@libp2p/interface-peer-id'

const MPLEX = require('libp2p-mplex')
Expand Down
2 changes: 1 addition & 1 deletion packages/client/archive/libp2p/net/peer/libp2pnode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { NOISE } from '@chainsafe/libp2p-noise'
import LibP2P from 'libp2p'
import Bootstrap from 'libp2p-bootstrap'

import type { Multiaddr } from 'multiaddr'
import type { Multiaddr } from '@multiformats/multiaddr'
import type { PeerId } from '@libp2p/interface-peer-id'

const KadDht = require('libp2p-kad-dht')
Expand Down
6 changes: 3 additions & 3 deletions packages/client/archive/libp2p/net/peer/libp2ppeer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//@ts-nocheck
import { multiaddr } from 'multiaddr'
import { multiaddr } from '@multiformats/multiaddr'

import { Peer } from '../../../src/net/peer/peer'
import { Libp2pSender } from '../libp2psender'
Expand All @@ -11,7 +11,7 @@ import type { PeerOptions } from '../../../src/net/peer/peer'
import type { Protocol } from '../../../src/net/protocol'
import type { Libp2pServer } from '../../../src/net/server'
import type { MuxedStream } from 'libp2p-interfaces/dist/src/stream-muxer/types'
import type { Multiaddr } from 'multiaddr'
import type { Multiaddr } from '@multiformats/multiaddr'
import { PeerId, isPeerId } from '@libp2p/interface-peer-id'

export interface Libp2pPeerOptions extends Omit<PeerOptions, 'address' | 'transport'> {
Expand All @@ -24,7 +24,7 @@ export interface Libp2pPeerOptions extends Omit<PeerOptions, 'address' | 'transp
* @memberof module:net/peer
* @example
* ```typescript
* import { multiaddr } from 'multiaddr'
* import { multiaddr } from '@multiformats/multiaddr'
* import { Libp2pPeer } from './src/net/peer'
* import { Chain } from './src/blockchain'
* import { EthProtocol } from './src/net/protocol'
Expand Down
4 changes: 2 additions & 2 deletions packages/client/archive/libp2p/net/server/libp2pserver.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//@ts-nocheck
// eslint-disable-next-line implicit-dependencies/no-implicit, import/no-extraneous-dependencies
import { keys } from 'libp2p-crypto'
import { multiaddr } from 'multiaddr'
import { multiaddr } from '@multiformats/multiaddr'
import { PeerId } from '@libp2p/interface-peer-id'

import { Event } from '../../../src/types'
Expand All @@ -12,7 +12,7 @@ import { Server } from '../../../src/net/server/server'

import type { ServerOptions } from '../../../src/net/server/server'
import type Connection from 'libp2p-interfaces/dist/src/connection/connection'
import type { Multiaddr } from 'multiaddr'
import type { Multiaddr } from '@multiformats/multiaddr'
import { createFromPrivKey } from '@libp2p/peer-id-factory'

export interface Libp2pServerOptions extends ServerOptions {
Expand Down
2 changes: 1 addition & 1 deletion packages/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
"@ethereumjs/util": "9.0.3",
"@ethereumjs/verkle": "^0.0.2",
"@ethereumjs/vm": "8.0.0",
"@multiformats/multiaddr": "^12.2.1",
"@polkadot/util": "^12.6.2",
"@polkadot/wasm-crypto": "^7.3.2",
"abstract-level": "^1.0.3",
Expand All @@ -85,7 +86,6 @@
"kzg-wasm": "^0.4.0",
"level": "^8.0.0",
"memory-level": "^1.0.0",
"multiaddr": "^10.0.1",
"prom-client": "^15.1.0",
"qheap": "^1.4.0",
"winston": "^3.3.3",
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import type { Logger } from './logging.js'
import type { EventBusType, MultiaddrLike, PrometheusMetrics } from './types.js'
import type { BlockHeader } from '@ethereumjs/block'
import type { VM, VMProfilerOpts } from '@ethereumjs/vm'
import type { Multiaddr } from 'multiaddr'
import type { Multiaddr } from '@multiformats/multiaddr'

export enum DataDirectory {
Chain = 'chain',
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/net/server/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { parseKey, parseMultiaddrs } from '../../util/parse.js'
import type { Config } from '../../config.js'
import type { DnsNetwork, KeyLike, MultiaddrLike } from '../../types.js'
import type { Protocol } from '../protocol/protocol.js'
import type { Multiaddr } from 'multiaddr'
import type { Multiaddr } from '@multiformats/multiaddr'

export interface ServerOptions {
/* Config */
Expand Down
2 changes: 1 addition & 1 deletion packages/client/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { Server } from './net/server/index.js'
import type { Block, BlockHeader } from '@ethereumjs/block'
import type { DefaultStateManager } from '@ethereumjs/statemanager'
import type { Address } from '@ethereumjs/util'
import type { Multiaddr } from 'multiaddr'
import type { Multiaddr } from '@multiformats/multiaddr'
import type * as promClient from 'prom-client'

/**
Expand Down
6 changes: 4 additions & 2 deletions packages/client/src/util/parse.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { hexToBytes } from '@ethereumjs/util'
import { Multiaddr, multiaddr } from 'multiaddr'
import { isMultiaddr, multiaddr } from '@multiformats/multiaddr'
import { URL } from 'url'

import type { MultiaddrLike } from '../types.js'
import type { Multiaddr } from '@multiformats/multiaddr'

// From: https://community.fortra.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4
const ip6RegExp = new RegExp(
Expand Down Expand Up @@ -30,7 +31,8 @@ export function parseMultiaddrs(input: MultiaddrLike): Multiaddr[] {
}
try {
return input.map((s) => {
if (s instanceof Multiaddr) {
isMultiaddr
if (isMultiaddr(s)) {
return s
}
// parse as multiaddr
Expand Down
2 changes: 1 addition & 1 deletion packages/client/test/net/server/rlpxserver.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { equalsBytes, hexToBytes, utf8ToBytes } from '@ethereumjs/util'
import { multiaddr } from '@multiformats/multiaddr'
import { EventEmitter } from 'events'
import { multiaddr } from 'multiaddr'
import { assert, describe, expect, it, vi } from 'vitest'

import { Config } from '../../../src/config.js'
Expand Down
2 changes: 1 addition & 1 deletion packages/client/test/util/parse.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { multiaddr } from 'multiaddr'
import { multiaddr } from '@multiformats/multiaddr'
import { assert, describe, it } from 'vitest'

import { parseMultiaddrs } from '../../src/util/parse.js'
Expand Down
1 change: 0 additions & 1 deletion packages/devp2p/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@
"debug": "^4.3.3",
"ethereum-cryptography": "^2.1.3",
"lru-cache": "10.1.0",
"multiaddr": "^10.0.1",
"scanf": "1.1.2",
"snappyjs": "^0.6.1"
},
Expand Down
50 changes: 10 additions & 40 deletions packages/devp2p/src/dns/enr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,13 @@ import { bytesToUtf8, utf8ToBytes } from '@ethereumjs/util'
import { base32, base64url } from '@scure/base'
import { keccak256 } from 'ethereum-cryptography/keccak.js'
import { ecdsaVerify } from 'ethereum-cryptography/secp256k1-compat.js'
import { protocols } from 'multiaddr'
import Convert from 'multiaddr/src/convert.js'
import { sscanf } from 'scanf'

import { toNewUint8Array } from '../util.js'
import { ipToString } from '../util.js'

import type { PeerInfo } from '../types.js'
import type { Common } from '@ethereumjs/common'

type ProtocolCodes = {
ipCode: number
tcpCode: number
udpCode: number
}

type ENRRootValues = {
eRoot: string
lRoot: string
Expand All @@ -30,6 +22,12 @@ type ENRTreeValues = {
domain: string
}

// Copied over from the multiaddr repo: https://github.com/multiformats/js-multiaddr/blob/main/src/convert.ts
function bytesToPort(bytes: Uint8Array): number {
const view = new DataView(bytes.buffer)
return view.getUint16(bytes.byteOffset)
}

export class ENR {
public static readonly RECORD_PREFIX = 'enr:'
public static readonly TREE_PREFIX = 'enrtree:'
Expand Down Expand Up @@ -81,12 +79,10 @@ export class ENR {

if (!isVerified) throw new Error('Unable to verify ENR signature')

const { ipCode, tcpCode, udpCode } = this._getIpProtocolConversionCodes(obj.id)

const peerInfo: PeerInfo = {
address: Convert.toString(ipCode, obj.ip) as string,
tcpPort: Number(Convert.toString(tcpCode, toNewUint8Array(obj.tcp))),
udpPort: Number(Convert.toString(udpCode, toNewUint8Array(obj.udp))),
address: ipToString(obj.ip),
tcpPort: bytesToPort(obj.tcp),
udpPort: bytesToPort(obj.udp),
}

return peerInfo
Expand Down Expand Up @@ -179,30 +175,4 @@ export class ENR {

return branch.split(this.BRANCH_PREFIX)[1].split(',')
}

/**
* Gets relevant multiaddr conversion codes for ipv4, ipv6 and tcp, udp formats
* @param {Uint8Array} protocolId
* @return {ProtocolCodes}
*/
static _getIpProtocolConversionCodes(protocolId: Uint8Array): ProtocolCodes {
let ipCode

switch (bytesToUtf8(protocolId)) {
case 'v4':
ipCode = protocols(4).code
break
case 'v6':
ipCode = protocols(41).code
break
default:
throw new Error("IP protocol must be 'v4' or 'v6'")
}

return {
ipCode,
tcpCode: protocols('tcp').code,
udpCode: protocols('udp').code,
}
}
}
6 changes: 0 additions & 6 deletions packages/devp2p/src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,12 +113,6 @@ export function unstrictDecode(value: Uint8Array) {
return RLP.decode(value, true).data
}

// multiaddr 8.0.0 expects an Uint8Array with internal buffer starting at 0 offset
export function toNewUint8Array(buf: Uint8Array): Uint8Array {
const arrayBuffer = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)
return new Uint8Array(arrayBuffer)
}

/*************************** ************************************************************/
// Methods borrowed from `node-ip` by Fedor Indutny (https://github.com/indutny/node-ip)
// and modified to use Uint8Arrays instead of Buffers
Expand Down
21 changes: 0 additions & 21 deletions packages/devp2p/test/enr.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { utf8ToBytes } from '@ethereumjs/util'
import { assert, describe, it } from 'vitest'

import { ENR } from '../src/dns/index.js'
Expand Down Expand Up @@ -116,14 +115,6 @@ describe('ENR tests', () => {
assert.equal(udpPort, 30303, 'returns correct udpPort')
})

it('ENR (enr): should return correct multiaddr conversion codes for ipv6', () => {
const expected = { ipCode: 41, tcpCode: 6, udpCode: 273 }
const protocolId = utf8ToBytes('v6')
const codes = ENR._getIpProtocolConversionCodes(protocolId)

assert.deepEqual(codes, expected, 'returns correct codes')
})

it('ENR (enr): should error if record mis-prefixed', () => {
try {
ENR.parseAndVerifyRecord(dns.enrBadPrefix)
Expand All @@ -134,16 +125,4 @@ describe('ENR tests', () => {
)
}
})

it('ENR (enr): should error when converting to unrecognized ip protocol id', () => {
const protocolId = utf8ToBytes('v7')
try {
ENR._getIpProtocolConversionCodes(protocolId)
} catch (e: any) {
assert.ok(
e.toString().includes("IP protocol must be 'v4' or 'v6'"),
'has correct error message'
)
}
})
})