Мы готовили нашу платформу оракулов для работы с EOSIO. Не стесняйтесь тестировать и использовать :)

Пройдите это руководство, чтобы создать свой первый оракулированный контракт в тестовой сети EOS.

Мы предпримем следующие шаги:
• Создание учетной записи в тестовой сети
• Создание локального кошелька и импорт учетной записи
• Создание стандартного контракта
• Создание конечной точки взаимодействия с контракт
• Развертывание и тестирование в тестовой сети EOS Jungle

Шаг 0. Подготовка

Убедитесь, что на вашем рабочем компьютере установлено следующее программное обеспечение:
• Расширение для браузера Scatter
• NodeJS at lease v9.xx
• Docker не ниже v17.xx

Прежде чем мы начнем, откройте свой терминал и загрузите необходимый образ из DockerHub:

docker pull eosio/eos-dev:v1.1.1

И установите инструменты разработки как модуль глобального узла:

npm install — global DucaturFw/eosic

Шаг 1. Создайте учетную запись Jungle

Для каждой учетной записи EOS требуется ключ владельца и активный ключ. Ключ владельца обладает сверхспособностями, и поэтому его следует хранить как можно безопаснее. Активный ключ - это ключ повседневного использования. Для вашего собственного хранилища безопасности и храните свои личные ключи в секрете.

В учебном случае мы будем использовать один и тот же ключ для разрешений «Владелец» и «Актив».

Откройте и разблокируйте расширение Scatter в своем браузере. В окне пар ключей нажмите кнопку Создать и следуйте инструкциям по генерации ключей!

NB: не забудьте скопировать и сохранить ключи. В случае утраты возможности восстановить их невозможно!

Теперь, когда у нас есть ключи, давайте перейдем к сайту тестовой сети Jungle. Нажмите кнопку Создать учетную запись.

Примечание. Убедитесь, что вы используете открытые ключи вместо личных. Они начнутся с «EOS…»

Теперь давайте еще раз проверим, что учетная запись была создана. Закройте это окно и на домашней странице нажмите «Информация об учетной записи», введите новое имя учетной записи и нажмите «Получить». Вы должны увидеть информацию о своей недавно созданной учетной записи, к сожалению, с нулевым балансом. Мы исправим это в мгновение ока. (Особое примечание: на момент написания этой статьи тестовая сеть создает учетную запись с тем же владельцем и активным ключом. Дважды проверьте это в информации об учетной записи, и мы будем использовать это при импорте в Scatter).

Давайте добавим в этот аккаунт тестовые токены EOS и Jungle. Нажмите ссылку Faucet, введите имя своей учетной записи и нажмите Отправить монеты.

Шаг 2. Создайте локальный кошелек и импортируйте учетную запись.

Мы будем использовать докер, чтобы изолировать keosd от хост-машины. Сначала давайте рассмотрим текущий процесс. Создайте папку для хранения в ней файла docker-compose.yml:

mkdir ~/eos && cd ~/eos

Мы подготовили для вас суть, которая готова к использованию. Просто скопируйте содержимое и вставьте в docker-compose.yml:

version: "3"

services:
  nodeosd:
    image: eosio/eos-dev
    command: /opt/eosio/bin/nodeosd.sh --data-dir /opt/eosio/bin/data-dir -e --http-alias=nodeosd:8888 --http-alias=127.0.0.1:8888 --http-alias=localhost:8888
    container_name: nodeosd
    hostname: nodeosd
    ports:
      - 8888:8888
      - 9876:9876
    expose:
      - "8888"
    volumes:
      - ./data/nodeos:/opt/eosio/bin/data-dir
    cap_add:
      - IPC_LOCK
    stop_grace_period: 10m

  keosd:
    image: eosio/eos-dev
    command: /opt/eosio/bin/keosd --wallet-dir /opt/eosio/bin/data-dir --http-server-address=127.0.0.1:8900 --http-alias=keosd:8900 --http-alias=localhost:8900
    container_name: keosd
    hostname: keosd
    links:
      - nodeosd
    volumes:
      - ./data/keosd:/opt/eosio/bin/data-dir
    stop_grace_period: 10m

