Skip to content

Commit 2b9a412

Browse files
refactor(core-p2p): expose NetworkState getters (#4345)
1 parent 3b2f5eb commit 2b9a412

File tree

5 files changed

+90
-33
lines changed

5 files changed

+90
-33
lines changed

__tests__/unit/core-forger/forger-service.test.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import "jest-extended";
22

3-
import { ForgeNewBlockAction, IsForgingAllowedAction } from "@arkecosystem/core-forger/src/actions";
4-
import { Contracts } from "@arkecosystem/core-kernel";
5-
import { Sandbox } from "@arkecosystem/core-test-framework";
6-
import { Interfaces } from "@arkecosystem/crypto";
3+
import { ForgeNewBlockAction, IsForgingAllowedAction } from "@packages/core-forger/src/actions";
4+
import { Contracts } from "@packages/core-kernel";
5+
import { Sandbox } from "@packages/core-test-framework";
6+
import { Interfaces } from "@packages/crypto";
7+
import { Slots } from "@packages/crypto/dist/crypto";
78
import { HostNoResponseError, RelayCommunicationError } from "@packages/core-forger/src/errors";
89
import { ForgerService } from "@packages/core-forger/src/forger-service";
910
import { Container, Enums, Services, Utils } from "@packages/core-kernel";
@@ -14,7 +15,6 @@ import { Address } from "@packages/crypto/src/identities";
1415
import { BuilderFactory } from "@packages/crypto/src/transactions";
1516

1617
import { calculateActiveDelegates } from "./__utils__/calculate-active-delegates";
17-
import { Slots } from "@arkecosystem/crypto/dist/crypto";
1818

1919
let sandbox: Sandbox;
2020
const logger = {
@@ -101,11 +101,11 @@ describe("ForgerService", () => {
101101

102102
mockNetworkState = {
103103
status: NetworkStateStatus.Default,
104+
getNodeHeight: () => 10,
105+
getLastBlockId: () => "11111111",
104106
getOverHeightBlockHeaders: () => [],
105107
getQuorum: () => 0.7,
106108
toJson: () => "test json",
107-
nodeHeight: 10,
108-
lastBlockId: "11111111",
109109
};
110110

111111
const recipientAddress = Address.fromPassphrase("recipient's secret");
@@ -630,7 +630,9 @@ describe("ForgerService", () => {
630630
mockNetworkState,
631631
);
632632

633-
const loggerWarningMessage = `The NetworkState height (${mockNetworkState.nodeHeight}) and round height (${round.data.lastBlock.height}) are out of sync. This indicates delayed blocks on the network.`;
633+
const loggerWarningMessage = `The NetworkState height (${mockNetworkState.getNodeHeight()}) and round height (${
634+
round.data.lastBlock.height
635+
}) are out of sync. This indicates delayed blocks on the network.`;
634636
expect(logger.warning).toHaveBeenCalledWith(loggerWarningMessage);
635637

636638
jest.useRealTimers();

__tests__/unit/core-p2p/network-state.test.ts

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { Container, Utils as KernelUtils } from "@arkecosystem/core-kernel";
2-
import { NetworkStateStatus } from "@arkecosystem/core-p2p/src/enums";
3-
import { NetworkState } from "@arkecosystem/core-p2p/src/network-state";
4-
import { Peer } from "@arkecosystem/core-p2p/src/peer";
5-
import { PeerVerificationResult } from "@arkecosystem/core-p2p/src/peer-verifier";
6-
import { Blocks, Crypto, Utils } from "@arkecosystem/crypto";
1+
import { Container, Utils as KernelUtils } from "@packages/core-kernel";
2+
import { NetworkStateStatus } from "@packages/core-p2p/src/enums";
3+
import { NetworkState } from "@packages/core-p2p/src/network-state";
4+
import { Peer } from "@packages/core-p2p/src/peer";
5+
import { PeerVerificationResult } from "@packages/core-p2p/src/peer-verifier";
6+
import { Blocks, Crypto, Utils } from "@packages/crypto";
77

88
describe("NetworkState", () => {
9+
// @ts-ignore
910
const lastBlock = {
1011
data: {
1112
id: "17882607875259085966",
@@ -152,6 +153,54 @@ describe("NetworkState", () => {
152153
});
153154
});
154155

156+
describe("getNodeHeight", () => {
157+
it("should return node height", () => {
158+
const data = {
159+
status: NetworkStateStatus.Test,
160+
nodeHeight: 31,
161+
lastBlockId: "10024d739768a68b43a6e4124718129e1fe07b0461630b3f275b7640d298c3b7",
162+
quorumDetails: {
163+
peersQuorum: 31,
164+
peersNoQuorum: 7,
165+
peersOverHeight: 0,
166+
peersOverHeightBlockHeaders: {},
167+
peersForked: 0,
168+
peersDifferentSlot: 0,
169+
peersForgingNotAllowed: 1,
170+
},
171+
};
172+
173+
const networkState = NetworkState.parse(data);
174+
175+
expect(networkState.getNodeHeight()).toBe(31);
176+
});
177+
});
178+
179+
describe("getLastBlockId", () => {
180+
it("should return lats block id", () => {
181+
const data = {
182+
status: NetworkStateStatus.Test,
183+
nodeHeight: 31,
184+
lastBlockId: "10024d739768a68b43a6e4124718129e1fe07b0461630b3f275b7640d298c3b7",
185+
quorumDetails: {
186+
peersQuorum: 31,
187+
peersNoQuorum: 7,
188+
peersOverHeight: 0,
189+
peersOverHeightBlockHeaders: {},
190+
peersForked: 0,
191+
peersDifferentSlot: 0,
192+
peersForgingNotAllowed: 1,
193+
},
194+
};
195+
196+
const networkState = NetworkState.parse(data);
197+
198+
expect(networkState.getLastBlockId()).toBe(
199+
"10024d739768a68b43a6e4124718129e1fe07b0461630b3f275b7640d298c3b7",
200+
);
201+
});
202+
});
203+
155204
describe("getQuorum", () => {
156205
it("should return 1 when NetworkStateStatus.Test", () => {
157206
const data = {

packages/core-forger/src/forger-service.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,9 @@ export class ForgerService {
175175

176176
const networkState: Contracts.P2P.NetworkState = await this.client.getNetworkState();
177177

178-
if (networkState.nodeHeight !== this.round.lastBlock.height) {
178+
if (networkState.getNodeHeight() !== this.round.lastBlock.height) {
179179
this.logger.warning(
180-
`The NetworkState height (${networkState.nodeHeight!.toLocaleString()}) and round height (${this.round.lastBlock.height.toLocaleString()}) are out of sync. This indicates delayed blocks on the network.`,
180+
`The NetworkState height (${networkState.getNodeHeight()?.toLocaleString()}) and round height (${this.round.lastBlock.height.toLocaleString()}) are out of sync. This indicates delayed blocks on the network.`,
181181
);
182182
}
183183

@@ -234,19 +234,18 @@ export class ForgerService {
234234
round: Contracts.P2P.CurrentRound,
235235
networkState: Contracts.P2P.NetworkState,
236236
): Promise<void> {
237-
AppUtils.assert.defined<number>(networkState.nodeHeight);
238-
239-
Managers.configManager.setHeight(networkState.nodeHeight);
237+
AppUtils.assert.defined<number>(networkState.getNodeHeight());
238+
Managers.configManager.setHeight(networkState.getNodeHeight()!);
240239

241240
const transactions: Interfaces.ITransactionData[] = await this.getTransactionsForForging();
242241

243242
const block: Interfaces.IBlock | undefined = delegate.forge(transactions, {
244243
previousBlock: {
245-
id: networkState.lastBlockId,
244+
id: networkState.getLastBlockId(),
246245
idHex: Managers.configManager.getMilestone().block.idFullSha256
247-
? networkState.lastBlockId
248-
: Blocks.Block.toBytesHex(networkState.lastBlockId),
249-
height: networkState.nodeHeight,
246+
? networkState.getLastBlockId()
247+
: Blocks.Block.toBytesHex(networkState.getLastBlockId()),
248+
height: networkState.getNodeHeight(),
250249
},
251250
timestamp: round.timestamp,
252251
reward: round.reward,

packages/core-kernel/src/contracts/p2p/network-state.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
export interface NetworkState {
22
readonly status: any;
33

4-
nodeHeight: number | undefined;
5-
lastBlockId: string | undefined;
6-
74
// static analyze(monitor: NetworkMonitor, repository: PeerRepository): NetworkState;
85
// static parse(data: any): NetworkState;
96

10-
setLastBlock(lastBlock);
7+
getNodeHeight(): number | undefined;
8+
getLastBlockId(): string | undefined;
9+
1110
getQuorum();
1211
getOverHeightBlockHeaders();
1312
toJson();

packages/core-p2p/src/network-state.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class QuorumDetails {
5656

5757
// todo: review the implementation
5858
export class NetworkState implements Contracts.P2P.NetworkState {
59-
public nodeHeight: number | undefined;
60-
public lastBlockId: string | undefined;
59+
private nodeHeight?: number;
60+
private lastBlockId?: string;
6161
private quorumDetails: QuorumDetails;
6262

6363
public constructor(public readonly status: NetworkStateStatus, lastBlock?: Interfaces.IBlock) {
@@ -101,7 +101,7 @@ export class NetworkState implements Contracts.P2P.NetworkState {
101101
return new NetworkState(NetworkStateStatus.BelowMinimumPeers, lastBlock);
102102
}
103103

104-
return await this.analyzeNetwork(lastBlock, peers, blockTimeLookup);
104+
return this.analyzeNetwork(lastBlock, peers, blockTimeLookup);
105105
}
106106

107107
public static parse(data: any): Contracts.P2P.NetworkState {
@@ -132,9 +132,12 @@ export class NetworkState implements Contracts.P2P.NetworkState {
132132
return networkState;
133133
}
134134

135-
public setLastBlock(lastBlock: Interfaces.IBlock): void {
136-
this.nodeHeight = lastBlock.data.height;
137-
this.lastBlockId = lastBlock.data.id;
135+
public getNodeHeight(): number | undefined {
136+
return this.nodeHeight;
137+
}
138+
139+
public getLastBlockId(): string | undefined {
140+
return this.lastBlockId;
138141
}
139142

140143
public getQuorum(): number {
@@ -157,6 +160,11 @@ export class NetworkState implements Contracts.P2P.NetworkState {
157160
return JSON.stringify(data, undefined, 2);
158161
}
159162

163+
private setLastBlock(lastBlock: Interfaces.IBlock): void {
164+
this.nodeHeight = lastBlock.data.height;
165+
this.lastBlockId = lastBlock.data.id;
166+
}
167+
160168
private update(peer: Contracts.P2P.Peer, currentSlot: number): void {
161169
Utils.assert.defined<number>(peer.state.height);
162170
Utils.assert.defined<number>(this.nodeHeight);

0 commit comments

Comments
 (0)