Files
SwiftChain/Sources/Blockchain/Models/Blockchain.swift
vbodinaud 33d508fb44 update packages
add some docs
2021-03-04 15:45:45 +01:00

89 lines
2.7 KiB
Swift

//
// Blockchain.swift
// Blockchain
//
// Created by Victor BODINAUD on 27/02/2020.
// Copyright © 2020 Victor BODINAUD. All rights reserved.
//
import Foundation
class Blockchain {
var chain = [Block]()
/**
Initialize the first block of the blockchain.
- Parameters:
- data: The datas of the block
*/
func createGenesisBlock(data: String) {
let genesisBlock = Block()
genesisBlock.data = data
genesisBlock.previousHash = "0000"
genesisBlock.index = 0
genesisBlock.nonce = 0
genesisBlock.timestamp = genesisBlock.generateTimestamp()
genesisBlock.hash = genesisBlock.generateHash()
chain.append(genesisBlock)
print("Genesis block created -- hash: \(genesisBlock.hash)")
}
/**
Initialize a new block of the blockchain.
- Parameters:
- data: The datas of the block
*/
func createBlock(data: String) {
let newBlock = Block()
newBlock.data = data
newBlock.previousHash = chain.last!.hash
newBlock.index = chain.count
newBlock.nonce = 0
newBlock.timestamp = newBlock.generateTimestamp()
newBlock.hash = newBlock.generateHash()
chain.append(newBlock)
print("-- Block \(newBlock.index) created --\n hash: \(newBlock.hash)\n previous hash: \(newBlock.previousHash)\n data: \(newBlock.data)")
}
/**
Insert a corrupted block in the blockhain.
(for testing purpose)
*/
func insertCorruptedBlock() {
let newCorruptedBlock = Block()
newCorruptedBlock.data = "Corrupted block"
newCorruptedBlock.previousHash = "1234567890"
newCorruptedBlock.index = chain.count
newCorruptedBlock.nonce = 0
newCorruptedBlock.timestamp = newCorruptedBlock.generateTimestamp()
newCorruptedBlock.hash = newCorruptedBlock.generateHash()
chain.append(newCorruptedBlock)
print("-- Corrupted block \(newCorruptedBlock.index) created --\n hash: \(newCorruptedBlock.hash)\n previous hash: \(newCorruptedBlock.previousHash)\n data: \(newCorruptedBlock.data)")
}
/**
Check validity of the blockchain.
*/
func chainValidity() {
var isChainValid = true
var corruptedBlock = Block()
for i in 1...chain.count-1 {
if chain[i].previousHash != chain[i-1].hash {
isChainValid = false
corruptedBlock = chain[i]
}
}
print("Chain is valid : \(isChainValid)")
if !isChainValid {
print("Corrupted block is : \(corruptedBlock.index)")
}
}
}