Доступные объекты

Объекты-хранилища

Объекты, реализующие перенос и сохранение состояния между вызовами методов смарт контракта. Необходимы для сохранение любой информации (состояние счетов пользователя, балансы и другие)

KeyValue

Единственный реальный сохраняемый объект внутри виртуальной машины. Другие сохраняемые объекты зависят от объекта KeyValue, и по сути являются обёртками на его базе. KeyValue - объект, реализующий хранилице ключ-значение. Максимальное количество записей - не ограничено. Максимальная длина ключа и записи - 512 кБ.

new KeyValue(название хранилища)
Аргументы:
  • название хранилища (string) – Название хранилища для загрузки и записи данных
get(ключ)
Аргументы:
  • ключ (string) – Ключ по которому будет выполнятся поиск значения в хранилище
Результат:

Значение. Если не найдено - false

put(ключ, значение)
Аргументы:
  • ключ (string) – Ключ по которому будет выполнена запись в хранилище
  • значение (string) – Строка для записи в хранилище

Пример инициализации и использования методов:

class Test extends Contract {
    init(){
        super.init();
        //Создаём/загружаем хранилище
        this._db = new KeyValue('name');
    }

    putKeyValue(){
        this._db.put('key','value');
    }

    getKeyValue(){
        console.log(this._db.get('key')); //Выведет "value"
    }
}

TypedKeyValue

Аналог KeyValue, сохраняющий типы значений, при условии, что их можно сереализовать.

new TypedKeyValue(название хранилища)
Аргументы:
  • название хранилища (string) – Название хранилища для загрузки и записи данных
get(ключ)
Аргументы:
  • ключ (string) – Ключ по которому будет выполнятся поиск значения в хранилище
Результат:

Значение. Если не найдено - false

put(ключ, значение)
Аргументы:
  • ключ (string) – Ключ по которому будет выполнена запись в хранилище
  • значение (*) – Строка для записи в хранилище

Пример инициализации и использования методов:

class Test extends Contract {
    init(){
        super.init();
        //Создаём/загружаем хранилище
        this._db = new KeyValue('name');
    }

    putKeyValue(){
        this._db.put('number',1337);
        this._db.put('string',"Hello");
    }

    getKeyValue(){
        console.log(typeof this._db.get('number')); //Выведет "number"
        console.log(typeof this._db.get('string')); //Выведет "string"
    }
}

BlockchainArraySafe

Массивоподобная структура на основе KeyValue. Не содержит методы, которые могут привести к проблеме переполнения ОЗУ (join(), slice(), splice() и другие).

new BlockchainArraySafe(название хранилища)
Аргументы:
  • название хранилища (string) – Название хранилища для загрузки и записи данных
class Test extends Contract {
    init(){
        super.init();
        //Создаём/загружаем хранилище
        this._db = new BlockchainArraySafe('name');
    }

    doSomething(){
        this._db[0]=1;
    }

    doSomethingNext(){
        this._db[0]++;
    }

    test(){
        this.doSomething();
        this.doSomethingNext();
        console.log(this._db[0]); //Выведет "2"
    }
}

BlockchainArray

Данный объект является расширением BlockchainArraySafe. Содержит полифиллы методов, которые могут привести к переполнению доступной памяти. Рекомендуется использовать только на небольших массивах данных

new BlockchainArray(название хранилища)
Аргументы:
  • название хранилища (string) – Название хранилища для загрузки и записи данных
class Test extends Contract {
    init(){
        super.init();
        //Создаём/загружаем хранилище
        this._db = new BlockchainArraySafe('name');
    }

    doSomething(){
        this._db.push('Hello');
    }

    doSomethingNext(){
       this._db.push('world!');
    }

    test(){
        this.doSomething();
        this.doSomethingNext();
        console.log(this._db.join(' ')); //Выведет "Hello world!"
    }
}

BlockchainMap

