Giter VIP home page Giter VIP logo

tcp_pow's Introduction

Реализация 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

tcp_pow's People

Contributors

geneva-lake avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.