Files
blockchain/README.md
T

3.1 KiB
Raw Blame History

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 — копия честного узла, но твоя. Меняй в ней что угодно. Остальные узлы крутят оригинальный код и слушают только сообщения.

Своруй монеты. Потрать дважды. Перепиши историю. Если сможешь.