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

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

  • 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 = no
  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.3 и выше в конфигурационном файле ноды в корневой секции 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

 features.supported = [100]

 # 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 = "postgres@postgres&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"

   # 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

   # Allows net access for all contracts
   allow-net-access = yes

   # 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
   }
 }
}