3.1 KiB
blockchain
Моя копия Bitcoin на Go. Упрощена для обучения студентов. Ноль зависимостей — только стандартная библиотека.
Запуск
go run ./cmd/server
Открыть http://localhost:8080. Сеть поднимается сама: 30 узлов, каждый майнит,
шлёт транзакции соседям и спорит за главную ветку. Бот раз в четверть секунды
кидает случайный перевод — смотреть можно сразу, руками ничего слать не надо.
Атакующий узел:
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:
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 — копия честного узла, но твоя. Меняй в ней что угодно.
Остальные узлы крутят оригинальный код и слушают только сообщения.
Своруй монеты. Потрать дважды. Перепиши историю. Если сможешь.