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

151 lines
4.1 KiB
Swift

//
// main.swift
// Blockchain
//
// Created by Victor BODINAUD on 27/02/2020.
// Copyright © 2020 Victor BODINAUD. All rights reserved.
//
import Foundation
import SwiftChainCore
let node = Node()
var command: String?
var currentMinerAddress = "MINER1"
var wallets: [String: Wallet] = [:]
print("""
Blockchain CLI - Commandes disponibles:
- createwallet : Créer un nouveau wallet
- listwallet : Liste des wallets
- mine : Miner un nouveau bloc
- send : Envoyer des tokens
- balance : Voir le solde d'une adresse
- pending : Voir les transactions en attente
- validity : Vérifier la validité de la chaîne
- setminer : Changer l'adresse du mineur
- connect <host> : Se connecter à un pair
- peers : Liste des pairs connectés
- mempool : État du mempool
- exit : Quitter
""")
repeat {
print("\nEntrer une commande:")
command = readLine()?.lowercased()
switch command {
case "connect":
print("Entrez l'adresse du pair (ex: 192.168.1.100):")
if let host = readLine() {
node.connectToPeer(host: host)
}
case "peers":
node.listPeers()
case "mine":
if let _ = node.mineBlock(minerAddress: currentMinerAddress) {
print("Bloc miné avec succès. Récompense envoyée à \(currentMinerAddress)")
print("Nouveau solde: \(node.getBalance(currentMinerAddress))")
} else {
print("Échec du minage")
}
case "balance":
print("Entrer l'adresse:")
if let address = readLine() {
let balance = node.getBalance(address)
print("Solde de \(address): \(balance)")
}
case "setminer":
print("Nouvelle adresse du mineur:")
if let address = readLine() {
currentMinerAddress = address
print("Adresse du mineur mise à jour: \(currentMinerAddress)")
}
case "pending":
let transactions = node.getPendingTransactions()
print("Transactions en attente: \(transactions.count)")
for (index, tx) in transactions.enumerated() {
print("""
\(index + 1). De: \(tx.sender)
À: \(tx.receiver)
Montant: \(tx.amount)
Type: \(tx.type)
""")
}
case "validity":
let isValid = node.isChainValid()
print("Chaîne valide: \(isValid)")
case "exit":
print("Au revoir!")
case "createwallet":
let wallet = Wallet()
wallets[wallet.address] = wallet
print("Nouveau wallet créé!")
print("Adresse: \(wallet.address)")
case "listwallet":
print("\nWallets disponibles:")
for (address, _) in wallets {
print("- \(address) (Solde: \(node.getBalance(address)))")
}
case "send":
print("Votre adresse (wallet):")
guard let senderAddress = readLine(),
let wallet = wallets[senderAddress]
else {
print("Wallet non trouvé")
break
}
print("Adresse du destinataire:")
guard let receiverAddress = readLine() else {
print("Adresse du destinataire invalide")
break
}
print("Montant:")
guard let amountStr = readLine(),
let amount = Int(amountStr),
amount > 0
else {
print("Montant invalide")
break
}
let transaction = Transaction(
sender: senderAddress,
receiver: receiverAddress,
amount: amount,
type: "TRANSFER"
)
transaction.senderPublicKey = wallet.getPublicKeyData()
if let signature = wallet.signTransaction(transaction) {
transaction.signature = signature
if node.submitTransaction(transaction) {
print("Transaction signée et propagée au réseau!")
} else {
print("Erreur lors de l'envoi de la transaction")
}
} else {
print("Erreur lors de la signature de la transaction")
}
case "mempool":
node.printMemPoolStatus()
default:
print("Commande inconnue")
}
} while command != "exit"