From 161ef07a4d811ee1b7b611825be8c21dc7ed27ee Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 11:31:38 +0900 Subject: [PATCH 1/8] rename fields --- .../transaction-pool/sender-mempool.ts | 2 +- .../contracts/transaction-pool/storage.ts | 10 +-- .../source/mempool.ts | 4 +- .../source/sender-mempool.ts | 4 +- .../source/service.ts | 28 ++++---- .../source/storage.test.ts | 64 +++++++++---------- .../source/storage.ts | 40 ++++++------ 7 files changed, 78 insertions(+), 74 deletions(-) diff --git a/packages/contracts/source/contracts/transaction-pool/sender-mempool.ts b/packages/contracts/source/contracts/transaction-pool/sender-mempool.ts index 9078ba524b..07d6072ea5 100644 --- a/packages/contracts/source/contracts/transaction-pool/sender-mempool.ts +++ b/packages/contracts/source/contracts/transaction-pool/sender-mempool.ts @@ -8,7 +8,7 @@ export interface SenderMempool { getFromLatest(): Iterable; addTransaction(transaction: Transaction): Promise; - removeTransaction(id: string): Transaction[]; + removeTransaction(hash: string): Transaction[]; reAddTransactions(): Promise; } diff --git a/packages/contracts/source/contracts/transaction-pool/storage.ts b/packages/contracts/source/contracts/transaction-pool/storage.ts index fb6e0df2d6..d60b9c865a 100644 --- a/packages/contracts/source/contracts/transaction-pool/storage.ts +++ b/packages/contracts/source/contracts/transaction-pool/storage.ts @@ -1,15 +1,15 @@ export type StoredTransaction = { - height: number; - id: string; + blockNumber: number; + hash: string; senderPublicKey: string; serialized: Buffer; }; export interface Storage { addTransaction(storedTransaction: StoredTransaction): void; - hasTransaction(id: string): boolean; + hasTransaction(hash: string): boolean; getAllTransactions(): Iterable; - getOldTransactions(height: number): Iterable; - removeTransaction(id: string): void; + getOldTransactions(blockNumber: number): Iterable; + removeTransaction(hash: string): void; flush(): void; } diff --git a/packages/transaction-pool-service/source/mempool.ts b/packages/transaction-pool-service/source/mempool.ts index 0f7401ac0e..7119af0a7b 100644 --- a/packages/transaction-pool-service/source/mempool.ts +++ b/packages/transaction-pool-service/source/mempool.ts @@ -48,13 +48,13 @@ export class Mempool implements Contracts.TransactionPool.Mempool { } } - public async removeTransaction(address: string, id: string): Promise { + public async removeTransaction(address: string, hash: string): Promise { const senderMempool = this.#senderMempools.get(address); if (!senderMempool) { return []; } - const transactions = senderMempool.removeTransaction(id); + const transactions = senderMempool.removeTransaction(hash); this.#removeDisposableMempool(address); return transactions; diff --git a/packages/transaction-pool-service/source/sender-mempool.ts b/packages/transaction-pool-service/source/sender-mempool.ts index 5bff47f341..888ee6bc49 100644 --- a/packages/transaction-pool-service/source/sender-mempool.ts +++ b/packages/transaction-pool-service/source/sender-mempool.ts @@ -64,8 +64,8 @@ export class SenderMempool implements Contracts.TransactionPool.SenderMempool { } } - public removeTransaction(id: string): Contracts.Crypto.Transaction[] { - const index = this.#transactions.findIndex((t) => t.hash === id); + public removeTransaction(hash: string): Contracts.Crypto.Transaction[] { + const index = this.#transactions.findIndex((t) => t.hash === hash); if (index === -1) { return []; } diff --git a/packages/transaction-pool-service/source/service.ts b/packages/transaction-pool-service/source/service.ts index fe857e63dd..0380eadaa4 100644 --- a/packages/transaction-pool-service/source/service.ts +++ b/packages/transaction-pool-service/source/service.ts @@ -84,8 +84,8 @@ export class Service implements Contracts.TransactionPool.Service { } this.storage.addTransaction({ - height: this.stateStore.getHeight(), - id: transaction.hash, + blockNumber: this.stateStore.getHeight(), + hash: transaction.hash, senderPublicKey: transaction.data.senderPublicKey, serialized: transaction.serialized, }); @@ -121,11 +121,11 @@ export class Service implements Contracts.TransactionPool.Service { let previouslyStoredFailures = 0; const maxTransactionAge: number = this.pluginConfiguration.getRequired("maxTransactionAge"); - const lastHeight: number = this.stateStore.getHeight(); - const expiredHeight: number = lastHeight - maxTransactionAge; + const lastBlockNumber: number = this.stateStore.getHeight(); + const expiredBlockNumber: number = lastBlockNumber - maxTransactionAge; - for (const { height, id, serialized } of this.storage.getAllTransactions()) { - if (height > expiredHeight) { + for (const { blockNumber, hash, serialized } of this.storage.getAllTransactions()) { + if (blockNumber > expiredBlockNumber) { try { const previouslyStoredTransaction = await this.transactionFactory.fromBytes(serialized); await this.#addTransactionToMempool(previouslyStoredTransaction); @@ -137,14 +137,14 @@ export class Service implements Contracts.TransactionPool.Service { previouslyStoredSuccesses++; } catch (error) { - this.storage.removeTransaction(id); - this.logger.debug(`Failed to re-add previously stored tx ${id}: ${error.message}`); + this.storage.removeTransaction(hash); + this.logger.debug(`Failed to re-add previously stored tx ${hash}: ${error.message}`); previouslyStoredFailures++; } } else { - this.storage.removeTransaction(id); - this.logger.debug(`Not re-adding previously stored expired tx ${id}`); + this.storage.removeTransaction(hash); + this.logger.debug(`Not re-adding previously stored expired tx ${hash}`); previouslyStoredExpirations++; } } @@ -179,13 +179,13 @@ export class Service implements Contracts.TransactionPool.Service { async #removeOldTransactions(): Promise { const maxTransactionAge: number = this.pluginConfiguration.getRequired("maxTransactionAge"); - const lastHeight: number = this.stateStore.getHeight(); - const expiredHeight: number = lastHeight - maxTransactionAge; + const lastBlockNumber: number = this.stateStore.getHeight(); + const expiredBlockNumber: number = lastBlockNumber - maxTransactionAge; - for (const { senderPublicKey, id } of this.storage.getOldTransactions(expiredHeight)) { + for (const { senderPublicKey, hash } of this.storage.getOldTransactions(expiredBlockNumber)) { const removedTransactions = await this.mempool.removeTransaction( await this.addressFactory.fromPublicKey(senderPublicKey), - id, + hash, ); for (const removedTransaction of removedTransactions) { diff --git a/packages/transaction-pool-service/source/storage.test.ts b/packages/transaction-pool-service/source/storage.test.ts index 1f1f9abf96..2e66780e9c 100644 --- a/packages/transaction-pool-service/source/storage.test.ts +++ b/packages/transaction-pool-service/source/storage.test.ts @@ -67,13 +67,13 @@ describe<{ try { storage.addTransaction({ - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }); - const has = storage.hasTransaction("first-tx-id"); + const has = storage.hasTransaction("first-tx-hash"); assert.true(has); } finally { storage.dispose(); @@ -87,8 +87,8 @@ describe<{ try { storage.addTransaction({ - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }); @@ -107,15 +107,15 @@ describe<{ try { const storedTransaction1 = { - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }; const storedTransaction2 = { - height: 100, - id: "second-tx-id", + blockNumber: 200, + hash: "second-tx-hash", senderPublicKey: "second-public-key", serialized: Buffer.from("second-serialized"), }; @@ -137,15 +137,15 @@ describe<{ try { const storedTransaction1 = { - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }; const storedTransaction2 = { - height: 200, - id: "second-tx-id", + blockNumber: 200, + hash: "second-tx-hash", senderPublicKey: "second-public-key", serialized: Buffer.from("second-serialized"), }; @@ -167,15 +167,15 @@ describe<{ try { const storedTransaction1 = { - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }; const storedTransaction2 = { - height: 200, - id: "second-tx-id", + blockNumber: 200, + hash: "second-tx-hash", senderPublicKey: "second-public-key", serialized: Buffer.from("second-serialized"), }; @@ -197,13 +197,13 @@ describe<{ try { storage.addTransaction({ - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }); - const has = storage.hasTransaction("first-tx-id"); + const has = storage.hasTransaction("first-tx-hash"); assert.true(has); } finally { storage.dispose(); @@ -217,16 +217,16 @@ describe<{ try { storage.addTransaction({ - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }); assert.throws(() => { storage.addTransaction({ - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }); @@ -243,15 +243,15 @@ describe<{ try { storage.addTransaction({ - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "some-public-key", serialized: Buffer.from("test"), }); - storage.removeTransaction("first-tx-id"); + storage.removeTransaction("first-tx-hash"); - const has = storage.hasTransaction("first-tx-id"); + const has = storage.hasTransaction("first-tx-hash"); assert.false(has); } finally { storage.dispose(); @@ -265,15 +265,15 @@ describe<{ try { storage.addTransaction({ - height: 100, - id: "first-tx-id", + blockNumber: 100, + hash: "first-tx-hash", senderPublicKey: "dummy-sender-key-1", serialized: Buffer.from("dummy-serialized-1"), }); storage.addTransaction({ - height: 100, - id: "second-tx-id", + blockNumber: 100, + hash: "second-tx-hash", senderPublicKey: "dummy-sender-key-2", serialized: Buffer.from("dummy-serialized-2"), }); diff --git a/packages/transaction-pool-service/source/storage.ts b/packages/transaction-pool-service/source/storage.ts index 0c426a6e16..cd09cb8a90 100644 --- a/packages/transaction-pool-service/source/storage.ts +++ b/packages/transaction-pool-service/source/storage.ts @@ -12,10 +12,10 @@ export class Storage implements Contracts.TransactionPool.Storage { #database!: BetterSqlite3.Database; #addTransactionStmt!: BetterSqlite3.Statement; - #hasTransactionStmt!: BetterSqlite3.Statement<{ id: string }>; + #hasTransactionStmt!: BetterSqlite3.Statement<{ hash: string }>; #getAllTransactionsStmt!: BetterSqlite3.Statement; - #getOldTransactionsStmt!: BetterSqlite3.Statement<{ height: number }>; - #removeTransactionStmt!: BetterSqlite3.Statement<{ id: string }>; + #getOldTransactionsStmt!: BetterSqlite3.Statement<{ blockNumber: number }>; + #removeTransactionStmt!: BetterSqlite3.Statement<{ hash: string }>; #flushStmt!: BetterSqlite3.Statement; public boot(): void { @@ -36,31 +36,33 @@ export class Storage implements Contracts.TransactionPool.Storage { CREATE TABLE IF NOT EXISTS ${table}( n INTEGER PRIMARY KEY AUTOINCREMENT, - height INTEGER NOT NULL, - id VARCHAR(64) NOT NULL, + blockNumber INTEGER NOT NULL, + hash VARCHAR(64) NOT NULL, senderPublicKey VARCHAR(66) NOT NULL, serialized BLOB NOT NULL ); - CREATE UNIQUE INDEX IF NOT EXISTS ${table}_id ON ${table} (id); - CREATE INDEX IF NOT EXISTS ${table}_height ON ${table} (height); + CREATE UNIQUE INDEX IF NOT EXISTS ${table}_hash ON ${table} (hash); + CREATE INDEX IF NOT EXISTS ${table}_blockNumber ON ${table} (blockNumber); `); this.#addTransactionStmt = this.#database.prepare( - `INSERT INTO ${table} (height, id, senderPublicKey, serialized) VALUES (:height, :id, :senderPublicKey, :serialized)`, + `INSERT INTO ${table} (blockNumber, hash, senderPublicKey, serialized) VALUES (:blockNumber, :hash, :senderPublicKey, :serialized)`, ); - this.#hasTransactionStmt = this.#database.prepare(`SELECT COUNT(*) FROM ${table} WHERE id = :id`).pluck(true); + this.#hasTransactionStmt = this.#database + .prepare(`SELECT COUNT(*) FROM ${table} WHERE hash = :hash`) + .pluck(true); this.#getAllTransactionsStmt = this.#database.prepare( - `SELECT height, id, senderPublicKey, serialized FROM ${table} ORDER BY n`, + `SELECT blockNumber, hash, senderPublicKey, serialized FROM ${table} ORDER BY n`, ); this.#getOldTransactionsStmt = this.#database.prepare( - `SELECT height, id, senderPublicKey, serialized FROM ${table} WHERE height <= :height ORDER BY n DESC`, + `SELECT blockNumber, hash, senderPublicKey, serialized FROM ${table} WHERE blockNumber <= :blockNumber ORDER BY n DESC`, ); - this.#removeTransactionStmt = this.#database.prepare(`DELETE FROM ${table} WHERE id = :id`); + this.#removeTransactionStmt = this.#database.prepare(`DELETE FROM ${table} WHERE hash = :hash`); this.#flushStmt = this.#database.prepare(`DELETE FROM ${table}`); } @@ -73,20 +75,22 @@ export class Storage implements Contracts.TransactionPool.Storage { this.#addTransactionStmt.run(storedTransaction); } - public hasTransaction(id: string): boolean { - return !!this.#hasTransactionStmt.get({ id }); + public hasTransaction(hash: string): boolean { + return !!this.#hasTransactionStmt.get({ hash }); } public getAllTransactions(): Iterable { return this.#getAllTransactionsStmt.all() as Iterable; } - public getOldTransactions(height: number): Iterable { - return this.#getOldTransactionsStmt.all({ height }) as Iterable; + public getOldTransactions(blockNumber: number): Iterable { + return this.#getOldTransactionsStmt.all({ + blockNumber, + }) as Iterable; } - public removeTransaction(id: string): void { - this.#removeTransactionStmt.run({ id }); + public removeTransaction(hash: string): void { + this.#removeTransactionStmt.run({ hash }); } public flush(): void { From 2278fe375f4497dfbdddd37df227520c17b017f0 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 11:32:03 +0900 Subject: [PATCH 2/8] ensure cleanup of expired transaction --- packages/transaction-pool-service/source/service.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/transaction-pool-service/source/service.ts b/packages/transaction-pool-service/source/service.ts index 0380eadaa4..e0efc2ef70 100644 --- a/packages/transaction-pool-service/source/service.ts +++ b/packages/transaction-pool-service/source/service.ts @@ -188,11 +188,14 @@ export class Service implements Contracts.TransactionPool.Service { hash, ); - for (const removedTransaction of removedTransactions) { - this.storage.removeTransaction(removedTransaction.hash); - this.logger.debug(`Removed old tx ${removedTransaction.hash}`); + const removedTransactionHashes = new Set(removedTransactions.map(({ hash }) => hash)); + removedTransactionHashes.add(hash); - void this.events.dispatch(Events.TransactionEvent.Expired, removedTransaction.data); + for (const removedTransactionHash of removedTransactionHashes) { + this.storage.removeTransaction(removedTransactionHash); + this.logger.debug(`Removed old tx ${removedTransactionHash}`); + + void this.events.dispatch(Events.TransactionEvent.Expired, removedTransactionHash); } } } From b1937df4d9e8eaacec9f65299035afa987244712 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 11:53:17 +0900 Subject: [PATCH 3/8] tweak tx size limits --- packages/crypto-transaction/source/validation/keywords.ts | 3 ++- packages/transaction-pool-service/source/defaults.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/crypto-transaction/source/validation/keywords.ts b/packages/crypto-transaction/source/validation/keywords.ts index cc9d7bebe8..0fe162d804 100644 --- a/packages/crypto-transaction/source/validation/keywords.ts +++ b/packages/crypto-transaction/source/validation/keywords.ts @@ -138,7 +138,8 @@ export const makeKeywords = (configuration: Contracts.Crypto.Configuration) => { } // The allowed bytecode length is relative to the maximum transaction gas limit - const maxBytecodeLength = maximumGasLimit / 2; + // and cost of non-zero calldata per gas (16 byte). + const maxBytecodeLength = maximumGasLimit / 16; const minBytecodeLength = 0; const regex = new RegExp(`^(0x)?[0-9a-fA-F]{${minBytecodeLength},${maxBytecodeLength}}$`); diff --git a/packages/transaction-pool-service/source/defaults.ts b/packages/transaction-pool-service/source/defaults.ts index 840a4b1a46..f809035ab5 100644 --- a/packages/transaction-pool-service/source/defaults.ts +++ b/packages/transaction-pool-service/source/defaults.ts @@ -11,8 +11,8 @@ export const defaults = { // then it will be removed. maxTransactionAge: 2700, - // Based on a multipayment transaction with 256 recipients (base58), vendor field, 16 signatures plus some leeway - maxTransactionBytes: 9000, + // Based on limit used by other Ethereum clients such as Geth (128kb). + maxTransactionBytes: 128 * 1000, // When the pool contains that many transactions, then a new transaction is // only accepted if its fee is higher than the transaction with the lowest From 53ce789b5625b89c7b13d736c465d62be11e7fc6 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 12:22:25 +0900 Subject: [PATCH 4/8] update e2e test --- tests/e2e/consensus/checks/client.mjs | 4 ++-- tests/e2e/consensus/checks/index.mjs | 16 +++++++++++----- tests/e2e/consensus/checks/tx.mjs | 22 ++++++++++++++++++++++ 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/tests/e2e/consensus/checks/client.mjs b/tests/e2e/consensus/checks/client.mjs index 05c2b63a80..3073ea416b 100644 --- a/tests/e2e/consensus/checks/client.mjs +++ b/tests/e2e/consensus/checks/client.mjs @@ -56,12 +56,12 @@ export const getApiHttp = async (peer, path) => { } }; -export const postTransaction = async (peer, transaction) => { +export const postTransactions = async (peer, transactions) => { try { const response = await http.post(`${peer.apiTxPoolUrl}/api/transactions`, { headers: { "Content-Type": "application/json" }, body: { - transactions: [transaction], + transactions, }, }); diff --git a/tests/e2e/consensus/checks/index.mjs b/tests/e2e/consensus/checks/index.mjs index d618284d23..8dc8e2a722 100644 --- a/tests/e2e/consensus/checks/index.mjs +++ b/tests/e2e/consensus/checks/index.mjs @@ -1,8 +1,9 @@ import got from "got"; import express from "express"; -import { makeEvmCall } from "./tx.mjs"; -import { getApiHttp, postTransaction } from "./client.mjs"; +import { ConsensusAbi } from "/mainsail/packages/evm-contracts/distribution/index.js"; +import { makeEvmCall, makeEvmDeploy } from "./tx.mjs"; +import { getApiHttp, postTransactions } from "./client.mjs"; import { config } from "./config.mjs"; const app = express(); @@ -66,9 +67,14 @@ async function waitForResults() { async function broadcastTransactions() { const tx = await makeEvmCall(`${config.to}`, "100000000"); - const response = await postTransaction(config.peer, tx.serialized.toString("hex")); - console.log("broadcastTransactions", { hash: tx.hash, response: JSON.stringify(response) }); - broadcastedTransactions.push(tx.hash); + const txDeploy = await makeEvmDeploy(ConsensusAbi, 1); + const response = await postTransactions(config.peer, [ + tx.serialized.toString("hex"), + txDeploy.serialized.toString("hex"), + ]); + + console.log("broadcastTransactions", { txs: [tx.hash, txDeploy.hash], response: JSON.stringify(response) }); + broadcastedTransactions.push(tx.hash, txDeploy.hash); } async function discoverPeers() { diff --git a/tests/e2e/consensus/checks/tx.mjs b/tests/e2e/consensus/checks/tx.mjs index 35c56d78f8..64834a651b 100644 --- a/tests/e2e/consensus/checks/tx.mjs +++ b/tests/e2e/consensus/checks/tx.mjs @@ -33,6 +33,28 @@ export const makeEvmCall = async ( return signed.build(); }; +export const makeEvmDeploy = async ( + abi, + nonceOffset = 0, +) => { + const app = await getApplication(config); + + const addressFactory = app.getTagged(Identifiers.Cryptography.Identity.Address.Factory, "type", "wallet"); + const senderAddress = await addressFactory.fromMnemonic(config.senderPassphrase); + const walletNonce = await getWalletNonce(config.peer, senderAddress); + + let builder = app + .resolve(EvmCallBuilder) + .gasPrice("5000000000") + .gasLimit(2_000_000) + .payload(abi.bytecode.object.slice(2)) + .nonce((walletNonce + nonceOffset).toString()); + + const signed = await builder.sign(config.senderPassphrase); + + return signed.build(); +}; + const getApplication = async (config) => { if (app) { return app; From 15b8251468da3bf4b6fcad5311941a1ec759181a Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 12:37:49 +0900 Subject: [PATCH 5/8] fix --- packages/crypto-transaction/source/validation/keywords.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/crypto-transaction/source/validation/keywords.test.ts b/packages/crypto-transaction/source/validation/keywords.test.ts index 134e679e00..577bc79801 100644 --- a/packages/crypto-transaction/source/validation/keywords.test.ts +++ b/packages/crypto-transaction/source/validation/keywords.test.ts @@ -137,7 +137,7 @@ describe<{ assert.undefined(context.validator.validate("test", "0x").error); assert.undefined(context.validator.validate("test", "00").error); - const maxBytecodeLength = cryptoJson.milestones[0].gas!.maximumGasLimit / 2; + const maxBytecodeLength = cryptoJson.milestones[0].gas!.maximumGasLimit / 16; const maxPayload = "0x" + "a".repeat(maxBytecodeLength); assert.undefined(context.validator.validate("test", maxPayload).error); From 80b505726bdcac6b1945629fc989d36e8530327f Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 12:46:13 +0900 Subject: [PATCH 6/8] bump tx gas limit --- .../source/generators/milestones.test.ts | 2 +- .../configuration-generator/source/generators/milestones.ts | 2 +- tests/e2e/consensus/nodes/api-node/core/crypto.json | 2 +- tests/e2e/consensus/nodes/node0/core/crypto.json | 2 +- tests/e2e/consensus/nodes/node1/core/crypto.json | 2 +- tests/e2e/consensus/nodes/node2/core/crypto.json | 2 +- tests/e2e/consensus/nodes/node3/core/crypto.json | 2 +- tests/e2e/consensus/nodes/node4/core/crypto.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/configuration-generator/source/generators/milestones.test.ts b/packages/configuration-generator/source/generators/milestones.test.ts index 78ccf806af..1ae1b2a3fa 100644 --- a/packages/configuration-generator/source/generators/milestones.test.ts +++ b/packages/configuration-generator/source/generators/milestones.test.ts @@ -43,7 +43,7 @@ describe<{ epoch: date.toISOString().slice(0, 11) + "00:00:00.000Z", evmSpec: Contracts.Evm.SpecId.SHANGHAI, gas: { - maximumGasLimit: 2_000_000, + maximumGasLimit: 5_000_000, maximumGasPrice: 10_000 * 1e9, minimumGasLimit: 21_000, minimumGasPrice: 5 * 1e9, diff --git a/packages/configuration-generator/source/generators/milestones.ts b/packages/configuration-generator/source/generators/milestones.ts index 268beabd9e..68620a0697 100644 --- a/packages/configuration-generator/source/generators/milestones.ts +++ b/packages/configuration-generator/source/generators/milestones.ts @@ -18,7 +18,7 @@ export class MilestonesGenerator { epoch: options.epoch.toISOString().slice(0, 11) + "00:00:00.000Z", evmSpec: Contracts.Evm.SpecId.SHANGHAI, gas: { - maximumGasLimit: 2_000_000, + maximumGasLimit: 5_000_000, maximumGasPrice: 10_000 * 1e9, minimumGasLimit: 21_000, minimumGasPrice: 5 * 1e9, diff --git a/tests/e2e/consensus/nodes/api-node/core/crypto.json b/tests/e2e/consensus/nodes/api-node/core/crypto.json index 69c0087622..53efa282e9 100644 --- a/tests/e2e/consensus/nodes/api-node/core/crypto.json +++ b/tests/e2e/consensus/nodes/api-node/core/crypto.json @@ -279,7 +279,7 @@ "epoch": "2025-05-22T00:00:00.000Z", "evmSpec": "Shanghai", "gas": { - "maximumGasLimit": 2000000, + "maximumGasLimit": 5000000, "maximumGasPrice": 10000000000000, "minimumGasLimit": 21000, "minimumGasPrice": 5000000000 diff --git a/tests/e2e/consensus/nodes/node0/core/crypto.json b/tests/e2e/consensus/nodes/node0/core/crypto.json index 69c0087622..53efa282e9 100644 --- a/tests/e2e/consensus/nodes/node0/core/crypto.json +++ b/tests/e2e/consensus/nodes/node0/core/crypto.json @@ -279,7 +279,7 @@ "epoch": "2025-05-22T00:00:00.000Z", "evmSpec": "Shanghai", "gas": { - "maximumGasLimit": 2000000, + "maximumGasLimit": 5000000, "maximumGasPrice": 10000000000000, "minimumGasLimit": 21000, "minimumGasPrice": 5000000000 diff --git a/tests/e2e/consensus/nodes/node1/core/crypto.json b/tests/e2e/consensus/nodes/node1/core/crypto.json index 69c0087622..53efa282e9 100644 --- a/tests/e2e/consensus/nodes/node1/core/crypto.json +++ b/tests/e2e/consensus/nodes/node1/core/crypto.json @@ -279,7 +279,7 @@ "epoch": "2025-05-22T00:00:00.000Z", "evmSpec": "Shanghai", "gas": { - "maximumGasLimit": 2000000, + "maximumGasLimit": 5000000, "maximumGasPrice": 10000000000000, "minimumGasLimit": 21000, "minimumGasPrice": 5000000000 diff --git a/tests/e2e/consensus/nodes/node2/core/crypto.json b/tests/e2e/consensus/nodes/node2/core/crypto.json index 69c0087622..53efa282e9 100644 --- a/tests/e2e/consensus/nodes/node2/core/crypto.json +++ b/tests/e2e/consensus/nodes/node2/core/crypto.json @@ -279,7 +279,7 @@ "epoch": "2025-05-22T00:00:00.000Z", "evmSpec": "Shanghai", "gas": { - "maximumGasLimit": 2000000, + "maximumGasLimit": 5000000, "maximumGasPrice": 10000000000000, "minimumGasLimit": 21000, "minimumGasPrice": 5000000000 diff --git a/tests/e2e/consensus/nodes/node3/core/crypto.json b/tests/e2e/consensus/nodes/node3/core/crypto.json index 69c0087622..53efa282e9 100644 --- a/tests/e2e/consensus/nodes/node3/core/crypto.json +++ b/tests/e2e/consensus/nodes/node3/core/crypto.json @@ -279,7 +279,7 @@ "epoch": "2025-05-22T00:00:00.000Z", "evmSpec": "Shanghai", "gas": { - "maximumGasLimit": 2000000, + "maximumGasLimit": 5000000, "maximumGasPrice": 10000000000000, "minimumGasLimit": 21000, "minimumGasPrice": 5000000000 diff --git a/tests/e2e/consensus/nodes/node4/core/crypto.json b/tests/e2e/consensus/nodes/node4/core/crypto.json index 69c0087622..53efa282e9 100644 --- a/tests/e2e/consensus/nodes/node4/core/crypto.json +++ b/tests/e2e/consensus/nodes/node4/core/crypto.json @@ -279,7 +279,7 @@ "epoch": "2025-05-22T00:00:00.000Z", "evmSpec": "Shanghai", "gas": { - "maximumGasLimit": 2000000, + "maximumGasLimit": 5000000, "maximumGasPrice": 10000000000000, "minimumGasLimit": 21000, "minimumGasPrice": 5000000000 From cb2daf5aeafbd916f030ac49e4a6b0f41859a910 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 12:46:45 +0900 Subject: [PATCH 7/8] check tx receipt status --- tests/e2e/consensus/checks/index.mjs | 25 +++++++++++++++++++------ tests/e2e/consensus/checks/tx.mjs | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/tests/e2e/consensus/checks/index.mjs b/tests/e2e/consensus/checks/index.mjs index 8dc8e2a722..8d484d8f52 100644 --- a/tests/e2e/consensus/checks/index.mjs +++ b/tests/e2e/consensus/checks/index.mjs @@ -20,7 +20,8 @@ let broadcastedTransactions = []; // Results let allPeersReachedTargetBlockNumber = false; -let allTransactionsReportedByApi = true; +let allTransactionsReportedByApi = false; +let allTransactionsSuccessful = false; const peerBlockNumberMap = new Map(); @@ -39,30 +40,42 @@ const peerBlockNumberMap = new Map(); async function waitForResults() { do { await sleep(1000); - console.log("waiting for results...", { allPeersReachedTargetBlockNumber, allTransactionsReportedByApi }); + console.log("waiting for results...", { allPeersReachedTargetBlockNumber, allTransactionsReportedByApi, allTransactionsSuccessful }); if (!allTransactionsReportedByApi) { try { let allFound = true; + let allSuccessful = true; for (const hash of broadcastedTransactions) { const transaction = await getApiHttp(config.peer, `/transactions/${hash}`); if (!transaction) { - allFound = false; - break; + allFound = false; + break; + } + + if (transaction.receipt.status !== 1) { + console.log("transaction failed!!", transaction); + allSuccessful = false; } } if (allFound) { allTransactionsReportedByApi = true; } - } catch {} + + if (allSuccessful) { + allTransactionsSuccessful = true; + } + } catch (ex) { + console.log(ex); + } } } while (!allPeersReachedTargetBlockNumber || !allTransactionsReportedByApi); console.log(`checks successful. exiting`); - process.exit(0); + process.exit(allTransactionsSuccessful ? 0 : 1); } async function broadcastTransactions() { diff --git a/tests/e2e/consensus/checks/tx.mjs b/tests/e2e/consensus/checks/tx.mjs index 64834a651b..b007e7058e 100644 --- a/tests/e2e/consensus/checks/tx.mjs +++ b/tests/e2e/consensus/checks/tx.mjs @@ -46,7 +46,7 @@ export const makeEvmDeploy = async ( let builder = app .resolve(EvmCallBuilder) .gasPrice("5000000000") - .gasLimit(2_000_000) + .gasLimit(4_000_000) .payload(abi.bytecode.object.slice(2)) .nonce((walletNonce + nonceOffset).toString()); From 9e4e471c02032d395f9fe4701cbbe0b1555322f8 Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Tue, 27 May 2025 14:13:27 +0900 Subject: [PATCH 8/8] debug --- .../source/peer-communicator.ts | 5 +++++ tests/e2e/clients/config/core/crypto.json | 8 ++++---- tests/e2e/consensus/nodes/api-node/core/crypto.json | 8 ++++---- tests/e2e/consensus/nodes/node0/core/crypto.json | 8 ++++---- tests/e2e/consensus/nodes/node1/core/crypto.json | 8 ++++---- tests/e2e/consensus/nodes/node2/core/crypto.json | 8 ++++---- tests/e2e/consensus/nodes/node3/core/crypto.json | 8 ++++---- tests/e2e/consensus/nodes/node4/core/crypto.json | 8 ++++---- 8 files changed, 33 insertions(+), 28 deletions(-) diff --git a/packages/transaction-pool-broadcaster/source/peer-communicator.ts b/packages/transaction-pool-broadcaster/source/peer-communicator.ts index dc16db3b90..0775b70f9b 100644 --- a/packages/transaction-pool-broadcaster/source/peer-communicator.ts +++ b/packages/transaction-pool-broadcaster/source/peer-communicator.ts @@ -13,6 +13,9 @@ export class PeerCommunicator implements Contracts.TransactionPool.PeerCommunica @tagged("plugin", "transaction-pool-broadcaster") protected readonly configuration!: Providers.PluginConfiguration; + @inject(Identifiers.Services.Log.Service) + private readonly logger!: Contracts.Kernel.Logger; + public async postTransactions( peer: Contracts.TransactionPool.Peer, transactions: Contracts.Crypto.Transaction[], @@ -30,6 +33,8 @@ export class PeerCommunicator implements Contracts.TransactionPool.PeerCommunica } private handleSocketError(peer: Contracts.TransactionPool.Peer, error: Error): void { + this.logger.debug(`socket error ${peer.ip}: ${error.message}`); + if (peer.errorCount++ > this.configuration.getRequired("maxSequentialErrors")) { this.repository.forgetPeer(peer.ip); Ipc.emit("peer.removed", peer.ip); diff --git a/tests/e2e/clients/config/core/crypto.json b/tests/e2e/clients/config/core/crypto.json index 69c0087622..9680bdd9f6 100644 --- a/tests/e2e/clients/config/core/crypto.json +++ b/tests/e2e/clients/config/core/crypto.json @@ -291,10 +291,10 @@ "denomination": 1000000000000000000 }, "timeouts": { - "blockPrepareTime": 500, - "blockTime": 500, - "stageTimeout": 500, - "stageTimeoutIncrease": 500, + "blockPrepareTime": 2000, + "blockTime": 2000, + "stageTimeout": 2000, + "stageTimeoutIncrease": 2000, "tolerance": 100 }, "vendorFieldLength": 255 diff --git a/tests/e2e/consensus/nodes/api-node/core/crypto.json b/tests/e2e/consensus/nodes/api-node/core/crypto.json index 53efa282e9..f0b8ecb21d 100644 --- a/tests/e2e/consensus/nodes/api-node/core/crypto.json +++ b/tests/e2e/consensus/nodes/api-node/core/crypto.json @@ -291,10 +291,10 @@ "denomination": 1000000000000000000 }, "timeouts": { - "blockPrepareTime": 500, - "blockTime": 500, - "stageTimeout": 500, - "stageTimeoutIncrease": 500, + "blockPrepareTime": 2000, + "blockTime": 2000, + "stageTimeout": 2000, + "stageTimeoutIncrease": 2000, "tolerance": 100 }, "vendorFieldLength": 255 diff --git a/tests/e2e/consensus/nodes/node0/core/crypto.json b/tests/e2e/consensus/nodes/node0/core/crypto.json index 53efa282e9..f0b8ecb21d 100644 --- a/tests/e2e/consensus/nodes/node0/core/crypto.json +++ b/tests/e2e/consensus/nodes/node0/core/crypto.json @@ -291,10 +291,10 @@ "denomination": 1000000000000000000 }, "timeouts": { - "blockPrepareTime": 500, - "blockTime": 500, - "stageTimeout": 500, - "stageTimeoutIncrease": 500, + "blockPrepareTime": 2000, + "blockTime": 2000, + "stageTimeout": 2000, + "stageTimeoutIncrease": 2000, "tolerance": 100 }, "vendorFieldLength": 255 diff --git a/tests/e2e/consensus/nodes/node1/core/crypto.json b/tests/e2e/consensus/nodes/node1/core/crypto.json index 53efa282e9..f0b8ecb21d 100644 --- a/tests/e2e/consensus/nodes/node1/core/crypto.json +++ b/tests/e2e/consensus/nodes/node1/core/crypto.json @@ -291,10 +291,10 @@ "denomination": 1000000000000000000 }, "timeouts": { - "blockPrepareTime": 500, - "blockTime": 500, - "stageTimeout": 500, - "stageTimeoutIncrease": 500, + "blockPrepareTime": 2000, + "blockTime": 2000, + "stageTimeout": 2000, + "stageTimeoutIncrease": 2000, "tolerance": 100 }, "vendorFieldLength": 255 diff --git a/tests/e2e/consensus/nodes/node2/core/crypto.json b/tests/e2e/consensus/nodes/node2/core/crypto.json index 53efa282e9..f0b8ecb21d 100644 --- a/tests/e2e/consensus/nodes/node2/core/crypto.json +++ b/tests/e2e/consensus/nodes/node2/core/crypto.json @@ -291,10 +291,10 @@ "denomination": 1000000000000000000 }, "timeouts": { - "blockPrepareTime": 500, - "blockTime": 500, - "stageTimeout": 500, - "stageTimeoutIncrease": 500, + "blockPrepareTime": 2000, + "blockTime": 2000, + "stageTimeout": 2000, + "stageTimeoutIncrease": 2000, "tolerance": 100 }, "vendorFieldLength": 255 diff --git a/tests/e2e/consensus/nodes/node3/core/crypto.json b/tests/e2e/consensus/nodes/node3/core/crypto.json index 53efa282e9..f0b8ecb21d 100644 --- a/tests/e2e/consensus/nodes/node3/core/crypto.json +++ b/tests/e2e/consensus/nodes/node3/core/crypto.json @@ -291,10 +291,10 @@ "denomination": 1000000000000000000 }, "timeouts": { - "blockPrepareTime": 500, - "blockTime": 500, - "stageTimeout": 500, - "stageTimeoutIncrease": 500, + "blockPrepareTime": 2000, + "blockTime": 2000, + "stageTimeout": 2000, + "stageTimeoutIncrease": 2000, "tolerance": 100 }, "vendorFieldLength": 255 diff --git a/tests/e2e/consensus/nodes/node4/core/crypto.json b/tests/e2e/consensus/nodes/node4/core/crypto.json index 53efa282e9..f0b8ecb21d 100644 --- a/tests/e2e/consensus/nodes/node4/core/crypto.json +++ b/tests/e2e/consensus/nodes/node4/core/crypto.json @@ -291,10 +291,10 @@ "denomination": 1000000000000000000 }, "timeouts": { - "blockPrepareTime": 500, - "blockTime": 500, - "stageTimeout": 500, - "stageTimeoutIncrease": 500, + "blockPrepareTime": 2000, + "blockTime": 2000, + "stageTimeout": 2000, + "stageTimeoutIncrease": 2000, "tolerance": 100 }, "vendorFieldLength": 255