Подготовка конфигурационных файлов

В конфигурации ноды используются следующие файлы:

  • accounts.conf - конфигурационный файл для генерации аккаунтов.

  • api-key-hash.conf - конфигурационный файл для генерации значений полей api-key-hash и privacy-api-key-hash при выборе авторизации по хешу ключевой строки api-key.

  • node.conf - основной конфигурационный файл ноды, определяющий ее принципы работы и набор опций.

Конфигурационный файл для создания аккаунтов accounts.conf

При указании пути в параметрах файла accounts.conf необходимо использовать символ «прямого слэша» - / как разделитель уровней иерархии директорий. При работе в ОС Linux значение wallet должно соответствовать структуре каталогов операционной системы, например, /home/contract/we/keystore.dat. При настройке ноды не допускается использование кириллических символов при указании путей до рабочей директории, хранилища ключей и т.д.

// accounts.conf listing

accounts-generator {
  waves-crypto = yes
  chain-id = V
  amount = 1
  wallet = ${user.home}"/node/keystore.dat"
  wallet-password = "some string as password"
  reload-node-wallet {
    enabled = false
    url = "http://localhost:6862/utils/reload-wallet"
  }
}

Описание параметров конфигурационного файла представлено ниже.

  • waves-crypto – выбор криптографического алгоритма («yes» - использовать криптографию Waves, «no» - использовать ГОСТ-криптографию);

  • chain-id – идентифицирующий байт сети, значение потребуется дальше для внесения в параметр address-scheme-character в конфигурационный файл ноды;

  • amount – количество генерируемых ключевых пар;

  • wallet – путь до каталога хранения ключей на ноде, значение потребуется дальше для внесения в параметр wallet > file в конфигурационный файл ноды. Для криптографии Waves указывается путь до файла keystore.dat (пример, ${user.home}/we/keystore.dat), для ГОСТ-криптографии - путь до директории (${user.home}/we/keystore/);

  • wallet-password – пароль для доступа к закрытым ключам ноды, значение потребуется дальше для внесения в параметр wallet > password в конфигурационный файл ноды;

  • reload-node-wallet - опция для обновления keyStore ноды без перезапуска приложения, по умолчанию установлено в значение «Выключено» (false). В параметре url указывается путь до метода /utils/reload-wallet REST API ноды.

Конфигурационный файл api-key-hash.conf

Конфигурационный файл api-key-hash.conf нужен только для генерации значений полей api-key-hash и privacy-api-key-hash при выборе авторизации по хешу ключевой строки api-key.

// api-key-hash.conf listing

apikeyhash-generator {
  waves-crypto = yes
  api-key = "some string for api-key"
}

Описание параметров:

  • waves-crypto – выбор криптографического алгоритма («yes» - использовать криптографию Waves, «no» - использовать ГОСТ-криптографию);

  • api-key – ключ, который необходимо придумать. Значение данного ключа потребуется указать в запросах к REST API ноды (подробнее на странице REST API ноды).

Конфигурационный файл ноды node.conf

Если планируется подключение к существующей сети, то для упрощения подключения запросите готовый конфигурационный файл ноды у одного из участников сетевого взаимодействия или у администратора вашей сети. При создании сети с нуля или подключении к сети «Waves Enterprise Mainnet» пример конфигурационного файла ноды можно взять на странице проекта на GitHub. Об изменениях в конфигурационном файле ноды можно почитать в разделе Изменения в конфигурационном файле ноды.

Предупреждение

Для нод версии 1.0 и выше в конфигурационном файле ноды в корневой секции node необходимо наличие следующего параметра:

"features": {
"supported": [100]
}

Данная опция становится активной после достижения суммарного количества блоков из параметров feature-check-blocks-period = 15000 и blocks-for-feature-activation = 10000 (25000 блоков), которые находятся в секции blockchain. При подключении к Mainnet или Partnernet данные параметры не могут быть изменены. Ноды без активации данной опции не смогут подключиться к сети.

Пример конфигурационного файла ноды представлен ниже. В данном примере отключены опции анкоринга, Docker смарт-контрактов и групп доступа к приватным данным. Также установлена авторизация по хешу ключевой строки api-key и криптография Waves. Описание параметров конфигурационного файла ноды вы можете найти тут.

Примечание

Если вы планируете использовать дополнительные опции, установите поле enable выбранной опции в значение yes или true и настройте секцию опции в соответствии с описанием её настройки.

Предупреждение

