Использование юботов


Написание кода юбота

Код юбота - это обычный код JavaScript U8, в котором можно определить любые функции, а затем использовать их в качестве точек входа для юбота.

async function getRandom(max) {
    let result = ...
    return result;
}

Можно использовать обычные доступные JavaScript объекты, а также через require некоторые дополнительные специфичные для U8 объекты из U8 jslib. Однако код юбота выполняется в контролируемой (изолированной) среде, поэтому доступна только ограниченная часть U8 jslib:

  • crypto.js
  • FastPriorityQueue.js
  • timers.js
  • sorted.js
  • tools.js
  • exceptions.js
  • big.js
  • contract.js
  • biserializable.js
  • defaultbimapper.js
  • bossbimapper.js
  • transactionpack.js
  • quantiser.js
  • boss.js
  • roles.js
  • constraint.js
  • permissions.js
  • errors.js
  • config.js
  • contractdelta.js
  • extendedsignature.js
  • exceptions.js
  • yaml.js
  • keyrecord.js
  • deltas.js
  • buffer.js
  • esprima.js

Есть также некоторые функции, которые доступны исключительно для кода юбота. Эти функции подробно описаны в разделе внутреннего API.

Хранилище исполнителей (кортеж)

Это распределенное хранилище, в которое каждый (для каждого исполнителя) экземпляр юбота может записывать свои данные. Это можно рассматривать как распределенное хранилище кортежа данных, где каждый элемент кортежа хранит данные ключ-значение одного экземпляра юбота (не конфликтуя с другими экземплярами). Таких хранилищ может быть несколько, и они идентифицируются по названию. По умолчанию хранилище называется default.

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

Пример работы с хранилищем:

async function calculateAverage() {

    // получение случайного числа
    let rnd = Math.random();
    // добавление в сохраняемый кортеж
    await writeMultiStorage({random: rnd});

    // получение полного кортежа
    let records = await getMultiStorage();

    // вычисление среднего значения
    let reduce = 0.0;
    for (let r of records) {
        reduce += r.random
    }

    // обратите внимание, что количество записей находится между значениями размера пула и его кворума
    reduce /= records.length
    ...
}

Хранилище пула

Хранилище с привязкой к пулу - это то место, где все экземпляры юбота в пуле пытаются записать одни и те же данные, которые проверяются согласованно. Таких хранилищ может быть несколько, и они идентифицируются по названию. По умолчанию хранилище называется default.

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

Пример записи в хранилище:

async function calculateAverage() {
    ...
    await writeSingleStorage({reduce : reduce});
    return "ok";
}

Пример чтения из хранилища ранее записанных данных (может быть выполнено в другом облачном методе):

async function getAverage() {
    return (await getSingleStorage()).reduce;
}

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

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

async function operateContract() {

    let contract = createPoolContract();
    contract.seal();
    ...
}