Подготовка к работе

Для начала работы с контейнеризованными смарт-контрактами необходимо настроить возможность их исполнения.

Исполнение смарт-контрактов настраивается в конфигурационном файле ноды. Также существует возможность настроить используемый образ для отдельного смарт-контракта при помощи транзакции 103 CreateContractTransaction.

Настройка исполнения Docker-контрактов в конфигурационном файле ноды

Этот метод позволяет гибко настроить исполнение всех Docker-контрактов для ноды. Для этого в файле node.conf предусмотрен раздел docker-engine, содержащий следующие параметры конфигурации:

  • enable – включение обработки транзакций для Docker-контрактов.

  • integration-tests-mode-enable – режим тестирования Docker-контрактов. При включении этой опции смарт-контракты исполняются локально в контейнере.

  • docker-host – адрес демона docker (опционально).

  • node-rest-api – путь до REST API ноды (опционально).

  • startup-timeout – время, отводимое на создание контейнера gRPC-контракта и его регистрацию в ноде (в секундах).

  • timeout – время, отводимое на выполнение контракта (в секундах).

  • memory – ограничение по памяти для контейнера контракта (в мегабайтах).

  • memory-swap – выделяемый объем виртуальной памяти для контейнера контракта (в мегабайтах).

  • reuse-containers – использование одного контейнера для нескольких контрактов, использующих один и тот же Docker-образ.

  • remove-container-after – промежуток времени бездействия контейнера, по прошествии которого он будет удален.

  • allow-net-access – разрешение доступа к сети.

  • remote-registries – адреса Docker-репозиториев и настройки авторизации к ним.

  • check-registry-auth-on-startup – проверка авторизации для Docker-репозиториев при запуске ноды.

  • default-registry-domain – адрес Docker-репозитория по умолчанию (опционально). Этот параметр используется, если в имени образа контракта не указан репозиторий.

  • contract-execution-messages-cache – настройки кэша со статусами исполнения транзакций по docker контрактам;

  • expire-after – время хранения статуса смарт-контракта.

  • max-buffer-size и max-buffer-time – настройки объема и времени хранения кэша статусов.

  • contract-auth-expires-in – время жизни токена авторизации, используемого смарт-контрактами для вызовов к ноде.

  • grpc-server – секция настроек gRPC сервера для работы Docker-контрактов с gRPC API.

  • host – сетевой адрес ноды (опционально).

  • port – порт gRPC-сервера.

  • akka-http-settings – секция настроек фреймворка Akka HTTP, используемого для gRPC-сервера.

  • remove-container-on-fail – удаление контейнера, если при его старте произошла ошибка.

Блок параметров remote-registries может включать адреса нескольких репозиториев. При использовании этого параметра для доступа к каждому репозиторию необходимо указать его адрес, а также используемое имя пользователя и пароль. Для обращения к конкретному репозиторию из указанного списка адрес репозитория указывается в имени Docker-образа.

Параметр default-registry-domain, используется в случаях, когда в имени Docker-образа не указывается адрес репозитория. Если этот параметр используется, и при этом в имени Docker-образа указан адрес репозитория, смарт-контракт обращается к репозиторию, указанному в имени образа.

Подсказка

Если путь до репозитория указывается при помощи транзакции 103 CreateContractTransaction, этот путь имеет приоритет перед параметрами конфигурации ноды remote-registries и default-registry-domain.

Пример секции docker-engine конфигурационного файла ноды

В приведенном примере рассмотрен вариант настройки исполнения Docker-контрактов с указанием репозитория и его настроек авторизации (заполнен блок remote-registries, параметр default-registry-domain закомментирован). Также используется стандартный демон Docker и REST-API ноды (закомментированы параметры docker-host и node-rest-api). Включено удаление контейнера в случае ошибки при его старте (параметр remove-container-on-fail) для поиска ошибок при работе со смарт-контрактами.

docker-engine {
  enable = yes
  integration-tests-mode-enable = no
  # docker-host = "unix:///var/run/docker.sock"
  # node-rest-api = "https://restapi.clientservice.com/"
  execution-limits {
    startup-timeout = 10s
    timeout = 10s
    memory = 512
    memory-swap = 0
    }
  reuse-containers = yes
  remove-container-after = 10m
  allow-net-access = yes
  remote-registries = [
    {
     domain = "myregistry.com:5000"
     username = "user"
     password = "password"
   }
  ]
  check-registry-auth-on-startup = no
  # default-registry-domain = "registry.wavesenterprise.com"
  contract-execution-messages-cache {
    expire-after = 60m
    max-buffer-size = 10
    max-buffer-time = 100ms
  }
  contract-auth-expires-in = 1m
  grpc-server {
    # host = "192.168.97.3"
    port = 6865
    akka-http-settings {
        akka {
        http.server.idle-timeout = infinite
        http.client.idle-timeout = infinite
        http.host-connection-pool.idle-timeout = infinite
        http.host-connection-pool.client.idle-timeout = infinite
        }
    }
  }
  remove-container-on-fail = yes
}

Настройка образа для отдельного Docker-контракта при помощи транзакции 103 CreateContractTransaction

Транзакция 103 CreateContractTransaction применяется для создания Docker-контракта. При создании этой транзакции существует возможность задать образ для исполнения смарт-контракта, создающегося при помощи этой транзакции. Для этого предусмотрены следующие параметры:

  • image - имя Docker-образа, к которому обращается создаваемый смарт-контракт.

  • image-hash - хэш-сумма используемого Docker-образа.

  • contract-name - название смарт-контракта.

  • password - пароль для доступа к Docker-репозиторию (опционально).

Подсказка

Если в поле image указано только имя образа, смарт-контракт обращается по адресу, указанному в параметрах конфигурации ноды remote-registries или default-registry-domain и находит на этом адресе Docker-образ, указанный в поле image транзакции. Также в этом поле может указываться полный адрес образа: в этом случае для исполнения создаваемого смарт-контракта используется образ, находящийся по этому адресу, а соответствующие параметры конфигурации ноды не применяются.

Пример настройки исполнения Docker-контракта при помощи транзакции 103 CreateContractTransaction

В приведенном примере рассмотрен вариант транзакции, которая создает Docker-контракт из отдельного образа, полный адрес которого указан в поле image. Соответственно, для этого смарт-контракта не будут применятся адреса, указываемые в конфигурационном файле ноды.

{
    "type": 103,
    "id": "ULcq9R7PvUB2yPMrmBdxoTi3bcRmQPT3JDLLLZVj4Ky",
    "sender": "3N3YTj1tNwn8XUJ8ptGKbPuEFNa9GFnhqew",
    "senderPublicKey": "3kW7vy6nPC59BXM67n5N56rhhAv38Dws5skqDsjMVT2M",
    "fee": 500000,
    "timestamp": 1550591678479,
    "proofs": [ "yecRFZm9iBLyDy93bDVaNo1PR5Qkkic7196GAgUt9TNH1cnQphq4yGQQ8Fxj4BYA4TaqYVw5qxtWzGMPQyVeKYv" ],
    "version": 1,
    "image": "customregistry.com:5000/stateful-increment-contract:latest",
    "imageHash": "7d3b915c82930dd79591aab040657338f64e5d8b842abe2d73d5c8f828584b65",
    "contractName": "stateful-increment-contract",
    "params": [],
    "height": 1619
}