Как устроена платформа
Конфиденциальные смарт-контракты¶
В бизнес-задачах возникает требование ограничить использование определенного смарт-контракта и сделать его доступным только для некоторых нод.
Например, организация сотрудничает со множеством контрагентов. Бизнес-логика этого сотрудничества выражается в проведении операций в рамках единого смарт-контракта. Однако некоторые детали вызова и результата исполнения смарт-контракта должны быть доступны только организации и выбранным контрагентам. То есть передаваемые таким смарт-контрактом данные должны быть доступны только некоторым участникам сети. Этому требованию удовлетворяют конфиденциальные смарт-контракты (КСК).
При создании конфиденциального смарт-контракта задается группа нод (политика), которые смогут вызывать этот смарт-контракт и получать его результаты. Для других участников сети вызов контракта и получение его результата будут недоступны. Администратор политики может изменять её состав.
При включении в уже существующую политику нода синхронизирует стейт с другими участниками и получает результаты исполнения контракта в прошлом. Если нода исключается из политики, она перестаёт получать результаты исполнения контракта.
Примечание
Нода может состоять в любом количестве политик.
Создание и использование конфиденциальных смарт-контрактов возможно начиная с релиза 1.13 после активации фичи 1130.
Примечание
Один и тот же смарт-контракт может быть исполнен как конфиденциально, так и публично. Конфиденциальность вызова определяется тем, каким методом была отправлена транзакция вызова контракта – signAndBroadcast (для обычных смарт-контрактов), либо POST /confidential-contracts/call или ConfidentialCall (для конфиденциальных смарт-контрактов).
Важно
Помимо конфиденциальных смарт-контрактов на платформе Waves Enterprise реализована ещё одна технология обмена конфиденциальными данными: доступ к конфиденциальным данным на уровне транзакций. При её использовании доступ к данным по определенным транзакциям получают только пользователи, состоящие в группе доступа к этим данным. Участники одной группы могут обмениваться данными между собой отправляя их в сеть через gRPC или REST API; при этом данные не будут разглашены остальным участникам блокчейна.
Данные конфиденциальных смарт-контрактов¶
Конфиденциальный смарт-контракт принимает и передаёт следующие данные, требующие защиты:
ConfidentialInput – объект, описывающий конфиденциальные входные данные для запуска контракта, а также ключ для формирования коммитмента. ConfidentialInput включает следующие поля:
txId
– идентификатор 104. CallContract транзакции версии 6, к которой относятся входные данные;
commitmentKey
– ключ для формирования коммитмента;
param
– входные данные конфиденциального смарт-контракта, представленные как массив объектов; вносятся при помощи следующих полей:
key
– ключ параметра;
type
– тип данных параметра;
value
– значение параметра.ConfidentialOutput – объект, описывающий конфиденциальные результаты исполнения контракта. ConfidentialOutput включает следующие поля:
txId
– идентификатор исполняемой (executable) транзакции, к которой относятся выходные данные;
entries
– выходные данные конфиденциального смарт-контракта, представленные как массив объектов, каждый из которых включает следующие поля:
key
– ключ;
type
– тип данных;
value
– значение.
Участники политики обмениваются конфиденциальной информацией, которая фиксируется в транзакциях в закрытом виде.
Хранение данных конфиденциальных смарт-контрактов¶
Данные конфиденциального смарт-контракта хранятся вне блокчейна в отдельной базе данных. В самом смарт-контракте доступна только логика и названия ключей.
Контроль целостности данных конфиденциального смарт-контракта и их защита¶
При обмене конфиденциальными данными файлы имеют произвольный размер, их хеш всегда будет уникальным, что обеспечивает их целостность и защиту при обмене в конфиденциальном режиме.
Но при работе со смарт-контрактами есть две категории данных, которые не являются произвольными — это входные и выходные данные. Нередко они включают целочисленные значения, хеш которых можно легко вычислить.
Чтобы обеспечить целостность и защиту входных и выходных данных конфиденциальных смарт-контрактов, реализован дополнительный механизм защиты — криптографический коммитмент, или схема обязательства. Этот механизм включает фазы передачи скрытых данных и раскрытия данных, а также гарантирует связанность данных.
Кроме этого реализован ещё один механизм защиты данных конфиденциальных смарт-контрактов – их нераскрытие майнерам. Нода, назначенная майнером в текущем раунде, создаёт новый блок и, соответственно, узнаёт обо всех новых данных, в том числе о транзакциях исполнения смарт-контрактов, раньше других. Для того чтобы блок, содержащий транзакцию смарт-контракта, попал в блокчейн, необходимо собрать кворум по этой транзакции. В случае конфиденциального смарт-контракта валидация таких транзакций происходит в рамках самой политики. Для этого в политике должно быть не менее трёх нод с ролью contract-validator
. Благодаря этому требованию майнер получает возможность убедиться в том, что кворум для транзакции собран и консенсус достигнут, но сами данные остаются скрыты от майнера.
Создание конфиденциальных смарт-контрактов¶
Для регистрации конфиденциальных смарт-контрактов в блокчейне используется версия 6 транзакции 103. CreateContract.
При регистрации конфиденциального смарт-контракта необходимо задать его ключевые параметры:
задать полю
isConfidential
значениеtrue
, тем самым обозначить новый контракт как конфиденциальный;определить политику, то есть множество адресов нод, которые будут иметь доступ к конфиденциальным данным, в поле
groupParticipants
;определить администраторов политики, то есть множество адресов нод, которые смогут изменять списки участников и администраторов политики (groupParticipants и groupOwners), в поле
groupOwners
.
При создании конфиденциального смарт-контракта необходимо выполнить следующие условия:
Чтобы создать конфиденциальный смарт-контракт (
isConfidential
имеет значениеtrue
), необходимо указать в полеgroupParticipants
три или более ноды с рольюcontract-validator
.Конфиденциальный смарт-контракт (
isConfidential
имеет значениеtrue
) не может работать с нативными токенами, поэтому при создании такого контракта нельзя использовать полеpayments
.При создании конфиденциального смарт-контракта (
isConfidential
имеет значениеtrue
) нельзя передавать параметры в полеparams
.Если в поле
groupParticipants
илиgroupOwners
указаны какие-либо ноды, контракт является конфиденциальным, и полюisConfidential
должно быть присвоено значениеtrue
.Размер списков
groupParticipants
иgroupOwners
не должен превышать 1024 участника.
После того как JSON представление транзакции CreateContract версии 6 сформировано, его необходимо подписать и опубликовать так же, как и для обычного (публичного) смарт-контракта, с помощью одного из следующих методов:
Вызов конфиденциальных смарт-контрактов¶
После того как конфиденциальный смарт-контракт создан и зарегистрирован в блокчейне с помощью транзакции 103. CreateContract как описано выше, участник соответствующей политики (нода, чей адрес указан в поле groupParticipants
транзакции CreateContract) может вызвать этот смарт-контракт, используя транзакцию 104. CallContract с помощью одного из следующих методов:
REST метода POST /confidential-contracts/call
gRPC метода ConfidentialCall
Обновление конфиденциальных смарт-контрактов¶
Для обновления конфиденциальных смарт-контрактов используется версия 5 транзакции 107. UpdateContract.
При обновлении конфиденциального смарт-контракта нода, адрес которой указан в поле groupOwners
, может переопределить политику, а именно:
изменить список адресов нод, которые будут иметь доступ к конфиденциальным данным, в поле
groupParticipants
; после обновления списка в полеgroupParticipants
должно быть указано не менее трёх участников с рольюcontract-validator
.изменить список администраторов политики, то есть нод, которые смогут изменять списки участников и администраторов политики (groupParticipants и groupOwners), в поле
groupOwners
.
Получение результата конфиденциальных смарт-контрактов¶
Получить информацию о транзакции создания или изменения конфиденциального смарт-контракта можно по идентификатору этой транзакции {id}
с помощью метода GET /transactions/info/{id}. Идентификатор транзакции указывается в ответе методов POST /transactions/sign или POST /transactions/signAndBroadcast.
Участник политики может получить результат исполнения конфиденциального смарт-контракта с помощью метода GET /confidential-contracts/tx/{executable-tx-id}.
Примечание
Если пользователь, не входящий в политику, после майнинга транзакции вызова конфиденциального смарт-контракта попробует получить данные контракта методом /contracts/executed-tx-for/$txId, в ответе метода будет отсутствовать results
. Таким образом результат выполнения конфиденциального смарт-контракта скрыт от нод, не входящих в политику.