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

Пример смарт-контракта с использованием REST API

Описание и листинг программы

В разделе рассматривается пример создания и запуска простого смарт-контракта. Контракт выполняет инкремент переданного на вход числа при каждом вызове.

Листинг программы:

import json
import os
import requests
import sys


def find_param_value(params, name):
    for param in params:
        if param['key'] == name: return param['value']
    return None


def print_success(results):
    print(json.dumps(results, separators=(',', ':')))


def print_error(message):
    print(message)
    sys.exit(3)


def get_value(contract_id):
    node = os.environ['NODE_API']
    if not node:
        print_error("Node REST API address is not defined")
    token = os.environ["API_TOKEN"]
    if not token:
        print_error("Node API token is not defined")
    headers = {'X-Contract-Api-Token': token}
    url = '{0}/internal/contracts/{1}/sum'.format(node, contract_id)
    r = requests.get(url, verify=False, timeout=2, headers=headers)
    data = r.json()
    return data['value']


if __name__ == '__main__':
    command = os.environ['COMMAND']
    if command == 'CALL':
        contract_id = json.loads(os.environ['TX'])['contractId']
        value = get_value(contract_id)
        print_success([{
            "key": "sum",
            "type": "integer",
            "value": value + 1}])
    elif command == 'CREATE':
        print_success([{
            "key": "sum",
            "type": "integer",
            "value": 0}])
    else:
        print_error("Unknown command {0}".format(command))

Пошаговое описание работы:

  • Программа ожидает получить структуру данных в формате json с полем params;

  • считывает значение поля а;

  • возвращает результат в виде значения поля «{a}+1» в формате json.

Пример входящих параметров:

"params":[
    {
        "key":"a",
        "type":"integer",
        "value":1
    }
]

Авторизация смарт-контракта c REST API

Для работы с REST API ноды смарт-контракту необходима авторизация. Чтобы смарт-контракт корректно работал с методами API, выполните следующие действия:

  1. В переменных окружения смарт-контракта должны быть определены следующие параметры:

  • NODE_API – URL-адрес к REST API ноды ;

  • API_TOKEN – токен авторизации для смарт-контракта;

  • COMMAND – команды для создания и вызова смарт-контракта;

  • TX – транзакция, необходимая Docker-контракту для работы (103 - 107).

  1. Разработчик Docker-контракта присваивает значение переменной API_TOKEN заголовку запроса X-Contract-Api-Token. В переменную API_TOKEN нода прописывает JWT-токен авторизации при создании и выполнении контракта.

  2. Код контракта должен передавать полученный токен в заголовке запроса (X-Contract-Api-Token) при каждом обращении к API ноды.

Создание смарт-контракта

1. Поместите файл contract.py с кодом в директорию, которая будет содержать файлы вашего смарт-контракта.

2. Создайте shell-скрипт run.sh, который будет запускать код смарт-контракта в контейнере:

#!/bin/sh

python contract.py

Поместите файл run.sh в корневую директорию вашего смарт-контракта.

3. Создайте сценарный файл Dockerfile для сборки и управления запуском смарт-контракта. При разработке на Python основой образа вашего смарт-контракта может служить официальный образ Python на основе Alpine Linux python:alpine3.8.

Пример Dockerfile:

FROM python:alpine3.8
ADD contract.py /
ADD run.sh /
RUN chmod +x run.sh
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"

Поместите Dockerfile в корневую директорию вашего смарт-контракта.

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

Если вы работаете в частной сети, соберите смарт-контракт самостоятельно и разместите его в собственном репозитории.

Смотрите также