Files
SwiftChain/SwiftChain/Models/MemPool.swift
Victor Bodinaud 1943a478fa Add p2p
2024-11-27 20:37:38 +01:00

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
}
}