# blockchain Моя копия Bitcoin на Go. Упрощена для обучения студентов. Ноль зависимостей — только стандартная библиотека. ## Запуск ```sh go run ./cmd/server ``` Открыть `http://localhost:8080`. Сеть поднимается сама: 30 узлов, каждый майнит, шлёт транзакции соседям и спорит за главную ветку. Бот раз в четверть секунды кидает случайный перевод — смотреть можно сразу, руками ничего слать не надо. Атакующий узел: ```sh go run ./cmd/attack ``` ## Что в браузере Граф сети, рост цепи, форки и реорги в реальном времени. События идут потоком через SSE — страница не опрашивает сервер, сервер сам шлёт. ## API | Метод | Ручка | Что делает | |---|---|---| | POST | `/tx` | перевод, тело `{from, to, amount}` | | GET | `/balance?addr=` | баланс адреса | | GET | `/chain?node=N` | цепь глазами узла N | | GET | `/nodes` | все узлы: баланс, длина цепи, мемпул | | GET | `/topology` | кто с кем связан | | GET | `/events` | поток событий, SSE | ## Настройка Всё в `config/config.go`: ```go Difficulty: 4 // нулей в хеше. +1 = в 16 раз дольше блок MiningReward: 10 // награда за блок NumNodes: 30 // узлов в сети HashDelay: 5ms // пауза между попытками. медленнее = реже блоки OutboundPeers: 3 // связей на узел. в Bitcoin 8 ``` Время блока считается само: `HashDelay × 16^Difficulty / NumNodes`. Сетевая задержка ставится в 1/300 от него — чтобы форки случались, но не постоянно. Хочешь чаще форки — подними `NetDelay` или урежь `OutboundPeers`. Хочешь спокойную сеть — наоборот. ## Устройство ``` chain/ блоки, UTXO, кошельки, мемпул, подписи ed25519 p2p/ узел, пиры, майнер, обмен сообщениями, события attacker/ форк честного узла — правь и ломай cmd/server сеть + HTTP API + веб cmd/attack запуск с атакующим config/ все параметры web/ интерфейс, один файл ``` ## Атака `attacker/node.go` — копия честного узла, но твоя. Меняй в ней что угодно. Остальные узлы крутят оригинальный код и слушают только сообщения. Своруй монеты. Потрать дважды. Перепиши историю. Если сможешь.