Подготовка к работе¶
Для начала работы с контейнеризованными смарт-контрактами необходимо настроить возможность их исполнения.
Исполнение смарт-контрактов настраивается в конфигурационном файле ноды. Также существует возможность настроить используемый образ для отдельного смарт-контракта при помощи транзакции 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
}