Skip to content

Commit c6a8739

Browse files
authored
fix: leading zeros stripped from request id (#312)
1 parent 585eece commit c6a8739

File tree

8 files changed

+61
-53
lines changed

8 files changed

+61
-53
lines changed

packages/discv5/src/message/create.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { randomBytes, toBytes } from "@noble/hashes/utils";
2-
import { bytesToBigint, SequenceNumber, ENR } from "@chainsafe/enr";
2+
import { SequenceNumber, ENR } from "@chainsafe/enr";
33

44
import {
55
RequestId,
@@ -12,7 +12,7 @@ import {
1212
} from "./types.js";
1313

1414
export function createRequestId(): RequestId {
15-
return bytesToBigint(randomBytes(8));
15+
return randomBytes(8);
1616
}
1717

1818
export function createPingMessage(enrSeq: SequenceNumber): IPingMessage {

packages/discv5/src/message/decode.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function decodePing(data: Uint8Array): IPingMessage {
5353
}
5454
return {
5555
type: MessageType.PING,
56-
id: bytesToBigint(rlpRaw[0]),
56+
id: rlpRaw[0],
5757
enrSeq: bytesToBigint(rlpRaw[1]),
5858
};
5959
}
@@ -78,7 +78,7 @@ function decodePong(data: Uint8Array): IPongMessage {
7878

7979
return {
8080
type: MessageType.PONG,
81-
id: bytesToBigint(rlpRaw[0]),
81+
id: rlpRaw[0],
8282
enrSeq: bytesToBigint(rlpRaw[1]),
8383
addr: { ip, port },
8484
};
@@ -95,7 +95,7 @@ function decodeFindNode(data: Uint8Array): IFindNodeMessage {
9595
const distances = (rlpRaw[1] as Uint8Array[]).map((x) => (x.length ? Number(bytesToBigint(x)) : 0));
9696
return {
9797
type: MessageType.FINDNODE,
98-
id: bytesToBigint(rlpRaw[0]),
98+
id: rlpRaw[0],
9999
distances,
100100
};
101101
}
@@ -107,7 +107,7 @@ function decodeNodes(data: Uint8Array): INodesMessage {
107107
}
108108
return {
109109
type: MessageType.NODES,
110-
id: bytesToBigint(rlpRaw[0] as Uint8Array),
110+
id: rlpRaw[0] as Uint8Array,
111111
total: rlpRaw[1].length ? Number(bytesToBigint(rlpRaw[1] as Uint8Array)) : 0,
112112
enrs: rlpRaw[2].map((enrRaw) => ENR.decodeFromValues(enrRaw as Uint8Array[])),
113113
};
@@ -120,7 +120,7 @@ function decodeTalkReq(data: Uint8Array): ITalkReqMessage {
120120
}
121121
return {
122122
type: MessageType.TALKREQ,
123-
id: bytesToBigint(rlpRaw[0]),
123+
id: rlpRaw[0],
124124
protocol: rlpRaw[1],
125125
request: rlpRaw[2],
126126
};
@@ -133,7 +133,7 @@ function decodeTalkResp(data: Uint8Array): ITalkRespMessage {
133133
}
134134
return {
135135
type: MessageType.TALKRESP,
136-
id: bytesToBigint(rlpRaw[0]),
136+
id: rlpRaw[0],
137137
response: rlpRaw[1],
138138
};
139139
}
@@ -145,7 +145,7 @@ function decodeRegTopic(data: Uint8Array): IRegTopicMessage {
145145
}
146146
return {
147147
type: MessageType.REGTOPIC,
148-
id: bytesToBigint(rlpRaw[0]),
148+
id: rlpRaw[0],
149149
topic: rlpRaw[1],
150150
enr: ENR.decodeFromValues(rlpRaw[2] as Uint8Array[]),
151151
ticket: rlpRaw[3],
@@ -159,7 +159,7 @@ function decodeTicket(data: Uint8Array): ITicketMessage {
159159
}
160160
return {
161161
type: MessageType.TICKET,
162-
id: bytesToBigint(rlpRaw[0]),
162+
id: rlpRaw[0],
163163
ticket: rlpRaw[1],
164164
waitTime: rlpRaw[2].length ? Number(bytesToBigint(rlpRaw[2] as Uint8Array)) : 0,
165165
};
@@ -172,7 +172,7 @@ function decodeRegConfirmation(data: Uint8Array): IRegConfirmationMessage {
172172
}
173173
return {
174174
type: MessageType.REGCONFIRMATION,
175-
id: bytesToBigint(rlpRaw[0]),
175+
id: rlpRaw[0],
176176
topic: rlpRaw[1],
177177
};
178178
}
@@ -184,7 +184,7 @@ function decodeTopicQuery(data: Uint8Array): ITopicQueryMessage {
184184
}
185185
return {
186186
type: MessageType.TOPICQUERY,
187-
id: bytesToBigint(rlpRaw[0]),
187+
id: rlpRaw[0],
188188
topic: rlpRaw[1],
189189
};
190190
}

packages/discv5/src/message/encode.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export function encode(message: Message): Uint8Array {
4343
}
4444

4545
export function encodePingMessage(m: IPingMessage): Uint8Array {
46-
return concatBytes(Uint8Array.from([MessageType.PING]), RLP.encode([bigintToBytes(m.id), bigintToBytes(m.enrSeq)]));
46+
return concatBytes(Uint8Array.from([MessageType.PING]), RLP.encode([m.id, bigintToBytes(m.enrSeq)]));
4747
}
4848

4949
export function encodePongMessage(m: IPongMessage): Uint8Array {
@@ -52,44 +52,44 @@ export function encodePongMessage(m: IPongMessage): Uint8Array {
5252
}
5353
return concatBytes(
5454
Uint8Array.from([MessageType.PONG]),
55-
RLP.encode([bigintToBytes(m.id), bigintToBytes(m.enrSeq), ipToBytes(m.addr.ip), m.addr.port])
55+
RLP.encode([m.id, bigintToBytes(m.enrSeq), ipToBytes(m.addr.ip), m.addr.port])
5656
);
5757
}
5858

5959
export function encodeFindNodeMessage(m: IFindNodeMessage): Uint8Array {
60-
return concatBytes(Uint8Array.from([MessageType.FINDNODE]), RLP.encode([bigintToBytes(m.id), m.distances]));
60+
return concatBytes(Uint8Array.from([MessageType.FINDNODE]), RLP.encode([m.id, m.distances]));
6161
}
6262

6363
export function encodeNodesMessage(m: INodesMessage): Uint8Array {
6464
return concatBytes(
6565
Uint8Array.from([MessageType.NODES]),
66-
RLP.encode([bigintToBytes(m.id), m.total, m.enrs.map((enr) => enr.encodeToValues())])
66+
RLP.encode([m.id, m.total, m.enrs.map((enr) => enr.encodeToValues())])
6767
);
6868
}
6969

7070
export function encodeTalkReqMessage(m: ITalkReqMessage): Uint8Array {
71-
return concatBytes(Uint8Array.from([MessageType.TALKREQ]), RLP.encode([bigintToBytes(m.id), m.protocol, m.request]));
71+
return concatBytes(Uint8Array.from([MessageType.TALKREQ]), RLP.encode([m.id, m.protocol, m.request]));
7272
}
7373

7474
export function encodeTalkRespMessage(m: ITalkRespMessage): Uint8Array {
75-
return concatBytes(Uint8Array.from([MessageType.TALKRESP]), RLP.encode([bigintToBytes(m.id), m.response]));
75+
return concatBytes(Uint8Array.from([MessageType.TALKRESP]), RLP.encode([m.id, m.response]));
7676
}
7777

7878
export function encodeRegTopicMessage(m: IRegTopicMessage): Uint8Array {
7979
return concatBytes(
8080
Uint8Array.from([MessageType.REGTOPIC]),
81-
RLP.encode([bigintToBytes(m.id), m.topic, m.enr.encodeToValues(), m.ticket])
81+
RLP.encode([m.id, m.topic, m.enr.encodeToValues(), m.ticket])
8282
);
8383
}
8484

8585
export function encodeTicketMessage(m: ITicketMessage): Uint8Array {
86-
return concatBytes(Uint8Array.from([MessageType.TICKET]), RLP.encode([bigintToBytes(m.id), m.ticket, m.waitTime]));
86+
return concatBytes(Uint8Array.from([MessageType.TICKET]), RLP.encode([m.id, m.ticket, m.waitTime]));
8787
}
8888

8989
export function encodeRegConfirmMessage(m: IRegConfirmationMessage): Uint8Array {
90-
return concatBytes(Uint8Array.from([MessageType.REGCONFIRMATION]), RLP.encode([bigintToBytes(m.id), m.topic]));
90+
return concatBytes(Uint8Array.from([MessageType.REGCONFIRMATION]), RLP.encode([m.id, m.topic]));
9191
}
9292

9393
export function encodeTopicQueryMessage(m: ITopicQueryMessage): Uint8Array {
94-
return concatBytes(Uint8Array.from([MessageType.TOPICQUERY]), RLP.encode([bigintToBytes(m.id), m.topic]));
94+
return concatBytes(Uint8Array.from([MessageType.TOPICQUERY]), RLP.encode([m.id, m.topic]));
9595
}

packages/discv5/src/message/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { SequenceNumber, ENR } from "@chainsafe/enr";
22
import { SocketAddress } from "../util/ip.js";
33

4-
export type RequestId = bigint;
4+
export type RequestId = Uint8Array;
55

66
export type NodeAddressIP = {
77
family: 4 | 6;

packages/discv5/src/service/service.ts

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@ import debug from "debug";
33
import { randomBytes } from "@noble/hashes/utils";
44
import { Multiaddr } from "@multiformats/multiaddr";
55
import { PeerId, PrivateKey } from "@libp2p/interface";
6-
import { createPeerIdFromPublicKey, ENR, NodeId, MAX_RECORD_SIZE, createNodeId, SignableENR } from "@chainsafe/enr";
6+
import {
7+
createPeerIdFromPublicKey,
8+
ENR,
9+
NodeId,
10+
MAX_RECORD_SIZE,
11+
createNodeId,
12+
SignableENR,
13+
bytesToBigint,
14+
} from "@chainsafe/enr";
715

816
import { BindAddrs, IPMode, ITransportService, UDPTransportService } from "../transport/index.js";
917
import { MAX_PACKET_SIZE } from "../packet/index.js";
@@ -496,7 +504,7 @@ export class Discv5 extends (EventEmitter as { new (): Discv5EventEmitter }) {
496504
*/
497505
private sendRpcRequest<T extends RequestMessage, U extends ResponseType>(activeRequest: IActiveRequest<T, U>): void {
498506
this.activeRequests.set(
499-
activeRequest.request.id,
507+
bytesToBigint(activeRequest.request.id),
500508
activeRequest as unknown as IActiveRequest<RequestMessage, ResponseType>
501509
);
502510

@@ -506,7 +514,7 @@ export class Discv5 extends (EventEmitter as { new (): Discv5EventEmitter }) {
506514
this.sessionService.sendRequest(activeRequest.contact, activeRequest.request);
507515
this.metrics?.sentMessageCount.inc({ type: MessageType[activeRequest.request.type] });
508516
} catch (e) {
509-
this.activeRequests.delete(activeRequest.request.id);
517+
this.activeRequests.delete(bytesToBigint(activeRequest.request.id));
510518
log("Error sending RPC to node: %o, :Error: %s", nodeAddr, (e as Error).message);
511519
}
512520
}
@@ -843,12 +851,12 @@ export class Discv5 extends (EventEmitter as { new (): Discv5EventEmitter }) {
843851

844852
// verify we know of the rpc id
845853

846-
const activeRequest = this.activeRequests.get(response.id);
854+
const activeRequest = this.activeRequests.get(bytesToBigint(response.id));
847855
if (!activeRequest) {
848856
log("Received an RPC response which doesn't match a request. Id: &s", response.id);
849857
return;
850858
}
851-
this.activeRequests.delete(response.id);
859+
this.activeRequests.delete(bytesToBigint(response.id));
852860

853861
// Check that the responder matches the expected request
854862
const requestNodeAddr = getNodeAddress(activeRequest.contact);
@@ -962,15 +970,15 @@ export class Discv5 extends (EventEmitter as { new (): Discv5EventEmitter }) {
962970

963971
// handle the case that there is more than one response
964972
if (message.total > 1) {
965-
const currentResponse = this.activeNodesResponses.get(message.id) || { count: 1, enrs: [] };
966-
this.activeNodesResponses.delete(message.id);
973+
const currentResponse = this.activeNodesResponses.get(bytesToBigint(message.id)) || { count: 1, enrs: [] };
974+
this.activeNodesResponses.delete(bytesToBigint(message.id));
967975
log("NODES response: %d of %d received, length: %d", currentResponse.count, message.total, message.enrs.length);
968976
// If there are more requests coming, store the nodes and wait for another response
969977
if (currentResponse.count < 5 && currentResponse.count < message.total) {
970978
currentResponse.count += 1;
971979
currentResponse.enrs.push(...message.enrs);
972-
this.activeRequests.set(message.id, activeRequest as IActiveRequest<RequestMessage>);
973-
this.activeNodesResponses.set(message.id, currentResponse);
980+
this.activeRequests.set(bytesToBigint(message.id), activeRequest as IActiveRequest<RequestMessage>);
981+
this.activeNodesResponses.set(bytesToBigint(message.id), currentResponse);
974982
return false;
975983
}
976984

@@ -984,7 +992,7 @@ export class Discv5 extends (EventEmitter as { new (): Discv5EventEmitter }) {
984992
nodeAddr
985993
);
986994

987-
this.activeNodesResponses.delete(message.id);
995+
this.activeNodesResponses.delete(bytesToBigint(message.id));
988996

989997
this.discovered(nodeAddr.nodeId, message.enrs, lookupId);
990998

@@ -1003,22 +1011,22 @@ export class Discv5 extends (EventEmitter as { new (): Discv5EventEmitter }) {
10031011
/**
10041012
* A session could not be established or an RPC request timed out
10051013
*/
1006-
private rpcFailure = (rpcId: bigint, error: RequestErrorType): void => {
1014+
private rpcFailure = (rpcId: RequestId, error: RequestErrorType): void => {
10071015
log("RPC error, removing request. Reason: %s, id %s", RequestErrorType[error], rpcId);
1008-
const req = this.activeRequests.get(rpcId);
1016+
const req = this.activeRequests.get(bytesToBigint(rpcId));
10091017
if (!req) {
10101018
return;
10111019
}
10121020
const { request, contact, lookupId, callbackPromise } = req;
1013-
this.activeRequests.delete(request.id);
1021+
this.activeRequests.delete(bytesToBigint(request.id));
10141022

10151023
const nodeId = getNodeId(contact);
10161024
// If a failed FindNodes Request, ensure we haven't partially received responses.
10171025
// If so, process the partially found nodes
10181026
if (request.type === MessageType.FINDNODE) {
1019-
const nodesResponse = this.activeNodesResponses.get(request.id);
1027+
const nodesResponse = this.activeNodesResponses.get(bytesToBigint(request.id));
10201028
if (nodesResponse) {
1021-
this.activeNodesResponses.delete(request.id);
1029+
this.activeNodesResponses.delete(bytesToBigint(request.id));
10221030

10231031
if (nodesResponse.enrs.length) {
10241032
log("NODES response failed, but was partially processed from Node: %s", nodeId);

packages/discv5/src/session/service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ export class SessionService extends (EventEmitter as { new (): StrictEventEmitte
643643
// Check if this response matches these
644644
const requestId = session.awaitingEnr;
645645
if (requestId !== undefined) {
646-
if (requestId === message.id) {
646+
if (equalsBytes(requestId, message.id)) {
647647
delete session.awaitingEnr;
648648
if (message.type === MessageType.NODES) {
649649
// Received the requested ENR
@@ -696,7 +696,7 @@ export class SessionService extends (EventEmitter as { new (): StrictEventEmitte
696696
return;
697697
}
698698

699-
if (requestCall.request.id !== response.id) {
699+
if (!equalsBytes(requestCall.request.id, response.id)) {
700700
log("Received an RPC Response to an unknown request. Likely late response. %o", nodeAddr);
701701
return;
702702
}

packages/discv5/src/session/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Multiaddr } from "@multiformats/multiaddr";
22
import { NodeId, ENR } from "@chainsafe/enr";
33

44
import { IPacket } from "../packet/index.js";
5-
import { RequestMessage, ResponseMessage } from "../message/index.js";
5+
import { RequestId, RequestMessage, ResponseMessage } from "../message/index.js";
66
import { INodeAddress, NodeContact } from "./nodeInfo.js";
77

88
export type NodeAddressString = string;
@@ -152,5 +152,5 @@ export interface ISessionEvents {
152152
/**
153153
* An RPC request failed.
154154
*/
155-
requestFailed: (requestId: bigint, error: RequestErrorType) => void;
155+
requestFailed: (requestId: RequestId, error: RequestErrorType) => void;
156156
}

0 commit comments

Comments
 (0)