Объекто-подобная структура. Не сереализуема. Сохраняет типы объектов при условии, что их можно сереализовать.

new BlockchainMap(название хранилища)
Аргументы:
  • название хранилища (string) – Название хранилища для загрузки и записи данных
class Test extends Contract {
    init(){
        super.init();
        //Создаём/загружаем хранилище
        this._db = new BlockchainMap('name');
        this._db['hello'] = 'Hello';
        this._db['world'] = 'world!';
        console.log(this._db['hello']+' '+this._db['world']); //Выведет "Hello world!"
    }

}

TokenRegister

Класс, реализующий безопасную логику работы реестра токенов. Является основой для TokenContract и большинства токенов в системе. Содержит основные методы по управлению балансами кошельков, переводами, поддержкой минтинга, сжигания токенов, и учета существующего объема. Работает с числами до 256 знаков.

new TokenRegister(название хранилища)
Аргументы:
  • название хранилища (string) – Название хранилища для загрузки и записи данных
balanceOf(адрес)
Аргументы:
  • адрес (string) – Адрес для проверки баланса
Returns BigNumber:
 

Баланс кошелька

totalSupply()
Returns BigNumber:
 Суммарный объем существующих токенов
setBalance(адрес, баланс)
Аргументы:
  • адрес – Адрес для установки баланса
  • баланс – Баланс, который необходимо установить
withdraw(адрес, сумма)
Аргументы:
  • адрес – Адрес для списания токенов
  • сумма – Сумма списания
minus(адрес, сумма)
Аргументы:
  • адрес – Адрес для списания токенов
  • сумма – Сумма списания
deposit(адрес, сумма)
Аргументы:
  • адрес – Адрес для начисления токенов
  • сумма – Сумма начисления
plus(адрес, сумма)
Аргументы:
  • адрес – Адрес для начисления токенов
  • сумма – Сумма начисления
transfer(адрес отправителя, адрес получателя, сумма)
Аргументы:
  • отправителя (адрес) – Адрес списания токенов
  • получателя (адрес) – Адрес начисления токенов
  • сумма – Сумма перевода
burn(адрес, сумма)
Аргументы:
  • адрес – Адрес для сжигания токенов
  • сумма – Сумма сжигания
mint(адрес, сумма)
Аргументы:
  • адрес – Адрес для выпуска токенов
  • сумма – Сумма выпуска
class Test extends Contract {
    init(){
        super.init();
        this._wallets = new TokensRegister('TKN');
        this._wallets.mint('ME',1000);
        console.log(this._wallets.balanceOf('ME').toFixed()); //1000

        this._wallets.transfer('ME','FRIEND',100);
        console.log(this._wallets.balanceOf('ME').toFixed()); //900
        console.log(this._wallets.balanceOf('FRIEND').toFixed()); //100
    }

}

События

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

Events

Events - глобальный объект, реализующий возможность создания (выпуск) события смарт-контракта. Метод emit испускает событие. Внимание: Мы не рекомендуем использовать объект Events напрямую. Используйте объект Event для создания экземпляра события и его выпуска.

emit(событие, аргументы)
Аргументы:
  • событие (string) – Название события
  • аргументы (array) – До 10 аргументов события

Event

Класс-обёртка, реализующий безопасное и удобное использование объекта Events. Event реализует проверку типов входящих параметров, а также корректно приводит данные к верному формату.

new Event(событие, массив типов аргументов)
Аргументы:
  • событие (string) – Название события
  • массив типов аргументов (array) – До 10 типов аргументов события („number“,“string“,“array“,“object“)
emit(аргументы)
Аргументы:
  • аргументы (array) – До 10 аргументов события, соответствующих ранее указаному типу
class Test extends Contract {
    init(){
        super.init();
        this._helloEvent = new Event('Hello',['string']);
        this._helloEvent.emit('Hello world!');
    }

}

Предупреждение

