Giter VIP home page Giter VIP logo

dkg-nodes's Introduction

Dkg nodes

Test

Background

This project continues Implementation of a distributed key generation algorithm (Pedersen 91) in C#. Pedersen 91 algorithm is synchronous by its nature. In dkg-nodes project we provide a wrapper for Pedersen 91 that help to run it in truly asynchronous distributed environment. Implementation includes two types of entities

  • dkg node that is a participant of distributed key generation algorithm. dkg node is REST API client and thus does not require any of its resources to be published

  • dkg service node which orchestrates dkg nodes. dkg service node is REST API server

Starting dkg node in docker container

Parameters

  • <Name> -- dkg node name, optional, defaults to <GUID>
  • <KeyStore> -- KeyStore, that contains Solana Private Key and Address. Optional. If KeyStore is not provided, Solana key pare automatically generated upon node start and saved to appsettings.json Note, that with autogenerated Solana address the node is considered "different" for each run, while explicitly provided KeyStore ensures that the node is considered "the same"
  • <KeyStore password> -- KeyStore password, optional.
  • <Service node URL> -- fully qualified service node URL
  • <Polling interval> -- delay between attempts to get updated algorithm information or command from service node, milliseconds. Optional, defaults to 3000 (3 seconds)

Command

docker run --env=DKG_SERVICE_NODE_URL=<Service node URL> --env=DKG_NODE_NAME=<Name> DKG_NODE_POLLING_INTERVAL=<Polling interval> \
           --env=DKG_SOLANA_KEYSTORE=<KeyStore> --env=DKG_SOLANA_KEYSTORE_PWD=<KeyStore password> \
           --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
           --env=DOTNET_RUNNING_IN_CONTAINER=true --env=DOTNET_VERSION=8.0.4 --env=ASPNET_VERSION=8.0.4 \
           -d ghcr.io/maxirmx/dkg-node:0.5.2

Example

docker run --env=DKG_SERVICE_NODE_URL=http://dkg.samsonov.net:8080 --env=DKG_NODE_NAME=TheNodeAtKreel0 \
           --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
           --env=DOTNET_RUNNING_IN_CONTAINER=true --env=DOTNET_VERSION=8.0.4 --env=ASPNET_VERSION=8.0.4 \
           -d ghcr.io/maxirmx/dkg-node:0.5.2

Using appsettings.json to provide dkg node configuration

Dkg node configuration can be specified in appsettings.json file that has priority over environment variables Node parameters shall be specified in Node section, for example:

  "Node": {
     "Name": "Dkg node",
     "KeyStore": "eyJjcnlwdG8iOnsiY2lwaGVyIjoiYWVzLTEyOC1jdHIiLCJjaXBoZXJ0ZXh0IjoiNDg3NWUwYzFhNmQ5YjY4MDdiYTY2NmY1YTFjYWE2NzgzMDEzZTFmYjUzODRhY2YwZDgzNTI1MWM3MjRlNGEwZGY3MGRjYzcwMTk4ZjA2NjI4MTI3ZDY5OGIzZTdlOTk2MWJmYTg2ZDg2OTg1OGEwMGVhODgzOTM5MjFlNDlkZmFiZjFkN2U1NGNhMjViNWEyMWRmNjVhYjQ2NWQ1YTg5NDc5NjA0Y2ExMjNmZjc0NTgiLCJjaXBoZXJwYXJhbXMiOnsiaXYiOiI5OWY4ZWE2NjU2OWNmNTI1YjE2NGE0MWM4YmIzZGMwYyJ9LCJrZGYiOiJzY3J5cHQiLCJtYWMiOiJmNDdiNjExMDZlMmNiMGNiM2IwZDNiYzQ3OThkMGY2YmIxOTExYmNmYWU1YTNkYTQwM2EwZDc5Yjg2ZTQxYTc4Iiwia2RmcGFyYW1zIjp7Im4iOjI2MjE0NCwiciI6MSwicCI6OCwiZGtsZW4iOjMyLCJzYWx0IjoiMTBmMTc5MGIyZjIwOGM3NTIyZGY1NTMxYTU0MTViYjdhMjNmYmIzMjE0MmY1NzQ3Y2FlM2Y4MDA0NGM0NzQ4OCJ9fSwiaWQiOiIwZjE2M2E2MC1jNjdmLTQxNGYtYjY1OC0xMDAyMjk1MTA0NTkiLCJhZGRyZXNzIjoiNWkzdkJwcDZuMkdSZHdGcnhVNmJ4U3lTWG41S2dyNDIyMkE0eGM1SzcyYUwiLCJ2ZXJzaW9uIjozfQ==",
     "KeyStorePwd": "password",
     "ServiceNodeUrl": "https://localhost:8081",
     "PollingInterval": 5000
  }

Service node front end

We provide a simple GUI to control dkg service node in a separate project.

Starting service node with front-end in a docker container

version: '3.4'

