Skip to content

Commit 20906ac

Browse files
chore: cherry pick #3268 to release/0.60 (#3277)
fix: masks ip address in request details passed as argument to MN client (#3268) * removes request details from passed arg to MN client * Masks ip beforehand instead of changing object in repeated request * Adds constant and draft unit test * changes unit test * Fixes unit test * removes unused var --------- Signed-off-by: Konstantina Blazhukova <[email protected]> Signed-off-by: Logan Nguyen <[email protected]> Co-authored-by: konstantinabl <[email protected]>
1 parent 6a9acb2 commit 20906ac

File tree

4 files changed

+95
-48
lines changed

4 files changed

+95
-48
lines changed

packages/relay/src/lib/clients/mirrorNodeClient.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,22 @@
1818
*
1919
*/
2020

21+
import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
22+
import Axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
23+
import axiosRetry from 'axios-retry';
24+
import { install as betterLookupInstall } from 'better-lookup';
25+
import { ethers } from 'ethers';
2126
import http from 'http';
2227
import https from 'https';
2328
import { Logger } from 'pino';
24-
import { ethers } from 'ethers';
25-
import axiosRetry from 'axios-retry';
26-
import constants from './../constants';
2729
import { Histogram, Registry } from 'prom-client';
30+
31+
import { formatRequestIdMessage, formatTransactionId, parseNumericEnvVar } from '../../formatters';
2832
import { predefined } from '../errors/JsonRpcError';
33+
import { MirrorNodeClientError } from '../errors/MirrorNodeClientError';
2934
import { SDKClientError } from '../errors/SDKClientError';
30-
import { IOpcodesResponse } from './models/IOpcodesResponse';
31-
import { install as betterLookupInstall } from 'better-lookup';
35+
import { EthImpl } from '../eth';
3236
import { CacheService } from '../services/cacheService/cacheService';
33-
import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
34-
import { MirrorNodeClientError } from '../errors/MirrorNodeClientError';
35-
import Axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
36-
import { formatRequestIdMessage, formatTransactionId, parseNumericEnvVar } from '../../formatters';
3737
import {
3838
IContractCallRequest,
3939
IContractCallResponse,
@@ -45,7 +45,8 @@ import {
4545
MirrorNodeTransactionRecord,
4646
RequestDetails,
4747
} from '../types';
48-
import { EthImpl } from '../eth';
48+
import constants from './../constants';
49+
import { IOpcodesResponse } from './models/IOpcodesResponse';
4950

5051
type REQUEST_METHODS = 'GET' | 'POST';
5152

@@ -1364,9 +1365,15 @@ export class MirrorNodeClient {
13641365
);
13651366
}
13661367

1368+
// Create a modified copy of requestDetails
1369+
const modifiedRequestDetails = {
1370+
...requestDetails,
1371+
ipAddress: constants.MASKED_IP_ADDRESS,
1372+
};
1373+
13671374
const transactionRecords = await this.repeatedRequest(
13681375
this.getTransactionById.name,
1369-
[transactionId, requestDetails, 0],
1376+
[transactionId, modifiedRequestDetails, 0],
13701377
this.MIRROR_NODE_REQUEST_RETRY_COUNT,
13711378
requestDetails,
13721379
);

packages/relay/src/lib/constants.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@
1818
*
1919
*/
2020

21-
import { BigNumber } from 'bignumber.js';
22-
2321
import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
22+
import { BigNumber } from 'bignumber.js';
2423

2524
enum CACHE_KEY {
2625
ACCOUNT = 'account',
@@ -210,6 +209,8 @@ export default {
210209
// computed hash of an empty Trie object
211210
DEFAULT_ROOT_HASH: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
212211

212+
MASKED_IP_ADDRESS: 'xxx.xxx.xxx.xxx',
213+
213214
// The fee is calculated via the fee calculator: https://docs.hedera.com/hedera/networks/mainnet/fees
214215
// The maximum fileAppendChunkSize is currently set to 5KB by default; therefore, the estimated fees for FileCreate below are based on a file size of 5KB.
215216
// FILE_APPEND_BASE_FEE & FILE_APPEND_RATE_PER_BYTE are calculated based on data colelction from the fee calculator:

packages/relay/src/lib/eth.ts

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,13 @@
1818
*
1919
*/
2020

21+
import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
22+
import { FileId, Hbar, PrecheckStatusError } from '@hashgraph/sdk';
2123
import crypto from 'crypto';
24+
import { Transaction as EthersTransaction } from 'ethers';
2225
import { Logger } from 'pino';
23-
import { Eth } from '../index';
24-
import { Utils } from '../utils';
25-
import constants from './constants';
26-
import { Precheck } from './precheck';
27-
import { MirrorNodeClient } from './clients';
2826
import { Counter, Registry } from 'prom-client';
29-
import { IAccountInfo } from './types/mirrorNode';
30-
import { LogsBloomUtils } from '../logsBloomUtils';
31-
import { DebugService } from './services/debugService';
32-
import { SDKClientError } from './errors/SDKClientError';
33-
import { Transaction as EthersTransaction } from 'ethers';
34-
import HAPIService from './services/hapiService/hapiService';
35-
import { JsonRpcError, predefined } from './errors/JsonRpcError';
36-
import { Block, Log, Transaction, Transaction1559 } from './model';
37-
import { FileId, Hbar, PrecheckStatusError } from '@hashgraph/sdk';
38-
import { CacheService } from './services/cacheService/cacheService';
39-
import { CommonService, FilterService } from './services/ethService';
40-
import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
41-
import { IDebugService } from './services/debugService/IDebugService';
42-
import { MirrorNodeClientError } from './errors/MirrorNodeClientError';
43-
import { IReceiptRootHash, ReceiptsRootUtils } from '../receiptsRootUtils';
44-
import { IFilterService } from './services/ethService/ethFilterService/IFilterService';
45-
import { IContractCallRequest, IContractCallResponse, IFeeHistory, ITransactionReceipt, RequestDetails } from './types';
27+
4628
import {
4729
ASCIIToHex,
4830
formatContractResult,
@@ -59,6 +41,25 @@ import {
5941
trimPrecedingZeros,
6042
weibarHexToTinyBarInt,
6143
} from '../formatters';
44+
import { Eth } from '../index';
45+
import { LogsBloomUtils } from '../logsBloomUtils';
46+
import { IReceiptRootHash, ReceiptsRootUtils } from '../receiptsRootUtils';
47+
import { Utils } from '../utils';
48+
import { MirrorNodeClient } from './clients';
49+
import constants from './constants';
50+
import { JsonRpcError, predefined } from './errors/JsonRpcError';
51+
import { MirrorNodeClientError } from './errors/MirrorNodeClientError';
52+
import { SDKClientError } from './errors/SDKClientError';
53+
import { Block, Log, Transaction, Transaction1559 } from './model';
54+
import { Precheck } from './precheck';
55+
import { CacheService } from './services/cacheService/cacheService';
56+
import { DebugService } from './services/debugService';
57+
import { IDebugService } from './services/debugService/IDebugService';
58+
import { CommonService, FilterService } from './services/ethService';
59+
import { IFilterService } from './services/ethService/ethFilterService/IFilterService';
60+
import HAPIService from './services/hapiService/hapiService';
61+
import { IContractCallRequest, IContractCallResponse, IFeeHistory, ITransactionReceipt, RequestDetails } from './types';
62+
import { IAccountInfo } from './types/mirrorNode';
6263

6364
const _ = require('lodash');
6465
const createHash = require('keccak');
@@ -1720,9 +1721,16 @@ export class EthImpl implements Eth {
17201721
if (submittedTransactionId) {
17211722
try {
17221723
const formattedTransactionId = formatTransactionIdWithoutQueryParams(submittedTransactionId);
1724+
1725+
// Create a modified copy of requestDetails
1726+
const modifiedRequestDetails = {
1727+
...requestDetails,
1728+
ipAddress: constants.MASKED_IP_ADDRESS,
1729+
};
1730+
17231731
const contractResult = await this.mirrorNodeClient.repeatedRequest(
17241732
this.mirrorNodeClient.getContractResult.name,
1725-
[formattedTransactionId, requestDetails],
1733+
[formattedTransactionId, modifiedRequestDetails],
17261734
this.mirrorNodeClient.getMirrorNodeRequestRetryCount(),
17271735
requestDetails,
17281736
);

packages/relay/tests/lib/eth/eth_sendRawTransaction.spec.ts

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
*/
2020

2121
import { ConfigService } from '@hashgraph/json-rpc-config-service/dist/services';
22-
import { expect, use } from 'chai';
23-
import sinon from 'sinon';
24-
import chaiAsPromised from 'chai-as-promised';
2522
import {
2623
FileAppendTransaction,
2724
FileId,
@@ -32,21 +29,27 @@ import {
3229
TransactionId,
3330
TransactionResponse,
3431
} from '@hashgraph/sdk';
35-
import { HbarLimitService } from '../../../src/lib/services/hbarLimitService';
32+
import MockAdapter from 'axios-mock-adapter';
33+
import { expect, use } from 'chai';
34+
import chaiAsPromised from 'chai-as-promised';
3635
import { EventEmitter } from 'events';
3736
import pino from 'pino';
38-
import { SDKClient } from '../../../src/lib/clients';
39-
import { ACCOUNT_ADDRESS_1, DEFAULT_NETWORK_FEES, MAX_GAS_LIMIT_HEX, NO_TRANSACTIONS } from './eth-config';
37+
import { Counter } from 'prom-client';
38+
import sinon from 'sinon';
39+
4040
import { Eth, JsonRpcError, predefined } from '../../../src';
41+
import { formatTransactionIdWithoutQueryParams } from '../../../src/formatters';
42+
import { SDKClient } from '../../../src/lib/clients';
43+
import constants from '../../../src/lib/constants';
44+
import { SDKClientError } from '../../../src/lib/errors/SDKClientError';
45+
import { CacheService } from '../../../src/lib/services/cacheService/cacheService';
46+
import HAPIService from '../../../src/lib/services/hapiService/hapiService';
47+
import { HbarLimitService } from '../../../src/lib/services/hbarLimitService';
48+
import { RequestDetails } from '../../../src/lib/types';
4149
import RelayAssertions from '../../assertions';
4250
import { getRequestId, mockData, overrideEnvsInMochaDescribe, signTransaction } from '../../helpers';
51+
import { ACCOUNT_ADDRESS_1, DEFAULT_NETWORK_FEES, MAX_GAS_LIMIT_HEX, NO_TRANSACTIONS } from './eth-config';
4352
import { generateEthTestEnv } from './eth-helpers';
44-
import { SDKClientError } from '../../../src/lib/errors/SDKClientError';
45-
import { RequestDetails } from '../../../src/lib/types';
46-
import MockAdapter from 'axios-mock-adapter';
47-
import HAPIService from '../../../src/lib/services/hapiService/hapiService';
48-
import { CacheService } from '../../../src/lib/services/cacheService/cacheService';
49-
import { Counter } from 'prom-client';
5053

5154
use(chaiAsPromised);
5255

@@ -283,6 +286,34 @@ describe('@ethSendRawTransaction eth_sendRawTransaction spec', async function ()
283286
});
284287

285288
it('should not send second transaction on error different from timeout', async function () {
289+
restMock.onGet(contractResultEndpoint).reply(200, { hash: ethereumHash });
290+
const repeatedRequestSpy = sinon.spy(ethImpl['mirrorNodeClient'], 'repeatedRequest');
291+
sdkClientStub.submitEthereumTransaction.resolves({
292+
txResponse: {
293+
transactionId: TransactionId.fromString(transactionIdServicesFormat),
294+
} as unknown as TransactionResponse,
295+
fileId: null,
296+
});
297+
298+
const signed = await signTransaction(transaction);
299+
300+
const resultingHash = await ethImpl.sendRawTransaction(signed, requestDetails);
301+
const mirrorNodeRetry = 10;
302+
const newRequestDetails = { ...requestDetails, ipAddress: constants.MASKED_IP_ADDRESS };
303+
const formattedTransactionId = formatTransactionIdWithoutQueryParams(transactionIdServicesFormat);
304+
305+
expect(resultingHash).to.equal(ethereumHash);
306+
sinon.assert.calledOnce(sdkClientStub.submitEthereumTransaction);
307+
sinon.assert.calledOnceWithExactly(
308+
repeatedRequestSpy,
309+
'getContractResult',
310+
[formattedTransactionId, newRequestDetails],
311+
mirrorNodeRetry,
312+
requestDetails,
313+
);
314+
});
315+
316+
it('should call repeated request passing masked IP address', async function () {
286317
sdkClientStub.submitEthereumTransaction
287318
.onCall(0)
288319
.throws(new SDKClientError({ status: 50 }, 'wrong transaction body'));

0 commit comments

Comments
 (0)