Event может принимать не более 10 параметров в качестве входных аргументов.

Объекты контрактов

Contract

Объект, рекомендуемый к наследованию всеми контрактами платформы. Объект Contract реализует:

  1. Базовый функционал проверки доступа
  2. Определение состояния запуска (deploy)
  3. Прием и подтверждение оплаты
  4. Взаимодействие с системой межконтрактных взаиморасчётов
  5. Интерфейс внешнего приложения

Внутренний метод init инициализирует внутренний функционал контракта, в том числе определение состояния запуска (deploy)

super.init()

Вызывается единожды в жизни смарт контракта, позволяет определить момент запуска (deploy)

deploy()

Позволяет получить информацию об оплате. см. Pay Object

payProcess()
Returns object:Объект с информацией оплаты

Проверка на то, что вызывающий является владельцем контракта

assertOwnership([msg])
Аргументы:
  • msg (string) – Сообщение на случай ошибки проверки

Проверка на то, что вызывающий является мастер-контрактом

assertMaster([msg])
Аргументы:
  • msg (string) – Сообщение на случай ошибки проверки

Проверка на то, что метод вызван извне (т.е. не из другого контракта)

assertExternal([msg])
Аргументы:
  • msg (string) – Сообщение на случай ошибки проверки

Проверка на то, что метод вызван с передачей информации об оплате

assertPayment([msg])
Аргументы:
  • msg (string) – Сообщение на случай ошибки проверки

Добавление инфо-метода для внешнего приложения

_registerAppInfoMethod(имя метода, типы аргументов)
Аргументы:
  • имя метода (string) – Название метода
  • типы аргументов (array) – Типы принимаемых значений метода

Добавление исполнительного-метода для внешнего приложения

_registerAppDeployMethod(имя метода, типы аргументов)
Аргументы:
  • имя метода (string) – Название метода
  • типы аргументов (array) – Типы принимаемых значений метода

Добавление исходного кода приложения

_registerApp(исходный код[, тип = "web"])
Аргументы:
  • исходный код (string) – Исходный код внешнего приложения или информация для его поиска
  • тип (array) – Тип внешнего приложения

Получение данных внешнего приложеия

getAppData()
Returns string:Сереализованный объект внешнего приложения

Регистрация обратного вызова для межконтрактных-покупок

_registerC2CResultCallback(адрес контракта продавца, функция обратного вызова)
Аргументы:
  • контракта продавца (адрес) – Адрес контракта-продавца, у которого сделан заказ
  • обратного вызова (функция) – Функция, которая будет вызвана когда придёт заказ function(объект результата, номер заказа, адрес продавца)

TokenContract

Объект, рекомендуемый к наследованию всеми контрактами-токенами. Реализует интерфейс контракта стандарта IZ3 Token.

Свойство _wallets - экземпляр объекта TokenRegister

Свойство _TransferEvent - экземпляр объекта Event

Свойство _MintEvent - экземпляр объекта Event

Свойство _BurnEvent - экземпляр объекта Event

super.init(initialEmission[, mintable = false])
Аргументы:
  • initialEmission – Стартовая эмиссия токенов
  • mintable (boolean) – Разрешен ли минтинг в будующем
_getSender()
Результат:Адрес отправителя вызова
balanceOf(address)
Аргументы:
  • address (string) – Адрес владельца токенов
Returns string:

Баланс токенов

totalSupply()
Returns string:Количество всего выпущеных токенов
transfer(to, amount)
Аргументы:
  • to (string) – Получатель токенов
  • amount (string) – Количество токенов
burn(amount)
Аргументы:
  • amount (string) – Количество сжигаемых токенов
mint(amount)
Аргументы:
  • amount (string) – Количество выпускаемых токенов
getActionFee(action, args)
Аргументы:
  • action (string) – Действие
  • args (array) – Аргументы
Returns string:

Стоимость действия

getTransferFee(amount)
Аргументы:
  • amount (string) – Сумма перевода
