Как устроена платформа

Конфиденциальные смарт-контракты

В бизнес-задачах возникает требование ограничить использование определенного смарт-контракта и сделать его доступным только для некоторых нод.

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

При создании конфиденциального смарт-контракта задается группа нод (политика), которые смогут вызывать этот смарт-контракт и получать его результаты. Для других участников сети вызов контракта и получение его результата будут недоступны. Администратор политики может изменять её состав.

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

Примечание

Нода может состоять в любом количестве политик.

Создание и использование конфиденциальных смарт-контрактов возможно начиная с релиза 1.13 после активации фичи 1130.

Примечание

Один и тот же смарт-контракт может быть исполнен как конфиденциально, так и публично. Конфиденциальность вызова определяется тем, каким методом была отправлена транзакция вызова контракта – signAndBroadcast (для обычных смарт-контрактов), либо POST /confidential-contracts/call или ConfidentialCall (для конфиденциальных смарт-контрактов).

Данные конфиденциальных смарт-контрактов

Конфиденциальный смарт-контракт принимает и передаёт следующие данные, требующие защиты:

  • 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 с помощью одного из следующих методов:

Обновление конфиденциальных смарт-контрактов

Для обновления конфиденциальных смарт-контрактов используется версия 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. Таким образом результат выполнения конфиденциального смарт-контракта скрыт от нод, не входящих в политику.