-
Notifications
You must be signed in to change notification settings - Fork 285
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(core-transaction-pool): collator service
In attempt to simplify pool's connection and reduce its responsibilities: * Created separate validator (and factory) to validate transactions against temp wallet repository. * Moved block candidate transaction selection out of pool's connection into separate collator class that is using validator. * Removed candidate transaction selection functions from pool's connection. * Almost removed validation from pool's connection * Get transactions method that is used by controller now only reads transactions from memory instead of creating temporary wallet and performing validation.
- Loading branch information
Showing
15 changed files
with
147 additions
and
152 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
packages/core-kernel/src/contracts/state/transaction-validator.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
import { Interfaces } from "@arkecosystem/crypto"; | ||
|
||
export interface TransactionValidator { | ||
validate(transaction: Interfaces.ITransaction): Promise<void>; | ||
} | ||
|
||
export type TransactionValidatorFactory = () => TransactionValidator; |
5 changes: 5 additions & 0 deletions
5
packages/core-kernel/src/contracts/transaction-pool/collator.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
import { Interfaces } from "@arkecosystem/crypto"; | ||
|
||
export interface Collator { | ||
getBlockCandidateTransactions(): Promise<Interfaces.ITransaction[]>; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,3 @@ | ||
export * from "./connection"; | ||
export * from "./processor"; | ||
export * from "./collator"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import { Container, Contracts } from "@arkecosystem/core-kernel"; | ||
import { Handlers } from "@arkecosystem/core-transactions"; | ||
import { Interfaces, Transactions } from "@arkecosystem/crypto"; | ||
import { strictEqual } from "assert"; | ||
|
||
@Container.injectable() | ||
export class TransactionValidator implements Contracts.State.TransactionValidator { | ||
@Container.inject(Container.Identifiers.TransactionHandlerRegistry) | ||
@Container.tagged("state", "temp") | ||
private readonly handlerRegistry!: Handlers.Registry; | ||
|
||
public async validate(transaction: Interfaces.ITransaction): Promise<void> { | ||
const deserialized: Interfaces.ITransaction = Transactions.TransactionFactory.fromBytes(transaction.serialized); | ||
strictEqual(transaction.id, deserialized.id); | ||
const handler = await this.handlerRegistry.getActivatedHandlerForData(transaction.data); | ||
await handler.apply(transaction); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
import { Container, Contracts } from "@arkecosystem/core-kernel"; | ||
import { Interfaces, Managers } from "@arkecosystem/crypto"; | ||
|
||
import { Connection } from "./connection"; | ||
import { Memory } from "./memory"; | ||
|
||
@Container.injectable() | ||
export class Collator implements Contracts.TransactionPool.Collator { | ||
@Container.inject(Container.Identifiers.TransactionValidatorFactory) | ||
private readonly createTransactionValidator!: Contracts.State.TransactionValidatorFactory; | ||
|
||
@Container.inject(Container.Identifiers.BlockchainService) | ||
private readonly blockchain!: Contracts.Blockchain.Blockchain; | ||
|
||
@Container.inject(Container.Identifiers.TransactionPoolService) | ||
private readonly pool!: Connection; | ||
|
||
@Container.inject(Container.Identifiers.TransactionPoolMemory) | ||
private readonly memory!: Memory; | ||
|
||
@Container.inject(Container.Identifiers.LogService) | ||
private readonly logger!: Contracts.Kernel.Logger; | ||
|
||
public async getBlockCandidateTransactions(): Promise<Interfaces.ITransaction[]> { | ||
let bytesLeft = this.pool.options.maxTransactionBytes ? this.pool.options.maxTransactionBytes : null; | ||
|
||
const height = this.blockchain.getLastBlock().data.height; | ||
const milestone = Managers.configManager.getMilestone(height); | ||
const transactions: Interfaces.ITransaction[] = []; | ||
const validator = this.createTransactionValidator(); | ||
|
||
for (const transaction of this.memory.allSortedByFee().slice()) { | ||
if (transactions.length === milestone.block.maxTransactions) { | ||
break; | ||
} | ||
|
||
try { | ||
await validator.validate(transaction); | ||
if (bytesLeft !== null) { | ||
bytesLeft -= JSON.stringify(transaction.data).length; | ||
if (bytesLeft < 0) { | ||
break; | ||
} | ||
} | ||
transactions.push(transaction); | ||
} catch (error) { | ||
this.pool.removeTransactionById(transaction.id!); | ||
this.logger.error( | ||
`[Pool] Removed ${transaction.id} before forging because it is no longer valid: ${error.message}`, | ||
); | ||
} | ||
} | ||
|
||
return transactions; | ||
} | ||
} |
Oops, something went wrong.