Files
blockchain/README.md
T

74 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` — копия честного узла, но твоя. Меняй в ней что угодно.
Остальные узлы крутят оригинальный код и слушают только сообщения.
Своруй монеты. Потрать дважды. Перепиши историю. Если сможешь.