services:
  dkgservicenode:
    container_name: dkg_service_node
    image: ghcr.io/maxirmx/dkg-service-node:latest
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_HTTP_PORTS=8080
      - ASPNETCORE_HTTPS_PORTS=8081
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/etc/dkg/s.pfx
      - ASPNETCORE_Kestrel__Certificates__Default__Password=password
    ports:
      - "8080:8080"
      - "8081:8081"
    volumes:
      - /etc/dkg:/etc/dkg
    depends_on:
      - dkgservice_db

  dkgservice_db:
    container_name: dkgservice_db
    image: postgres:16.1
    restart: unless-stopped
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=dkgservice
    volumes:
      - pgdata:/var/lib/postgresql

  dkgfrontend:
    container_name: dkg_frontend
    image: ghcr.io/maxirmx/dkg-frontend:latest
    environment:
      - NGINX_SSL_CERTIFICATE_PATH=/etc/nginx/certificate/s.crt
      - NGINX_SSL_CERTIFICATE_KEY_PATH=/etc/nginx/certificate/s.key
    ports:
      - "80:80"
      - "443:443"
    volumes:
# Certificate and key for Nginx are expected at
# /etc/nginx/certificate/s.crt
# /etc/nginx/certificate/s.key
      - /etc/nginx/certificate:/etc/nginx/certificate

volumes:
  pgdata: {}

Note that service node setup requires two SSL certificates

For Nginx (front end application) Certificate public and private keys are expected in fixed locations in front-end container - /etc/nginx/certificate/s.crt and /etc/nginx/certificate/s.key

For Kestrel (service node application) PKCS#12 (.pfx) file at configurable location defined by ASPNETCORE_Kestrel__Certificates__Default__Path environment variable Password for PKCS#12 file set at ASPNETCORE_Kestrel__Certificates__Default__Password environment variable

Project financing

Initial development of this project was financed by NarayanaSupramati

dkg-nodes's People

Contributors

maxirmx avatar

Watchers

 avatar

dkg-nodes's Issues

Добавить возможность загружаться из конфиг файла.

Т.е. сейчас первоначальные данные берутся из окружения среды, например environment при запуске в докере, а нужно что бы была возможность запускать привычным образом из папки. Т.е. в appsettings.json предусмотреть секцию для настройки ноды. Сначала проверяется есть ли данные в appsettings.json, если нет, то далее из environments.

Подпись сообщения о регистрации

Это можно делать двумя способами:

  1. На уровне Account.
    Подпись signature=Account.FromSecretKey(secretKey).sign(message) "secretKey" действительно base58
    Проверка PublicKey(address).Verify(message, signature)

  2. На уровне Wallet.
    Подпись (new Wallet(mnemonic)).Sign(message) mnemonic - набор слов типа "ramp marble that cactus fee field shadow brand just father light sport", может быть ещё пароль и bip32/bip39
    Проверка PublicKey(address).Verify(message, signature)

В смысле подписи это, конечно, одно и то же. В Wallet'е Account (или несколько), в Account'е PrivateKey. Разница только в идентификации - mnemonic или SecretKey, который конкатенация PrivateKey и PublicKey

С учётом других пожеланий можно сделать так (например):

  1. В конфигурации храним mnemonic. В отладочной версии без пароля, в рабочей - с паролем.
    Если mnemonic не задан, для отладки генерируем автоматически, не сохраняем.
    Подписываем кошельком bip39. KeyStore не нужен.

Но можно и по другому
2) В конфигурации храним KeyStore. В отладочной версии без пароля, в рабочей - с паролем.
В KeyStore храним secretKey (base58) Если secretKey не задан, для отладки создаём Account, пытаемся сохранить его SecretKey в KeyStore.
Подписываем Account'ом

С точки зрения неискушённого пользователя вариант 1 кажется лучше.

Node selection algorithm

Регистрация

Ноды отправляют данные для регистрации (публичный ключ, идентификатор, …) в следующий раунд . Сервис нода сохраняет/обновляет данные нод – random и номер раунда в таблице nodes_round_history

Выбор нод для текущего раунда
Для выборки необходимо значение LastRoundResult, который берётся из последнего удачного раунда, либо генерить рандом, когда нет данных .
Так же нужны значения рандома нод - node?.IntValue того же предыдущего раунда что и LastRoundResult из таблицы nodes_round_history.

Может быть так, что не будет выбрано ни одной ноды, т.к. нод вообще нет, либо нет нод зарегистрированных в конкретный раунд. В теории раунд должен завершиться неудачно или отменён по таймауту.

Добавить возможность загружаться из конфиг файла

— добавить возможность загружаться из конфиг файла. Т.е. сейчас первоначальные данные берутся из окружения среды, например environment при запуске в докере, а нужно что бы была возможность запускать привычным образом из папки. Т.е. в appsettings.json предусмотреть секцию для настройки ноды. Сначала проверяется есть ли данные в appsettings.json, если нет, то далее из environments.

Получение результата раунда

....можно оставить как есть, только добавить пару строчек для преобразования в публичный ключ и рандом брать по аналогии с нодами.

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.