Заполните ТОЛЬКО те поля, где в качестве значений указано слово /FILL/.

  node {
# Type of cryptography
waves-crypto = yes

# Node owner address
owner-address = " /FILL/ "

# NTP settings
ntp {
  server = "pool.ntp.org"

  # Maximum time without synchronization. Required for PoA consensus.
  fatal-timeout = 5 minutes
}

# Node "home" and data directories to store the state
directory = "/node"
data-directory = "/node/data"

wallet {
  # Path to keystore.
  file = "/node/keystore.dat"

  # Access password
  password = " /FILL/ "
}

# Blockchain settings
blockchain {
  type = CUSTOM
  fees.enabled = false
  consensus {
    type = "poa"
    round-duration = "17s"
    sync-duration = "3s"
    ban-duration-blocks = 100
    warnings-for-ban = 3
    max-bans-percentage = 40
  }
  custom {
    address-scheme-character = "E"
    functionality {
      feature-check-blocks-period = 1500
      blocks-for-feature-activation = 1000
      pre-activated-features = { 2 = 0, 3 = 0, 4 = 0, 5 = 0, 6 = 0, 7 = 0, 9 = 0, 10 = 0, 100 = 0 }
    }

    # Mainnet genesis settings
    genesis {
      average-block-delay: 60s
      initial-base-target: 153722867

      # Filled by GenesisBlockGenerator
      block-timestamp: 1573472578702

      initial-balance: 1625000000000000

      # Filled by GenesisBlockGenerator
      genesis-public-key-base-58: ""

      # Filled by GenesisBlockGenerator
      signature: ""

      transactions = [
          # Initial token distribution:
          # - recipient: target's blockchain address (base58 string)
          # - amount: amount of tokens, multiplied by 10e8 (integer)
          #
          #     Example: { recipient: "3HQSr3VFCiE6JcWwV1yX8xttYbAGKTLV3Gz", amount: 3000000000000000 }
          #
          # Note:
          #   Sum of amounts must be equal to initial-balance above.
          #
        { recipient: " /FILL/ ", amount: 100000000000000 },
        { recipient: " /FILL/ ", amount: 150000000000000 },
        { recipient: " /FILL/ ", amount: 50000000000000 },
      ]
      network-participants = [
          # Initial participants and role distribution
          # - public-key: participant's base58 encoded public key;
          # - roles: list of roles to be granted;
          #
          #     Example: {public-key: "EPxkVA9iQejsjQikovyxkkY8iHnbXsR3wjgkgE7ZW1Tt", roles: [permissioner, miner, connection_manager, contract_developer, issuer]}
          #
          # Note:
          #   There has to be at least one miner, one permissioner and one connection_manager for the network to start correctly.
          #   Participants are granted access to the network via GenesisRegisterNodeTransaction.
          #   Role list could be empty, then given public-key will only be granted access to the network.
          #
        { public-key: " /FILL/ ", roles: [permissioner, miner, connection_manager, contract_developer, issuer]},
        { public-key: " /FILL/ ", roles: [miner]},
        { public-key: " /FILL/ ", roles: []},
      ]
    }
  }
}

# Application logging level. Could be DEBUG | INFO | WARN | ERROR. Default value is INFO.
logging-level = DEBUG

# P2P Network settings
network {
  # Network address
  bind-address = "0.0.0.0"
  # Port number
  port = 6864

  # Peers network addresses and ports
  #   Example: known-peers = ["node-1.com:6864", "node-2.com:6864"]
  known-peers = [  /FILL/  ]

  # Node name to send during handshake. Comment this string out to set random node name.
  #   Example: node-name = "your-we-node-name"
  node-name = " /FILL/ "

  # How long the information about peer stays in database after the last communication with it
  peers-data-residence-time = 2h

  # String with IP address and port to send as external address during handshake. Could be set automatically if uPnP is enabled.
  #   Example: declared-address = "your-node-address.com:6864"
  declared-address = "0.0.0.0:6864"
}

# New blocks generator settings
miner {
  enable = yes
  # Important: use quorum = 0 only for testing purposes, while running a single-node network;
  # In other cases always set quorum > 0
  quorum = 0
  interval-after-last-block-then-generation-is-allowed = 10d
  micro-block-interval = 5s
  min-micro-block-age = 3s
  max-transactions-in-micro-block = 500
  minimal-block-generation-offset = 200ms
}

# Nodes REST API settings
rest-api {
  # Enable/disable REST API
  enable = yes

  # Network address to bind to
  bind-address = "0.0.0.0"

  # Port to listen to REST API requests
  port = 6862

  auth {
    type: "api-key"

    # Hash of API key string
    # You can obtain hashes by running ApiKeyHash generator
    api-key-hash: " /FILL/ "

    # Hash of API key string for PrivacyApi routes
    privacy-api-key-hash: " /FILL/ "
  }
}

#Settings for Privacy Data Exchange
privacy {
  storage {
    enabled = false
    # url = "jdbc:postgresql://postgres:5432/node-1?user=postgres&password=wenterprise"
    # driver = "org.postgresql.Driver"
    # profile = "slick.jdbc.PostgresProfile$"

    # user = "[email protected]&password=wenterprise"
    # password = "wenterprise"

    # connectionPool = HikariCP
    # connectionTimeout = 5000
    # connectionTestQuery = "SELECT 1"
    # queueSize = 10000
    # numThreads = 20
    # schema = "public"
    # migration-dir = "db/migration"
  }
}


# Docker smart contracts settings
docker-engine {
  # Docker smart contracts enabled flag
  enable = no

  # Basic auth credentials for docker host
   #docker-auth {
   #  username = "some user"
   #  password = "some password"
   #}

  # Optional connection string to docker host
   docker-host = "unix:///var/run/docker.sock"

  # Optional string to node REST API if we use remote docker host
  # node-rest-api = "node-0"

  # gRPC server settings for docker contracts with the gRPC API
  grpc-server {
    # gRPC server port
    port = 6865
    # Optional node host
    # host = “192.168.65.2”
  }

  # Execution settings
  execution-limits {
    # Contract execution timeout
    timeout = 10s
    # Memory limit in Megabytes
    memory = 512
    # Memory swap value in Megabytes (see https://docs.docker.com/config/containers/resource_constraints/)
    memory-swap = 0
  }

  # Reuse once created container on subsequent executions
  reuse-containers = yes

  # Remove container with contract after specified duration passed
  remove-container-after = 10m

  # Remote registries auth information
  remote-registries = []

  # Check registry auth on node startup
  check-registry-auth-on-startup = yes

  # Contract execution messages cache settings
  contract-execution-messages-cache {
    # Time to expire for messages in cache
    expire-after = 60m
    # Max number of messages in buffer. When the limit is reached, the node processes all messages in batch
    max-buffer-size = 10
    # Max time for buffer. When time is out, the node processes all messages in batch
    max-buffer-time = 100ms
  }
 }
}