151 lines
4.1 KiB
Swift
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"
|