{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Практическое задание: Создание и проверка простого блокчейна на Python\n",
        "\n",
        "## Цель задания\n",
        "Изучить базовые принципы блокчейна:\n",
        "- структура блока\n",
        "- хэширование\n",
        "- связь блоков через `previous_hash`\n",
        "- проверка целостности цепи\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Инструкция\n",
        "Реализуйте классы `Block` и `Blockchain` в ячейках ниже.\n",
        "Не изменяйте имена классов и методов.\n",
        "\n",
        "### Что должно быть реализовано\n",
        "**Класс `Block`:** `index`, `timestamp`, `data`, `previous_hash`, `hash`, метод `calculate_hash()`\n",
        "\n",
        "**Класс `Blockchain`:** `create_genesis_block()`, `get_latest_block()`, `add_block(data)`, `is_chain_valid()`, `tamper_block(index, new_data)`\n",
        "\n",
        "### Требования\n",
        "- Использовать `hashlib.sha256`\n",
        "- Хэш вычислять из строки: `index + timestamp + data + previous_hash`\n",
        "- После изменения блока через `tamper_block()` метод `is_chain_valid()` должен возвращать `False`\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "import hashlib\n",
        "import datetime as date\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Реализация класса Block"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "class Block:\n",
        "    def __init__(self, index, timestamp, data, previous_hash):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n",
        "\n",
        "    def calculate_hash(self):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Реализация класса Blockchain"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "class Blockchain:\n",
        "    def __init__(self):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n",
        "\n",
        "    def create_genesis_block(self):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n",
        "\n",
        "    def get_latest_block(self):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n",
        "\n",
        "    def add_block(self, data):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n",
        "\n",
        "    def is_chain_valid(self):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n",
        "\n",
        "    def tamper_block(self, index, new_data):\n",
        "        # YOUR CODE HERE\n",
        "        raise NotImplementedError()\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Локальная проверка (не удалять)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "bc = Blockchain()\n",
        "bc.add_block(\"Transaction 1\")\n",
        "bc.add_block(\"Transaction 2\")\n",
        "bc.add_block(\"Transaction 3\")\n",
        "\n",
        "print(\"Количество блоков:\", len(bc.chain))\n",
        "print(\"Цепочка корректна:\", bc.is_chain_valid())\n",
        "\n",
        "bc.tamper_block(2, \"FAKE DATA\")\n",
        "print(\"После подмены данных цепочка корректна:\", bc.is_chain_valid())\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Что сдавать\n",
        "Сохраните notebook и отправьте его на платформу Coursera.\n",
        "Автопроверка проверит правильность реализации классов и методов."
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.11"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}