Реализация tcp сервера и клиента с proof of work
Для сборки требутся go 1.18 или более поздние версии
Для выбора подходящего было проанализировано несколько алгоритмов.
hashcash - трудно адаптировать сложность, поддаётся asic оптимизации
cuckoo cycle - поддаётся asic оптимизации, к тому же нет нормальной реализации на go
merkle trees - нет реализации не только на go, не нашёл и на других языках в
качестве pow алгоритма
equihash и его подвид zelhash - подходящие алгоритмы, но нет нормальной реализации на go
Было принято решение в качестве алгоритма pow использовать vdf функции.
Они отлично подходят для данной задачи, можно легко регулировать сложность,
а также есть реализация на go.
В качестве библиотеки для tcp сервера (и клиента) был выбран gnet.
Он реализует неблокирующий ввод-вывод, что очень
подходит для систем с потенциально высокой нагрузкой.
Для данной задачи был разработан простой бинарный протокол.
*0 2 6
*+-----------+-----------------------+
*| type | body len |
*+-----------+-----------+-----------+
*| |
*+ +
*| body bytes |
*+ +
*| ... ... |
*+------------------------------------+
Сначала передаются 2 байта содержащие тип сообщения, затем 4 байта - размер тела
сообщения, затем, соответственно, само тело сообщения.
Для передачи задания для pow в теле сначала передаются 4 байта, содержащие сложность,
затем 32 байта seed.
Для сборки необходимо запустить следующие комманды из корневой папки проекта:
go mod tidy
go build -o server ./server
go build -o client ./client
Предусмотрены конфигурационные файлы.
Так же есть докерфайлы для клиента и сервера.
Их можно собрать следущим образом:
docker build -f Dockerfile.Server -t pow_server --progress=plain .
docker build -f Dockerfile.Client -t pow_client --progress=plain .
и запустить
docker run -p 9005:9005 -it pow_server
docker run -it --network=host pow_client
geneva-lake / tcp_pow Goto Github PK
View Code? Open in Web Editor NEWtcp server and client with pow check