/
rxtress
/
SupplyAI
Обзор
Документация
Войти
/
rxtress
/
SupplyAI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
BlockChain_API.py
122 строки
5 KB
rxtress
Initial commit
26 фев 2025, 13:44
26 фев 2025, 13:44
86b1258
Код
Авторство
О чём код?
from flask import Flask, request, jsonify from flask_cors import CORS import hashlib import json from time import time app = Flask(__name__) CORS(app) class Block: # Инициализируем блок с параметрами def __init__ (self, index, previous_hash, transactions): self.index = index self.timestamp = time() self.transaction = transactions self.previous_hash = previous_hash self.hash = self.calculate_hash() # Генерация хэш блока на основе данных # (индекс, время, транзации, хэш предыдущего блока). # Используем алгоритм sha256 для хэширования def calculate_hash(self): block_string = json.dumps({ "index": self.index, "timestamp": self.timestamp, "transactions": self.transaction, "previous_hash": self.previous_hash }, sort_keys=True).encode() return hashlib.sha256(block_string).hexdigest() class Blockchain(): # Инициализируем блокчейн и создаем первый блок - генезис-блок. # Имеет индекс 0 и путсыми транзакциями. def __init__(self): self.chain = [] self.create_genesis_block() # Создаем первый блок - гензис def create_genesis_block(self): genesis_block = Block(0, "0", []) self.chain.append(genesis_block) # Добавляет новый блок в цепочку, который содержит: индекс, # равный длине цепочки, время, транзации def addBlock(self, transactions): previous_block = self.chain[-1] new_block = Block(len(self.chain), previous_block.hash, transactions) self.chain.append(new_block) # Возвращаем последний блок в цепочке def get_latest_block(self): return self.chain[-1] # Проверяем целостность блока def is_chain_valid(self): for i in range(1, len(self.chain)): current_block = self.chain[i] previous_block = self.chain[i - 1] if current_block.hash != current_block.calculate_hash(): return False if current_block.previous_hash != previous_block.hash: return False return True blockchain = Blockchain() # Добавление транзации в блокчейн @app.route('/add_transaction', methods = ['POST']) def add_transaction(): try: # Получение данных из POST запроса data = request.get_json() # Проверка наличия обязательных полей required_fields = {"Truck", "Warehouse", "Cells", "Product", "Recipient", "Timestamp", "Status"} if not all(field in data for field in required_fields): return jsonify({"message": "Не все обязательные поля заполнены"}), 400 data["Timestamp"] = time() # Добавляем полученную информацию в блокчейн blockchain.addBlock([data]) return jsonify({"message": "Транзация успешно добавлена в блокчейн", "blockchain": [block.__dict__ for block in blockchain.chain]}), 201 except Exception as e: return jsonify({"error": f'Произошла ошибка: {str(e)}'}), 500 # Проверка блокчейна на валидность @app.route('/is_valid', methods = ['GET']) def is_valid(): is_valid = blockchain.is_chain_valid() if is_valid: response = {"message": "Блокчейн валиден."} else: response = {"message": "Блокчейн не валиден."} return jsonify(response), 200 #Получение всей цепочки блоков @app.route("/get_chain", methods = ['GET']) def get_chain(): chain_data = [block.__dict__ for block in blockchain.chain] return jsonify({"length": len(chain_data), "chain": chain_data}), 200 #Запускаем приложение: if __name__ == '__main__': app.run(debug = True) # transactions = { # "Truck": "AB123A58", # "Warehouse": "Склад 1", # "Cells": "123456788990", # "Product": "129837128939812398", # "Recipient": "Компания XYZ", # "Timestamp": "2023-10-05T14:30:00Z", # "LocationFrom": "55.7558, 37.6173", # "LocationTo": "59.9375, 30.3086", # "Status": "Отправлен" # } # blockchain.addBlock([transactions]) #Валидность # print("Блокчейн валиден:", blockchain.is_chain_valid()) # for block in blockchain.chain: # print(f"Блок #{block.index}:") # print("Хэш:", block.hash) # print("Транзакция:", block.transaction) # print("-" * 30)