Files
SwiftChain/SwiftChainCore/Models/AccountManager.swift
Victor Bodinaud 1bbe8234fd Enhance blockchain
2025-05-05 15:16:53 +02:00

67 lines
1.7 KiB
Swift

//
// AccountManager.swift
// SwiftChain
//
// Created by Victor on 27/11/2024.
//
public class AccountManager {
private var accounts: [String: Account] = [:]
private let miningReward = 50
func getAccount(_ address: String) -> Account {
if let account = accounts[address] {
return account
}
let newAccount = Account(id: address, balance: 0)
accounts[address] = newAccount
return newAccount
}
func canProcessTransaction(_ transaction: Transaction) -> Bool {
if transaction.type == "MINING_REWARD" {
return true
}
let senderAccount = getAccount(transaction.sender)
return senderAccount.balance >= transaction.amount
}
func processTransaction(_ transaction: Transaction) -> Bool {
if !canProcessTransaction(transaction) {
return false
}
if transaction.type == "MINING_REWARD" {
let minerAccount = getAccount(transaction.receiver)
minerAccount.balance += miningReward
return true
}
let senderAccount = getAccount(transaction.sender)
let receiverAccount = getAccount(transaction.receiver)
senderAccount.balance -= transaction.amount
receiverAccount.balance += transaction.amount
return true
}
func getBalance(_ address: String) -> Int {
return getAccount(address).balance
}
func processBlock(_ block: Block) -> Bool {
let tempAccounts = accounts
for transaction in block.transactions {
if !processTransaction(transaction) {
accounts = tempAccounts
return false
}
}
return true
}
}