Returns string:

Стоимость перевода

Коннекторы

Коннекторы EcmaContracts - классы-обёртки, реализующие упрощенный интерфейс взаимодействия с внешними контрактами определённых типов.

ContractConnector

Базовый класс для коннекторов. Позволяет регестрировать методы и их алиасы.

TokenContractConnector

Класс коннектора, реализующий взаимодействие с контрактом-токеном из другого контракта

new TokenContractConnector(address)
Аргументы:
  • address (string) – Адрес контракта, к которому происходит подключение
balanceOf(address)
Аргументы:
  • address (string) – Адрес владельца токенов
Returns string:

Баланс токенов

totalSupply()
Returns string:Количество всего выпущеных токенов
transfer(to, amount)
Аргументы:
  • to (string) – Получатель токенов
  • amount (string) – Количество токенов
burn(amount)
Аргументы:
  • amount (string) – Количество сжигаемых токенов
mint(amount)
Аргументы:
  • amount (string) – Количество выпускаемых токенов
class Test extends Contract {
    init(){
        super.init();
        let tokenContract = new TokenContractConnector(1);
        console.log(tokenContract.balanceOf('INVALID_ADDR')); //Выведет 0
    }

}

SellerContractConnector

Класс коннектора, реализующий взаимодействие с контрактом-продавцом. Контракты-продавцы - это контракты, продающие данные или услугу внутри сети.

getPrice(args)
Аргументы:
  • args (array) – Аргументы заказа
Результат:

Цена заказа

buy(args)
Аргументы:
  • args (array) – Аргументы заказа
Результат:

id заказа

getResult(orderId)
Аргументы:
  • orderId (string) – id заказа
Результат:

Объект содержащий заказ

Require

Require - не относится к стандартным коннекторам, однако реализует сходный функционал. Require позволяет создать экземпляр класса внешнего контракта с произвольными методами и свойствами. Наличие методов и свойств во внешнем классе проверяется во время выполнения кода.

new Require(externalContract)
Аргументы:
  • externalContract (string) – Адрес подключаемого контракта
class Test extends Contract {
    init(){
        super.init();
        let tokenContract = new Require(1);
        console.log(tokenContract.balanceOf('INVALID_ADDR')); //Выведет 0
        console.log(tokenContract.invalidMethod('INVALID_ADDR')); //Бросит исключение
    }

}

Альтернативный синтаксис c методом-фабрикой:

require(externalContract)
Аргументы:
  • externalContract (string) – Адрес подключаемого контракта

Системные классы

assert

Предоставляет функционал проверки каких - либо условий. Невыполнение этих условий ведёт к бросу исключения, и завершению вызова контракта с ошибкой. Состояние контракта откатывается до состояния до вызова.

Предоставляются следующие методы для проверки условий:

  1. Простая проверка на истину
assert(условие[, сообщение])
Аргументы:
  • условие – условие, истина
  • сообщение (string) – сообщени
  1. Проверка на несоответствие типу undefined
defined(условие[, сообщение])
Аргументы:
  • условие – простое условие с использованием условных операторов
  • сообщение (string) – сообщение при неверности условия
  1. Проверяет верность условия a > b
gt(a, b[, сообщение])
Аргументы:
  • a – числовой параметр
  • b – числовой параметр
  • сообщение (string) – сообщение при неверности условия
  1. Проверяет верность условия a < b
lt(a, b[, сообщение])
Аргументы:
  • a – числовой параметр
  • b – числовой параметр
  • сообщение (string) – сообщение при неверности условия
  1. Проверяет истинность условия. Алиас assert.assert
true(условие[, сообщение])
Аргументы:
  • условие – условие
  • сообщение (string) – сообщение при неверности условия
  1. Проверка ложности условия (аналогично «Неверно, что…»)
false(условие[, сообщение])
Аргументы:
  • условие – условие; условие
  • сообщение (string) – сообщение при неверности условия
