90 lines
2.4 KiB
Swift
90 lines
2.4 KiB
Swift
//
|
|
// MemPool.swift
|
|
// SwiftChain
|
|
//
|
|
// Created by Victor on 27/11/2024.
|
|
//
|
|
|
|
class MemPool {
|
|
private var pendingTransactions: [Transaction] = []
|
|
private let maxTransactionsPerBlock: Int = 10
|
|
private let accountManager: AccountManager
|
|
|
|
init(accountManager: AccountManager) {
|
|
self.accountManager = accountManager
|
|
}
|
|
|
|
/**
|
|
Ajoute une transaction au mempool après validation
|
|
*/
|
|
func addTransaction(_ transaction: Transaction) -> Bool {
|
|
if validateTransaction(transaction) {
|
|
pendingTransactions.append(transaction)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
/**
|
|
Valide une transaction avant de l'ajouter au pool
|
|
*/
|
|
private func validateTransaction(_ transaction: Transaction) -> Bool {
|
|
// Vérifications basiques
|
|
if transaction.amount <= 0 {
|
|
return false
|
|
}
|
|
|
|
// Pas besoin de vérifier la signature pour les récompenses de minage
|
|
if transaction.type == "MINING_REWARD" {
|
|
return true
|
|
}
|
|
|
|
// Vérifier la signature
|
|
if !transaction.isSignatureValid() {
|
|
return false
|
|
}
|
|
|
|
// Vérifier le solde
|
|
return accountManager.canProcessTransaction(transaction)
|
|
}
|
|
|
|
/**
|
|
Récupère un lot de transactions prêtes pour le prochain bloc
|
|
*/
|
|
func getTransactionsForBlock() -> [Transaction] {
|
|
var validTransactions: [Transaction] = []
|
|
var remainingTransactions: [Transaction] = []
|
|
|
|
for transaction in pendingTransactions {
|
|
if validTransactions.count >= maxTransactionsPerBlock {
|
|
break
|
|
}
|
|
|
|
if validateTransaction(transaction) {
|
|
validTransactions.append(transaction)
|
|
} else {
|
|
remainingTransactions.append(transaction)
|
|
}
|
|
}
|
|
|
|
// Update pending transactions, removing the selected ones
|
|
pendingTransactions = remainingTransactions + pendingTransactions.dropFirst(validTransactions.count)
|
|
|
|
return validTransactions
|
|
}
|
|
|
|
/**
|
|
Vérifie si il y a des transactions en attente
|
|
*/
|
|
var hasPendingTransactions: Bool {
|
|
return !pendingTransactions.isEmpty
|
|
}
|
|
|
|
/**
|
|
Retourne toutes les transactions en attente sans les retirer
|
|
*/
|
|
func getAllPendingTransactions() -> [Transaction] {
|
|
return pendingTransactions
|
|
}
|
|
}
|