74 lines
3.1 KiB
Markdown
74 lines
3.1 KiB
Markdown
# 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` — копия честного узла, но твоя. Меняй в ней что угодно.
|
||
Остальные узлы крутят оригинальный код и слушают только сообщения.
|
||
|
||
Своруй монеты. Потрать дважды. Перепиши историю. Если сможешь.
|