class Test extends Contract {
    init(){
        super.init();
        assert.gt(100,200,'100 не может быть больше 200');
    }

}

contracts

Предоставляет функционал для управления текущим или взаимодействия с внешними контрактами. Доступны следующие методы:

Вызов метода другого контракта с сохранением изменённого состояния.

callMethodDeploy(адресКонтракта, метод[, аргументы])
Аргументы:
  • адресКонтракта (string) – адрес вызываемого контракта.
  • метод (string) – метод вызываемого контракта.
  • аргументы (array) – передаваемый методу аргументы в виде массива.
Бросает исключение:
 
  • Error1 – „You can’t call method from himself“ - вызов изнутри.
  • Error2 – „External call failed“ - ошибка при вызова метода.
Результат:

результат вызова метода.

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

callDelayedMethodDeploy(адресКонтракта, метод[, аргументы])
Аргументы:
  • адресКонтракта (string) – адрес вызываемого контракта.
  • метод (string) – метод вызываемого контракта.
  • аргументы (array) – передаваемый методу аргументы в виде массива.
Бросает исключение:
 

Error1 – „You can’t call method from himself“ - вызов изнутри.

Запрос свойства другого контракта

getContractProperty(адресКонтракта, свойство)
Аргументы:
  • адресКонтракта (string) – адрес вызываемого контракта.
  • свойство (string) – свойство контракта
Бросает исключение:
 

Error1 – „You can’t call method from himself“ - вызов изнутри.

Результат:

Значение свойства

Метод устарел. Вызов метода другого контракта с откатом изменённого состояния.

callMethodRollback(адресКонтракта, метод[, аргументы])
Аргументы:
  • адресКонтракта (string) – адрес вызываемого контракта.
  • метод (string) – метод вызываемого контракта.
  • аргументы (array) – передаваемый методу аргументы в виде массива.
Бросает исключение:
 

Error1 – „You can’t call method from himself“ - вызов изнутри.

Результат:

результат вызова метода.

getMasterContractAddress()
Результат:Адрес мастер-контракта, определенный в конфигурации
caller()
Результат:адрес вызывающего контракта; false, если вызов внешний
callingIndex()
Результат:номер текущего вызова контракта в цепочке вызовов или 0, если вызов внешний
isChild()

:returns:: true, если контракт был вызван другим контрактом, в ином случае - false

isDeploy()

:returns:: true, если контракт находится в состоянии запуска (deploy), в ином случае - false

isDelayedCall()
Результат:true если вызов выполнен с помощью callDelayedMethodDeploy
getExtendedState()
Результат:Объект добавочного состояния

crypto

Методы работы с криптографией

sha256(data)
Аргументы:
  • data (string) – Данные для хеширования
Результат:

Строковое представление хеш-суммы

md5(data)
Аргументы:
  • data (string) – Данные для хеширования
Результат:

Строковое представление хеш-суммы

Хеширование сконфигурированной функцией

hash(data)
Аргументы:
  • data (string) – Данные для хеширования
Результат:

Строковое представление хеш-суммы

Проверка цифвровой подписи сконфигурированной функцией

verifySign(data, sign, publicKey)
Аргументы:
  • data (string) – Данные для проверки
  • sign (string) – Подпись данных
  • publicKey (string) – Публичный ключ
Returns boolean:
 

true если проверка успешна

global

Другие глобальные методы

Передача класса контракта в виртуальную машину

registerContract(контракт)
Аргументы:
  • data (string) – Данные для проверки
  • sign (string) – Подпись данных
  • publicKey (string) – Публичный ключ
Returns boolean:
 

true если проверка успешна

Вывод данных на экран (при условии включеного вывода)

console.log(данные)
Аргументы:
  • данные (string) – Данные для проверки
getState()
Returns object:Текущий объект state. Рекомендуется использовать вместо global.state