blockchain sandbox: UTXO chain, p2p mining, attacker node

This commit is contained in:
2026-07-26 20:37:26 +03:00
commit 7ce39c8964
18 changed files with 2536 additions and 0 deletions
+73
View File
@@ -0,0 +1,73 @@
# 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` — копия честного узла, но твоя. Меняй в ней что угодно.
Остальные узлы крутят оригинальный код и слушают только сообщения.
Своруй монеты. Потрать дважды. Перепиши историю. Если сможешь.