blockchain sandbox: UTXO chain, p2p mining, attacker node
This commit is contained in:
@@ -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` — копия честного узла, но твоя. Меняй в ней что угодно.
|
||||
Остальные узлы крутят оригинальный код и слушают только сообщения.
|
||||
|
||||
Своруй монеты. Потрать дважды. Перепиши историю. Если сможешь.
|
||||
Reference in New Issue
Block a user