✨ Add blockchain sync between nodes
This commit is contained in:
@@ -116,4 +116,62 @@ class Blockchain {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func validateChain(_ newChain: [Block]) -> Bool {
|
||||
// Vérifier que la chaîne commence par notre genesis block
|
||||
guard newChain.first?.hash == chain.first?.hash else {
|
||||
print("Genesis block mismatch")
|
||||
return false
|
||||
}
|
||||
|
||||
// Vérifier chaque bloc
|
||||
for i in 1..<newChain.count {
|
||||
let block = newChain[i]
|
||||
let previousBlock = newChain[i-1]
|
||||
|
||||
// Vérifier le chaînage
|
||||
if block.previousHash != previousBlock.hash {
|
||||
print("Invalid chain at block \(i): incorrect previous hash")
|
||||
return false
|
||||
}
|
||||
|
||||
// Vérifier la validité du bloc
|
||||
if !block.isValid() {
|
||||
print("Invalid chain at block \(i): invalid block hash")
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func replaceChain(_ newChain: [Block]) -> Bool {
|
||||
// Vérifier que la nouvelle chaîne est plus longue
|
||||
guard newChain.count > chain.count else {
|
||||
print("Received chain is not longer than current chain")
|
||||
return false
|
||||
}
|
||||
|
||||
// Vérifier la validité de la nouvelle chaîne
|
||||
guard validateChain(newChain) else {
|
||||
print("Received chain is invalid")
|
||||
return false
|
||||
}
|
||||
|
||||
// Sauvegarder l'ancienne chaîne au cas où
|
||||
let oldChain = chain
|
||||
|
||||
// Essayer de traiter tous les blocs
|
||||
for block in newChain {
|
||||
if !accountManager.processBlock(block) {
|
||||
print("Failed to process transactions in block \(block.index)")
|
||||
chain = oldChain
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
chain = newChain
|
||||
print("Chain replaced successfully")
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user