#include <iostream>
#include <string>
#include <vector>
#include <ctime>
#include <sstream>
// Определение структуры блока
struct Block {
int index;
time_t timestamp;
std::string data;
std::string prevHash;
std::string hash;
Block(int idx, const std::string& dat, const std::string& prev)
: index(idx), data(dat), prevHash(prev) {
timestamp = time(nullptr);
hash = calculateHash();
}
// Функция для вычисления хеша (упрощенная)
std::string calculateHash() {
std::stringstream ss;
ss << index << timestamp << data << prevHash;
// Для реальных систем здесь используется более надежный хеш-алгоритм,
// такой как SHA-256
return std::to_string(std::hash<std::string>{}(ss.str()));
}
};
// Определение структуры блокчейна
class Blockchain {
public:
std::vector<Block> chain;
Blockchain() {
// Создание генезис-блока (первого блока)
chain.push_back(createGenesisBlock());
}
// Создание генезис-блока
Block createGenesisBlock() {
return Block(0, "Genesis Block", "0");
}
// Получение последнего блока в цепочке
Block getLastBlock() const {
return chain.back();
}
// Добавление нового блока в цепочку
void addBlock(const Block& newBlock) {
// Проверка предыдущего хеша
if (newBlock.prevHash == getLastBlock().hash) {
chain.push_back(newBlock);
} else {
std::cerr << "Ошибка: Хеш предыдущего блока не совпадает!" << std::endl;
}
}
private:
// Дополнительный класс для хеширования
std::hash<std::string> hasher;
};
int main() {
Blockchain myChain;
// Добавление новых блоков
myChain.addBlock(Block(1, "Первая транзакция", myChain.getLastBlock().hash));
myChain.addBlock(Block(2, "Вторая транзакция", myChain.getLastBlock().hash));
// Вывод информации о блоках (для примера)
for (const auto& block : myChain.chain) {
std::cout << "Block #" << block.index << ":" << std::endl;
std::cout << " Data: " << block.data << std::endl;
std::cout << " Hash: " << block.hash << std::endl;
std::cout << " Previous Hash: " << block.prevHash << std::endl;
std::cout << std::endl;
}
return 0;
}