Запустите среду с помощью docker-compose up. Он должен распечатать вывод по умолчанию из nodeos и keosd:

Нас не интересует локальный узел, это просто требование подписать транзакцию, прежде чем мы передадим ее в Jungle Testnet. Для взаимодействия мы будем использовать cleos с множеством параметров. Будет полезно добавить специальный псевдоним:

alias cleos=”docker exec -ti keosd /opt/eosio/bin/cleos -u https://jungle.eos.smartz.io:443/ — wallet-url http://localhost:8900"

Давайте проверим наш псевдоним и соединение:

cleos get info

Он должен предоставить актуальную информацию о блокчейне Джунглей. Отметьте head_block_num, оно должно быть не менее 11 037 948 (или намного больше… в зависимости от периода, в течение которого вы читаете эту статью).

Создать кошелек

Чтобы создать кошелек по умолчанию, просто распечатайте cleos wallet create и сохраните пароль (из выходных данных), чтобы разблокировать его в будущем.

У него пока нет ключей, и нам нужно их импортировать. После предыдущего шага у нас есть открытый и закрытый ключ. Итак, давайте добавим закрытый ключ в наш кошелек с помощью:

cleos wallet import — private-key <PASTE KEY HERE>

Теперь мы готовы подписать транзакцию с нашей учетной записью с разрешениями «Владелец» и «Активные».

Шаг 4. Создайте конечную точку взаимодействия

1. Создайте проект EOSIC.

Откройте терминал и создайте на своем компьютере каталог для учебного проекта:

mkdir ~/ducatur-tutorial

Откройте каталог и инициализируйте эозическую среду по умолчанию:

cd ~/ducatur-tutorial && eosic init && npm install.

EOSIC подготовит для нас файловую структуру и базовую конфигурацию:

- ~/ducatur-tutorial
  — /contracts — folder with source codes of project contracts
  — /migrate — JS files runs immediately after eosic start command
  — /test — Mocha&Chai test files
  — eosic.json — EOSIC configuration
  — config.ini — Local node configuration
  — package.json — NPM dependencies

2. Создать контракт

В корневом каталоге нашего проекта запустите команду: eosic contract priceoraclize.

Команда создает для нас папку и шаблонный файл contract / priceoraclize / priceoraclize.cpp.

Откройте файл .cpp в любом текстовом редакторе и вставьте сгенерированный код.

NB: мы рекомендуем использовать Visual Studio Code с расширением CPP

В результате у нас есть контракт без настраиваемой логики, но он готов потреблять внешние данные для работы.

3. API конечной точки и структуры oraclize

В конце определения контракта добавьте новый метод взаимодействия:

// @abi action
void interact()
{
 // implementation goes here
}

Также добавьте метод как часть ABI внизу контракта:

EOSIO_ABI(priceoraclized, (interact)(setup)(pushprice))

Проверяйте актуальность данных

Мы предотвратим взаимодействие, если данные устарели. Пользовательская структура для хранения ораклизованных данных предоставляет полезный API для проверки актуальности и доступности данных:

data.fresh() — returns true if data is fresh enough, overwise false
data.require_update() — returns true if data is waiting for update, overwise false
data.exists() — returns true if data has pushed early, overwise false
data.value() — returns data if it is available, overwise throws
data.get() — returns raw oraclized object to access timestamps

Давайте добавим несколько ресурсов в метод, чтобы в непредвиденных случаях выдавать ошибку:

