Установка и использование платформы

Разработка и применение смарт-контрактов

Определение и общее описание работы смарт-контрактов блокчейн-платформы Waves Enterprise приведено в статье Смарт-контракты.

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

Перед началом разработки смарт-контракта убедитесь, что на вашей машине установлен пакет ПО для контейнеризации приложений Docker. Принципы работы с Docker изложены в официальной документации.

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

Если вы разрабатываете смарт-контракт для работы в частной сети, разверните собственный репозиторий для Docker-образов и укажите его адрес и учетные данные на вашем сервере в блоке remote-registries конфигурационного файла ноды. В этом блоке вы можете указать несколько репозиториев, если вам необходимо определить несколько мест хранения различных смарт-контрактов. Также вы можете загрузить Docker-образ контракта из репозитория, не указанного в конфигурационном файле ноды, при помощи транзакции 103, инициирующей создание смарт-контракта. Подробнее см. раздел Создание и установка смарт-контракта, а также описание транзакции 103.

При работе в Mainnet в конфигурационном файле предустановлен открытый репозиторий Waves Enterprise.

Разработка смарт-контракта

Смарт-контракты блокчейн-платформы Waves Enterprise могут разрабатываться на любом предпочтительном вам языке программирования и реализовывать любые алгоритмы. Готовый код смарт-контракта упаковывается в Docker-образ с используемыми protobuf-файлами (при использовании gRPC) или параметрами авторизации смарт-контракта (при использовании REST API).

Важно

Начиная с релиза 1.12 (после активации фичи 1120) создание и вызов REST контрактов невозможны. В последующих релизах REST контракты невозможно будет исполнить. Рекомендуется использовать gRPC контракты вместо REST контрактов.

Примеры кода смарт-контрактов на Python с применением gRPC и REST API-методов для обмена данными с нодой, а также пошаговое руководство по созданию соответствующих Docker-образов приведены в следующих статьях:

Для разработки, тестирования и развертывания смарт-контрактов в публичных блокчейн сетях Waves Enterprise вы можете использовать инструментарии JS Сontract SDK Toolkit или Java/Kotlin Сontract SDK Toolkit. Они описаны в следующих разделах:

Загрузка смарт-контракта в репозиторий

Если вы работаете в блокчейн-сети Waves Enterprise Mainnet, то чтобы поместить ваш смарт-контракт в открытый репозиторий, свяжитесь со службой технической поддержки Waves Enterprise.

При работе в частной сети, загрузите Docker-образ смарт-контракта в собственный репозиторий:

1. Запустите ваш репозиторий в контейнере:

docker run -d -p 5000:5000 --name my-registry-container my-registry:2

2. Перейдите в директорию, содержащую файлы смарт-контракта и сценарный файл Dockerfile с командами для сборки образа.

3. Соберите образ вашего смарт-контракта:

docker build -t my-contract .

4. Укажите имя образа и адрес его размещения в репозитории:

docker image tag my-contract my-registry:5000/my-contract

5. Запустите созданный вами контейнер репозитория:

docker start my-registry-container

6. Загрузите ваш смарт-контракт в репозиторий:

docker push my-registry:5000/my-contract

7. Получите информацию о смарт-контракте. Для этого выведите информацию о контейнере:

docker image ls|grep 'my-node:5000/my-contract'

Таким образом вы получите идентификатор контейнера. Выведите информацию о нем при помощи команды docker inspect:

docker inspect my-contract-id

Пример ответа:

{
"Id": "sha256:57c2c2d2643da042ef8dd80010632ffdd11e3d2e3f85c20c31dce838073614dd",
"RepoTags": [
    "wenode:latest"
],
"RepoDigests": [],
"Parent": "sha256:d91d2307057bf3bb5bd9d364f16cd3d7eda3b58edf2686e1944bcc7133f07913",
"Comment": "",
"Created": "2019-10-25T14:15:03.856072509Z",
"Container": "",
"ContainerConfig": {
    "Hostname": "",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,

Поле Id – это идентификатор Docker-образа смарт-контракта, который вводится в поле ImageHash транзакции 103 при создании смарт-контракта.

Размещение смарт-контракта в блокчейне

После загрузки смарт-контракта в репозиторий установите его в сети при помощи транзакции 103. Для этого подпишите транзакцию посредством клиента блокчейн-платформы, метода sign REST API или метода JavaScript SDK.

Данные, возвращенные в ответе метода, подаются на вход при публикации транзакции 103.

Ниже приведены примеры подписания и отправки транзакции при помощи методов sign и broadcast. В примерах транзакции подписываются ключом, сохраненным в keystore ноды.

Исполнение смарт-контракта

После размещения смарт-контракта в блокчейне он может быть вызван при помощи транзакции 104 CallContract Transaction.

Эта транзакция также может быть подписана и отправлена в блокчейн посредством клиента блокчейн-платформы, метода sign REST API или метода JavaScript SDK. При подписании транзакции 104 в поле contractId укажите идентификатор транзакции 103 для вызываемого смарт-контракта (поле id ответа метода sign).

Примеры подписания и отправки транзакции при помощи методов sign и broadcast с использованием ключа, сохраненного в keystore ноды: