Смарт-контракты RIDE

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

Для аккаунта — проверяться будут все транзакции, исходящие с данного адреса. Аккаунт с опубликованным скриптом называется Смарт-аккаунт. Для набора токенов — проверяться будут все транзакции с данным набором токенов. Набор токенов с опубликованным скриптом называется Смарт-ассет. На одном аккаунте может быть только 1 скрипт. Соответственно, любой установленный скрипт заменяет предыдущий, в т.ч. «скрипт по умолчанию».

RIDE

Для создания скрипта в блокчейне Waves Enterprise используется язык RIDE (о языке RIDE можно почитать на портале WAVES). Скрипты, написанные на RIDE, при проверке условий используют следующие данные:

  • Данные исходящей транзакции.

  • Данные аккаунта, от имени которого осуществляется транзакции.

  • Данные о балансе третьих аккаунтов.

  • Данные о высоте блокчейна.

Принцип работы скрипта это pattern matching, т.е. сопоставление с образцом. В скрипте указываются типы транзакций и проверки для них с условиями, при которых возможно исполнение соответствующих транзакций. Также доступны возможности:

  • запретить транзакцию независимо от условий,

  • разрешить независимо от условий.

Работа с разрешениями и запретами по типам транзакций возможна как указанием конкретных типов транзакций, так и механикой «всё, кроме». Скрипт устанавливается транзакцией типа SetScript, соответственно, её разрешение, запрещение или проверку на выполнение условий надо явно указывать.

Важно

Скрипт не изменяет транзакцию, только проверяет соответствие условиям.

Сложность скриптов

RIDE не является Тьюринг полным языком, что накладывает ограничения на доступную сложность логики. Вычислительная сложность принудительно ограничена сверху для гарантии производительности сети. Для сложных бизнес-процессов, механика которых не укладывается в один скрипт, возможна комбинация из нескольких скриптов (на нескольких адресах, соответственно), либо комбинации скриптов на наборе токенов и на адресе. Мы активно развиваем возможности RIDE, в ближайшее время в языке появятся вложенные функции, что расширит его возможности по сложности реализуемых задач.

Подписи и скрипт «по умолчанию»

Каждая транзакция в блокчейне обладает криптографическим доказательством целостности, основанном на подписи транзакции закрытым ключом отправителя. Это также гарантирует неотчуждаемость авторства транзакций. Для лучшего понимания механизма работы представьте, что «по умолчанию» на каждом адресе установлен скрипт, который проверяет единственное условие для каждой исходящей транзакции — принадлежность подписи адресу отправителя.

Пример кода скрипта, установленного «по умолчанию»:

sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk)

Механика скриптов расширяет возможности по проверке подписи. Транзакция может быть подписана несколькими пользователями или не от имени того адреса, от которого отправлена. Это необходимо, т.к. контракт проверяет только транзакции, исходящие со своего адреса. Соответственно, пользователь формирует транзакцию от имени контракта, подписывает её своей подписью и она успешно проходит проверку скриптом.

Важно

Если в вашем скрипте явно не указана проверка подписи, то она не осуществляется. Соответственно, при ручном формировании тела транзакции, возможно отправлять транзакции от имени адреса со скриптом, с подписью другого адреса.

Данные на аккаунте

На адресах в блокчейне Waves Enterprise можно хранить данные в формате ключ-значение. Данные, хранящиеся на адресе, доступны для просмотра по запросу вида вернуть данные с адреса по ключу. Данные размещаются на адресе при отправке транзакции с данными. Т.к. скрипты на RIDE stateless, транзакции с даннными формируют обновляемое хранилище данные, к которому обращается скрипт. Настройка проверки подписи на смарт-аккаунте позволяет нескольким пользователям совместно работать с данными на смарт-аккаунте. Например, со статусами движения документа.

Важно

Ключи уникальны для адреса. Одному ключу на адресе соответствует только одно значение. При публикации нового значения для существующего ключа, оно будет перезаписано. Историю и автора изменений можно отследить в блокчейне.