// @abi action
void interact(uint64_t amount)
{
 eosio_assert(ethbtc.exists(), “ethbtc data didn’t pushed yet”);
 eosio_assert(ethbtc.fresh(), “ethbtc data has been outdated”);
 // get newest oraclized price
 price current_ethbtc = ethbtc.value();
 eosio_assert(current_ethbtc.value <= 4100000, “Oraclized price lower than predefined 0.041 BTC per ETH threshold”);
 eosio_assert(current_ethbtc.decimals == 8, “Unexpected oraclized price tolerance”);
 if (ethbtc.require_update())
 {
 eosio::print(“Oraclized data is fresh enough, but awaiting for coming update”);
 }
 auto oraclize_record = ethbtc.get();
 // same as ethbtc.fresh()
 eosio_assert(oraclize_record.best_before <= now(), “ethbtc data has been outdated”);
 // same as ethbtc.require_update()
 if (oraclize_record.update_after <= now())
 {
 eosio::print(“Oraclized data is fresh enough, but awaiting for coming update”);
 }
 eosio::print(“\n ETH/BTC price is: “, current_ethbtc.value);
}

Как видите, вы можете выполнять проверки вручную с помощью ethbtc.get (). Best_before или использовать эти данные в пользовательской логике.

NB! ethbtc.get (). Best_before - ‹предопределенное количество блоков данных для удаления› равно моменту появления данных!

Последний шаг - подготовка файлов ABI и WAST путем компиляции исходных файлов. С eosic все максимально просто. Просто запустите eosic compile в корневом каталоге проекта, и пусть eosic выполнит свою работу.

Проверьте результат компиляции с помощью ls -lha ~ / ducatur-tutorial / contract / priceoraclize. Он должен распечатать список файлов, содержащий priceoraclize.abi и priceoraclize.wast:

total 608
drwxr-xr-x 7 aler staff 238B 13 авг 15:04 .
drwxr-xr-x 6 aler staff 204B 15 авг 10:05 ..
-rw-r — r — 1 aler staff 0B 9 авг 18:56 .gitkeep
-rw-r — r — 1 aler staff 2,6K 15 авг 10:00 priceoraclize.abi
-rw-r — r — 1 aler staff 5,9K 15 авг 10:02 priceoraclize.cpp
-rw-r — r — 1 aler staff 5,9K 15 авг 10:02 priceoraclize.hpp
-rw-r — r — 1 aler staff 24K 15 авг 10:00 priceoraclize.wasm
-rw-r — r — 1 aler staff 267K 15 авг 10:00 priceoraclize.wast

Шаг 5. Отправляйтесь в джунгли.

Прежде чем мы установим код и предоставим ABI в сеть, мы должны подготовить нашу учетную запись для его хранения и выполнения. Для этого требуется ОЗУ, ЦП и СЕТЬ.

Проверьте, сколько у него есть: cleos получить аккаунт ‹имя вашего аккаунта›

По умолчанию вновь созданные учетные записи в Jungle уже имеют некоторое пространство RAM и пропускную способность NET и CPU.

memory:
 quota: 202.1 KiB used: 3.365 KiB
net bandwidth:
 staked: 100.0000 EOS (total stake delegated from account to self)
 delegated: 0.0000 EOS (total staked delegated to account from others)
 used: 0 bytes
 available: 18.58 MiB
 limit: 18.58 MiB
cpu bandwidth:
 staked: 100.0000 EOS (total stake delegated from account to self)
 delegated: 0.0000 EOS (total staked delegated to account from others)
 used: 0 us
 available: 3.68 sec
 limit: 3.68 sec
EOS balances:
 liquid: 10000.0000 EOS
 staked: 200.0000 EOS
 unstaking: 0.0000 EOS
 total: 10200.0000 EOS

Купите 1000 КБ ОЗУ с помощью системы cleos buyram - kbytes ‹ваша учетная запись› ‹ваша учетная запись› 1000.

Прежде всего нам нужно скопировать скомпилированные файлы в контейнер докера:

docker cp ~/ducatur-tutorial/contracts/priceoraclize.wast keosd:/contract/priceoraclize.wast
docker cp ~/ducatur-tutorial/contracts/priceoraclize.abi keosd:/contract/priceoraclize.abi

Теперь мы готовы разместить их в сети. Это можно было сделать двумя транзакциями:

  1. Установка кода транзакции: cleos set code ‹ваша учетная запись› /contracts/priceoraclize.wast
  2. Настройка транзакции ABI с помощью: cleos set abi ‹вашей учетной записи› /contracts/priceoraclize.abi

