Skip to content

Commit 40f429d

Browse files
committed
Lots o lint fixes
1 parent fbe7119 commit 40f429d

8 files changed

Lines changed: 202 additions & 136 deletions

File tree

packages/portalnetwork/src/networks/beacon/beacon.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,8 @@ export class BeaconNetwork extends BaseNetwork {
364364
hexToBytes(intToHex(BeaconNetworkContentType.LightClientOptimisticUpdate)),
365365
)
366366
this.logger.extend('FINDLOCALLY')(
367-
`light client is not running, retrieving whatever we have - ${value !== undefined ? short(value) : 'nothing found'
367+
`light client is not running, retrieving whatever we have - ${
368+
value !== undefined ? short(value) : 'nothing found'
368369
}`,
369370
)
370371
} else {
@@ -374,8 +375,10 @@ export class BeaconNetwork extends BaseNetwork {
374375
case BeaconNetworkContentType.LightClientFinalityUpdate:
375376
key = LightClientFinalityUpdateKey.deserialize(contentKey.slice(1))
376377
this.logger.extend('FINDLOCALLY')(
377-
`looking for finality update for slot - ${key.finalitySlot
378-
} and local finalized update is for slot - ${this.lightClient?.getFinalized().beacon.slot ?? 'unavailable'
378+
`looking for finality update for slot - ${
379+
key.finalitySlot
380+
} and local finalized update is for slot - ${
381+
this.lightClient?.getFinalized().beacon.slot ?? 'unavailable'
379382
}`,
380383
)
381384
if (
@@ -594,10 +597,10 @@ export class BeaconNetwork extends BaseNetwork {
594597
) {
595598
this.logger(
596599
'Found value for requested content ' +
597-
bytesToHex(decodedContentMessage.contentKey) +
598-
' ' +
599-
bytesToHex(value.slice(0, 10)) +
600-
'...',
600+
bytesToHex(decodedContentMessage.contentKey) +
601+
' ' +
602+
bytesToHex(value.slice(0, 10)) +
603+
'...',
601604
)
602605
const payload = ContentMessageType.serialize({
603606
selector: 1,
@@ -850,11 +853,11 @@ export class BeaconNetwork extends BaseNetwork {
850853
const requestedKeys: Uint8Array[] =
851854
version === 0
852855
? contentKeys.filter(
853-
(n, idx) => (<AcceptMessage<0>>msg).contentKeys.get(idx) === true,
854-
)
856+
(n, idx) => (<AcceptMessage<0>>msg).contentKeys.get(idx) === true,
857+
)
855858
: contentKeys.filter(
856-
(n, idx) => (<AcceptMessage<1>>msg).contentKeys[idx] === AcceptCode.ACCEPT,
857-
)
859+
(n, idx) => (<AcceptMessage<1>>msg).contentKeys[idx] === AcceptCode.ACCEPT,
860+
)
858861
if (requestedKeys.length === 0) {
859862
// Don't start uTP stream if no content ACCEPTed
860863
this.logger.extend('ACCEPT')(`No content ACCEPTed by ${shortId(enr.nodeId)}`)
@@ -916,7 +919,8 @@ export class BeaconNetwork extends BaseNetwork {
916919
*/
917920
override handleOffer = async (src: INodeAddress, requestId: Uint8Array, msg: OfferMessage) => {
918921
this.logger.extend('OFFER')(
919-
`Received from ${shortId(src.nodeId, this.routingTable)} with ${msg.contentKeys.length
922+
`Received from ${shortId(src.nodeId, this.routingTable)} with ${
923+
msg.contentKeys.length
920924
} pieces of content.`,
921925
)
922926
try {

packages/portalnetwork/src/networks/contentLookup.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,15 @@ export class ContentLookup {
5353
if (this.queuedPeers.has(enr.nodeId) || this.network.portal.uTP.hasRequests(enr.nodeId)) {
5454
return
5555
}
56-
56+
5757
const dist = distance(enr.nodeId, this.contentId)
5858
this.lookupPeers.push({ enr, distance: Number(dist) })
5959
this.queuedPeers.add(enr.nodeId)
6060
this.meta.set('0x' + enr.nodeId, {
6161
enr: enr.encodeTxt(),
6262
distance: bigIntToHex(dist),
6363
})
64-
this.logger(
65-
`Adding ${shortId(enr.nodeId)} to lookup queue (${this.lookupPeers.size()})`,
66-
)
64+
this.logger(`Adding ${shortId(enr.nodeId)} to lookup queue (${this.lookupPeers.size()})`)
6765
}
6866

6967
/**
@@ -109,7 +107,7 @@ export class ContentLookup {
109107
const timeoutId = setTimeout(() => {
110108
controller.abort()
111109
}, this.timeout)
112-
110+
113111
return Promise.race([
114112
this.processPeer(peer, controller.signal).finally(() => {
115113
clearTimeout(timeoutId)
@@ -176,7 +174,10 @@ export class ContentLookup {
176174
return this.content
177175
}
178176

179-
private processPeer = async (peer: LookupPeer, signal?: AbortSignal): Promise<ContentLookupResponse | void> => {
177+
private processPeer = async (
178+
peer: LookupPeer,
179+
signal?: AbortSignal,
180+
): Promise<ContentLookupResponse | void> => {
180181
if (this.finished) return
181182
if (this.network.routingTable.isIgnored(peer.enr.nodeId)) {
182183
this.logger(`peer ${shortId(peer.enr.nodeId)} is ignored`)
@@ -196,10 +197,10 @@ export class ContentLookup {
196197
})
197198

198199
// Race between the actual request and the abort signal
199-
const res = await Promise.race([
200+
const res = (await Promise.race([
200201
this.network.sendFindContent!(peer.enr, this.contentKey),
201-
abortPromise
202-
]) as ContentLookupResponse | undefined
202+
abortPromise,
203+
])) as ContentLookupResponse | undefined
203204

204205
this.pending.delete(peer.enr.encodeTxt())
205206
if (this.finished) {

packages/portalnetwork/src/networks/history/history.ts

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ import {
7070
import type { ENR } from '@chainsafe/enr'
7171

7272
import { RunStatusCode } from '@lodestar/light-client'
73-
import type { Debugger } from 'debug'
7473
import type { LightClientHeader } from '@lodestar/types/lib/deneb/types.js'
74+
import type { Debugger } from 'debug'
7575

7676
export class HistoryNetwork extends BaseNetwork {
7777
networkId: NetworkId.HistoryNetwork
@@ -651,7 +651,11 @@ export class HistoryNetwork extends BaseNetwork {
651651

652652
this.emit('ContentAdded', contentKey, value)
653653
if (this.routingTable.values().length > 0) {
654-
if (contentType !== HistoryNetworkContentType.EphemeralHeader && contentType !== HistoryNetworkContentType.EphemeralHeaderOffer && contentType !== HistoryNetworkContentType.EphemeralHeaderFindContent) {
654+
if (
655+
contentType !== HistoryNetworkContentType.EphemeralHeader &&
656+
contentType !== HistoryNetworkContentType.EphemeralHeaderOffer &&
657+
contentType !== HistoryNetworkContentType.EphemeralHeaderFindContent
658+
) {
655659
// Gossip new content to network except for ephemeral headers
656660
this.gossipManager.add(contentKey)
657661
}
@@ -770,49 +774,69 @@ export class HistoryNetwork extends BaseNetwork {
770774
version: Version,
771775
) {
772776
this.logger.extend('ACCEPT')(
773-
`Received from ${shortId(src.nodeId, this.routingTable)} with ${msg.contentKeys.length
777+
`Received from ${shortId(src.nodeId, this.routingTable)} with ${
778+
msg.contentKeys.length
774779
} pieces of content.`,
775780
)
776-
const decodedContentKeys = msg.contentKeys.map(key => decodeHistoryNetworkContentKey(key))
781+
const decodedContentKeys = msg.contentKeys.map((key) => decodeHistoryNetworkContentKey(key))
777782
// Check to see if the first content key is for ephemeral headers. If so, we expect all
778783
// content keys to be for ephemeral headers.
779784
if (decodedContentKeys[0].contentType === HistoryNetworkContentType.EphemeralHeaderOffer) {
780-
this.logger.extend('OFFER').extend('EPHEMERALHEADERS')('Received offer for ephemeral headers starting with block hash: ' + bytesToHex(decodedContentKeys[0].keyOpt as Uint8Array))
785+
this.logger.extend('OFFER').extend('EPHEMERALHEADERS')(
786+
'Received offer for ephemeral headers starting with block hash: ' +
787+
bytesToHex(decodedContentKeys[0].keyOpt as Uint8Array),
788+
)
781789
const contentIds: number[] = Array(msg.contentKeys.length).fill(AcceptCode.GENERIC_DECLINE)
782790
const desiredContentKeys: Uint8Array[] = []
783791
let headHash: Uint8Array | undefined
784792
let headHashIndex = -1
785793
do {
786794
for (const key of decodedContentKeys) {
787795
if (key.contentType !== HistoryNetworkContentType.EphemeralHeaderOffer) {
788-
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')('Received non-ephemeral header in offer for ephemeral headers. Declining offer.')
796+
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')(
797+
'Received non-ephemeral header in offer for ephemeral headers. Declining offer.',
798+
)
789799
// If we get an offer for ephemeral headers, all offered content keys should be for ephemeral headers
790800
// TODO: Ban/descore peers who send spec-noncompliant offers
791801
break
792802
}
793803
}
794804
const beacon = this.portal.networks.get(NetworkId.BeaconChainNetwork) as BeaconNetwork
795-
if (beacon === undefined || (beacon.lightClient?.status !== RunStatusCode.started && beacon.lightClient?.status !== RunStatusCode.syncing)) {
805+
if (
806+
beacon === undefined ||
807+
(beacon.lightClient?.status !== RunStatusCode.started &&
808+
beacon.lightClient?.status !== RunStatusCode.syncing)
809+
) {
796810
// We can't validate ephemeral headers if our light client is not active and/or syncing
797-
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')('Light client is not active and/or syncing. Declining offer.')
811+
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')(
812+
'Light client is not active and/or syncing. Declining offer.',
813+
)
798814
break
799815
}
800816
// TODO: Make this fork safe (and not assume deneb)
801817
headHash = (beacon.lightClient.getHead() as LightClientHeader).execution.blockHash
802-
headHashIndex = decodedContentKeys.findIndex((key) => equalsBytes(key.keyOpt as Uint8Array, headHash!))
818+
headHashIndex = decodedContentKeys.findIndex((key) =>
819+
equalsBytes(key.keyOpt as Uint8Array, headHash!),
820+
)
803821
if (headHashIndex === -1) {
804822
// If our known head hash isn't in the request, we can't validate other ephemeral headers so decline
805-
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')('Known head hash not found in offer. Declining offer.')
823+
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')(
824+
'Known head hash not found in offer. Declining offer.',
825+
)
806826
break
807827
}
808828
for (let i = headHashIndex; i < decodedContentKeys.length; i++) {
809829
const key = decodedContentKeys[i]
810-
if (this.ephemeralHeaderIndex.getByValue(bytesToHex(key.keyOpt as Uint8Array)) === undefined) {
830+
if (
831+
this.ephemeralHeaderIndex.getByValue(bytesToHex(key.keyOpt as Uint8Array)) === undefined
832+
) {
811833
contentIds[i] = AcceptCode.ACCEPT
812834
desiredContentKeys.push(msg.contentKeys[i])
813835
}
814836
}
815-
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')(`Sending accept for ${desiredContentKeys.length} desired headers`)
837+
this.logger.extend('ACCEPT').extend('EPHEMERALHEADERS')(
838+
`Sending accept for ${desiredContentKeys.length} desired headers`,
839+
)
816840
// biome-ignore lint/correctness/noConstantCondition: We only want to do `sendAccept` once
817841
} while (false)
818842

@@ -833,7 +857,7 @@ export class HistoryNetwork extends BaseNetwork {
833857

834858
// if (equalsBytes(desiredContentKeys[desiredContentKeys.length - 1], contentKey)) {
835859
// // Once we've received the last desired header, gossip all offered ephemeral headers starting with the head hash
836-
// // We either already have all of the headers or have received them from this gossip message and the spec calls for
860+
// // We either already have all of the headers or have received them from this gossip message and the spec calls for
837861
// // us to neighborhood gossip all of these
838862
// this.removeListener('ContentAdded', gossipEphemeralHeaders)
839863
// const content = []
@@ -869,7 +893,6 @@ export class HistoryNetwork extends BaseNetwork {
869893
// return
870894
// }
871895
// })
872-
} else
873-
await super.handleOffer(src, requestId, msg, version)
896+
} else await super.handleOffer(src, requestId, msg, version)
874897
}
875898
}

packages/portalnetwork/src/networks/history/util.ts

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -135,34 +135,21 @@ export const decodeHistoryNetworkContentKey = (
135135
contentKey: Uint8Array,
136136
):
137137
| {
138-
contentType:
139-
| HistoryNetworkContentType.BlockHeader
140-
| HistoryNetworkContentType.BlockBody
141-
| HistoryNetworkContentType.Receipt
142-
| HistoryNetworkContentType.EphemeralHeaderOffer
143-
keyOpt: Uint8Array
144-
}
145-
| {
146-
contentType: HistoryNetworkContentType.BlockHeaderByNumber
147-
keyOpt: bigint
148-
}
149-
| {
150-
contentType: HistoryNetworkContentType.EphemeralHeaderFindContent
151-
keyOpt: EphemeralHeaderKeyValues
152-
}
153-
| {
154-
contentType: HistoryNetworkContentType.BlockHeaderByNumber
155-
keyOpt: bigint
156-
}
157-
| {
158-
contentType: HistoryNetworkContentType.EphemeralHeaderFindContent
159-
keyOpt:
160-
| EphemeralHeaderKeyValues
161-
| {
162-
contentType: HistoryNetworkContentType.EphemeralHeaderOffer
138+
contentType:
139+
| HistoryNetworkContentType.BlockHeader
140+
| HistoryNetworkContentType.BlockBody
141+
| HistoryNetworkContentType.Receipt
142+
| HistoryNetworkContentType.EphemeralHeaderOffer
163143
keyOpt: Uint8Array
164144
}
165-
} => {
145+
| {
146+
contentType: HistoryNetworkContentType.BlockHeaderByNumber
147+
keyOpt: bigint
148+
}
149+
| {
150+
contentType: HistoryNetworkContentType.EphemeralHeaderFindContent
151+
keyOpt: EphemeralHeaderKeyValues
152+
} => {
166153
const contentType: HistoryNetworkContentType = contentKey[0]
167154
switch (contentType) {
168155
case HistoryNetworkContentType.BlockHeaderByNumber: {

packages/portalnetwork/test/integration/ephemeralHeaders.spec.ts

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import type { BlockHeader, JSONRPCBlock } from '@ethereumjs/block'
33
import { createBlockFromRPC } from '@ethereumjs/block'
44
import { bytesToHex, concatBytes, hexToBytes, randomBytes } from '@ethereumjs/util'
55
import { keys } from '@libp2p/crypto'
6+
import { createBeaconConfig, createChainForkConfig } from '@lodestar/config'
7+
import { genesisData, mainnetChainConfig } from '@lodestar/config/networks'
8+
import { ForkName } from '@lodestar/params'
9+
import { ssz } from '@lodestar/types'
610
import { multiaddr } from '@multiformats/multiaddr'
711
import { assert, beforeAll, describe, it, vi } from 'vitest'
812
import {
@@ -19,10 +23,6 @@ import {
1923
getEphemeralHeaderDbKey,
2024
} from '../../src/index.js'
2125
import latestBlocks from '../networks/history/testData/latest3Blocks.json'
22-
import { ssz } from '@lodestar/types'
23-
import { createBeaconConfig, createChainForkConfig } from '@lodestar/config'
24-
import { genesisData, mainnetChainConfig } from '@lodestar/config/networks'
25-
import { ForkName } from '@lodestar/params'
2626

2727
describe('should be able to retrieve ephemeral headers from a peer', () => {
2828
let headers: BlockHeader[]
@@ -167,14 +167,24 @@ describe('should offer headers to peers', () => {
167167
setHardfork: true,
168168
}).header,
169169
)
170-
headers.reverse() // Ephemeral headers are offered in reverse order
171-
const offerPayload = headers.map((h) => getContentKey(HistoryNetworkContentType.EphemeralHeaderOffer, h.hash()))
170+
headers.reverse() // Ephemeral headers are offered in reverse order
171+
const offerPayload = headers.map((h) =>
172+
getContentKey(HistoryNetworkContentType.EphemeralHeaderOffer, h.hash()),
173+
)
172174

173175
const bootstrapJson = await import('./testdata/postDenebData/bootstrap.json')
174176
const bootstrap = ssz.deneb.LightClientBootstrap.fromJson(bootstrapJson.data)
175177
const bootstrapRoot = ssz.phase0.BeaconBlockHeader.hashTreeRoot(bootstrap.header.beacon)
176-
const bootstrapKey = getBeaconContentKey(BeaconNetworkContentType.LightClientBootstrap, LightClientBootstrapKey.serialize({ blockHash: ssz.phase0.BeaconBlockHeader.hashTreeRoot(bootstrap.header.beacon) }))
177-
const chainConfig = createBeaconConfig(mainnetChainConfig, hexToBytes(genesisData.mainnet.genesisValidatorsRoot as `0x${string}`))
178+
const bootstrapKey = getBeaconContentKey(
179+
BeaconNetworkContentType.LightClientBootstrap,
180+
LightClientBootstrapKey.serialize({
181+
blockHash: ssz.phase0.BeaconBlockHeader.hashTreeRoot(bootstrap.header.beacon),
182+
}),
183+
)
184+
const chainConfig = createBeaconConfig(
185+
mainnetChainConfig,
186+
hexToBytes(genesisData.mainnet.genesisValidatorsRoot as `0x${string}`),
187+
)
178188
const forkDigest = chainConfig.forkName2ForkDigest(ForkName.deneb)
179189
const privateKeys = [
180190
'0x0a2700250802122102273097673a2948af93317235d2f02ad9cf3b79a34eeb37720c5f19e09f11783c12250802122102273097673a2948af93317235d2f02ad9cf3b79a34eeb37720c5f19e09f11783c1a2408021220aae0fff4ac28fdcdf14ee8ecb591c7f1bc78651206d86afe16479a63d9cb73bd',
@@ -224,13 +234,34 @@ describe('should offer headers to peers', () => {
224234
const history1 = node1.network()['0x500b']
225235
const history2 = node2.network()['0x500b']
226236
await history2?.sendPing(node1.discv5.enr.toENR())
227-
await node1.network()['0x500c']!.store(bootstrapKey, concatBytes(forkDigest, ssz.deneb.LightClientBootstrap.serialize(bootstrap)))
228-
await node2.network()['0x500c']!.store(bootstrapKey, concatBytes(forkDigest, ssz.deneb.LightClientBootstrap.serialize(bootstrap)))
229-
await history1?.store(offerPayload[0], EphemeralHeaderOfferPayload.serialize({ header: headers[0].serialize() }))
230-
await history1?.store(offerPayload[1], EphemeralHeaderOfferPayload.serialize({ header: headers[1].serialize() }))
231-
await history1?.store(offerPayload[2], EphemeralHeaderOfferPayload.serialize({ header: headers[2].serialize() }))
232-
await (node2.network()['0x500c'] as BeaconNetwork).initializeLightClient(bytesToHex(bootstrapRoot))
233-
await new Promise(resolve => {
237+
await node1
238+
.network()
239+
['0x500c']!.store(
240+
bootstrapKey,
241+
concatBytes(forkDigest, ssz.deneb.LightClientBootstrap.serialize(bootstrap)),
242+
)
243+
await node2
244+
.network()
245+
['0x500c']!.store(
246+
bootstrapKey,
247+
concatBytes(forkDigest, ssz.deneb.LightClientBootstrap.serialize(bootstrap)),
248+
)
249+
await history1?.store(
250+
offerPayload[0],
251+
EphemeralHeaderOfferPayload.serialize({ header: headers[0].serialize() }),
252+
)
253+
await history1?.store(
254+
offerPayload[1],
255+
EphemeralHeaderOfferPayload.serialize({ header: headers[1].serialize() }),
256+
)
257+
await history1?.store(
258+
offerPayload[2],
259+
EphemeralHeaderOfferPayload.serialize({ header: headers[2].serialize() }),
260+
)
261+
await (node2.network()['0x500c'] as BeaconNetwork).initializeLightClient(
262+
bytesToHex(bootstrapRoot),
263+
)
264+
await new Promise((resolve) => {
234265
let count = 0
235266
history2?.on('ContentAdded', async (key, value) => {
236267
count++
@@ -241,7 +272,11 @@ describe('should offer headers to peers', () => {
241272
}
242273
})
243274

244-
void history1!.sendOffer(node2.discv5.enr.toENR(), offerPayload, headers.map(h => EphemeralHeaderOfferPayload.serialize({ header: h.serialize() })))
275+
void history1!.sendOffer(
276+
node2.discv5.enr.toENR(),
277+
offerPayload,
278+
headers.map((h) => EphemeralHeaderOfferPayload.serialize({ header: h.serialize() })),
279+
)
245280
})
246281
}, 10000)
247-
})
282+
})

0 commit comments

Comments
 (0)