Чтобы завершить настройку нашего контракта, нам нужно настроить разрешение, чтобы позволить контракту выполнять действия от самого себя. Все действия, выполняемые по контракту, выполняются со специальным разрешением eosio.code. Требуется добавить специального подписывающего лица в таблицу разрешений:

{
 “threshold”: 1,
 “keys”: [
 {
 “key”: <YOUR PUBLIC KEY>,
 “weight”: 1
 }
 ],
 “accounts”: [
 {
 “permission”: {
 “actor”: <YOUR ACCOUNT NAME>,
 “permission”: “eosio.code”
 },
 “weight”: 1
 }
 ],
 “waits”: []
}

Обратите внимание на «ключ»: ‹ВАШ ОБЩЕСТВЕННЫЙ КЛЮЧ›, а также на «актер»: ‹ИМЯ ВАШЕЙ УЧЕТНОЙ ЗАПИСИ› . Первое разрешение сообщает о транзакции, подписанной вручную с помощью открытого ключа, а секунда позволяет учетной записи использовать eosio.code для подписи действий.

Замените ‹ВАШ ПУБЛИЧНЫЙ КЛЮЧ› открытым ключом (начиная с EOS…), сгенерированным ранее, и ‹ИМЯ ВАШЕЙ УЧЕТНОЙ ЗАПИСИ› с подключенной учетной записью. Просто удалите все пробелы и окончания строк и запустите следующую команду с этим аргументом:

cleos set account permission <YOUR ACCOUNT NAME> active \
{“threshold”:1,”keys”:[{“key”:”<YOUR PUBLIC KEY>”,”weight”:1}],\
“accounts”:[{“permission”:{“actor”:”<YOUR ACCOUNT NAME>”,”permission”:”eosio.code”},\
“weight”:1}],”waits”:[]} \
owner

NB !: Обратите внимание на последний аргумент владельца. Это родитель для установки разрешения.

Настройка оракулированного контракта
И последнее, но не менее важное, что нужно сделать, это настроить запрос. Сгенерированный контракт имеет для этого метод настройки.

Нажмите действие для контракта, чтобы вызвать метод настройки со следующими аргументами:

cleos push action <YOUR ACCOUNT> setup ‘{“administrator”:”<YOUR ACCOUNT>”,”oracle”:”<ORACLE ACCOUNT NAME>”,”master”:”<MASTER ACCOUNT NAME>”}’ -p <YOU ACCOUNT>@active

Вы должны изменить ‹ВАШУ УЧЕТНУЮ ЗАПИСЬ› на имя контрактной учетной записи и ‹ИМЯ УЧЕТНОЙ ЗАПИСИ ORACLE› на предоставленную учетную запись oracle в шаг генерации, а также ‹ИМЯ ОСНОВНОЙ УЧЕТНОЙ ЗАПИСИ› с предоставленной основной учетной записью.

Выполнить команду и запросить таблицу текущих запросов cleos get table ‹ИМЯ ОСНОВНОЙ УЧЕТНОЙ ЗАПИСИ› ‹ИМЯ ОСНОВНОЙ УЧЕТНОЙ ЗАПИСИ› запрос:

{
 “rows”: [
 {
 “task”: “0x5d4e98a94bf3e6c7d539f4988cc5f7557fe12c8e53ec6a193b7c0ad92dafe188”,
 “contract”: “<YOUR ACCOUNT NAME>”,
 “timestamp”: 1534576794,
 “active”: 1
 }
 ],
 “more”: false
}

Теперь вы полностью настроили контракт, готовый к использованию оракулированных данных о ценах. После нескольких блоков наши оракулы отправят данные в ваш контракт.

Конечно, вам это пригодится. Мы действительно хотим услышать ваши отзывы, поэтому мы можем дать вам несколько мест, где их можно опубликовать:

  1. Наш милый Telegram чат
  2. Наши любимые EOS Github и Backend Github

Если вы хотите, чтобы мы затронули некоторые темы, касающиеся использования Оракулов, не стесняйтесь сообщить нам об этом в нашем чате.