Песочница

Запуск и проверка записей решения

Выполните проверенное правило возврата со строгим JSON, сохраните точную запись решения и разберите границы этой записи.

Один запуск в объявленных пределах, одна сохранённая запись

Выполните правило возврата в точных лимитах и сохраните предмет проверки.

Native-команда lispex rule run готовит проверенное правило, принимает один строгий JSON-ввод и один раз вычисляет его на отдельном движке, который ничего не берёт извне и обязан отчитаться за каждую единицу работы и выделения внутри объявленных вами лимитов. После запуска остаётся каталог решения из пяти членов. Это подготовленный артефакт правила, ввод, записанный в закреплённом виде, чтобы тот же запрос можно было узнать потом, детерминированный результат с точной привязкой запроса, та часть записи, которую можно передать другому, и производная сводка. Исходного текста правила среди них сознательно нет.

  1. 01Проверенное правило
  2. 02Строгий JSON-ввод
  3. 03Решение allow
  4. 04Запись, которую можно проверить

1. Правило

LISPEX
(let ((days (cdr (car input)))
      (opened (cdr (car (cdr input)))))
  (if (< days 15)
      (if opened "deny" "allow")
      "deny"))

2. Ввод

JSON
{
  "days": 14,
  "opened": false
}

3. Один запуск в объявленных пределах

SHELL
lispex rule run \
  --source refund-window.lspx \
  --input day-14-unopened.json \
  --prepare-limits prepare-limits.json \
  --eval-limits evaluation-limits.json \
  --out decision

lispex rule inspect --dir decision
lispex rule verify --dir decision
lispex rule replay --dir decision
4. Решение

Для случая «14-й день, не открыт», который хранится вместе с этой страницей, запуск возвращает allow.

5. Запись, проверенная тремя способами

rule inspect сводит каталог без выполнения. rule verify тоже без выполнения проверяет точный набор членов, идентификаторы, хеши и привязки. rule replay один раз вычисляет записанный запрос в свежем экземпляре движка и требует того же результата. Ни одна из трёх операций не даёт полномочий.

Что связывает передаваемая часть записи

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

Чего запись не устанавливает

Кто выполнил запуск, свежо ли решение, справедлива и корректна ли политика в правиле, не использовано ли то же решение дважды. И никакого разрешения действовать за пределами процесса.

Сначала прочтите решение

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

ВводРешениеПричина
14-й день, товар не открытallowзаказ ещё находится в сроке возврата
15-й день, товар не открытdenyсрок возврата уже истёк
14-й день, товар открытdenyоткрытый товар не допускается

Значение allow или deny для рабочего процесса определяет приложение. Лиспекс возвращает данные, но не оформляет возврат сам.

Зачем нужны четыре команды

КомандаДействие
rule runподготавливает правило, вычисляет строгий JSON с точными лимитами и атомарно записывает каталог решения из пяти файлов
rule inspectчитает и кратко описывает каталог без выполнения
rule verifyбез выполнения проверяет точный набор файлов, идентификаторы, хэши и связи
rule replayодин раз выполняет записанный запрос в свежем экземпляре программы, которая выполняет правило, и требует тот же результат

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

Аутентифицируйте один разрешённый ключ издателя

Native после глубокой проверки каталога может упаковать точные материалы решения и конверт издателя в один файл .lpxdecision ограниченного размера, формат которого задан с точностью до байта. Политику доверия создаёт получатель. Ни пакет, ни конверт не могут сами выбрать доверенный ключ или правило.

lispex rule issue --dir decision \
  --private-key issuer.pkcs8.der \
  --issuer-label "Refund desk A" \
  --out issuer-envelope.json

lispex rule policy create --dir decision \
  --public-key issuer.spki.der \
  --consumer-label "Refund receiver" \
  --out recipient-policy.json

lispex rule authenticate --dir decision \
  --envelope issuer-envelope.json \
  --policy recipient-policy.json

lispex decision issue --dir decision \
  --private-key issuer.pkcs8.der \
  --issuer-label "Refund desk A" \
  --out refund.lpxdecision

lispex decision inspect --bundle refund.lpxdecision
lispex decision authenticate --bundle refund.lpxdecision \
  --policy recipient-policy.json
lispex decision replay --bundle refund.lpxdecision \
  --policy recipient-policy.json

Пакет содержит ровно семь файлов. Это заданный с точностью до байта ввод, манифест, конверт издателя, подготовленный артефакт, переносимое ядро, артефакт результата и производная сводка. В нём нет исходника правила, исходного JSON, закрытого ключа, времени, способа выполнения и токена полномочия. Native может выпускать, проверять, аутентифицировать и повторно выполнять пакет. npm только проверяет и аутентифицирует его без сети, а выпуска и повторного выполнения там нет. Браузер и Playground не экспортируют этот модуль проверки.

Отчёт раздельно показывает целостность пакета, подпись и допуск политикой, точную привязку запроса, свежее повторное выполнение, защиту от повторного использования и полномочие на внешнее действие. rule authenticate не выполняет правило, поэтому повторное выполнение имеет статус not-performed, защита от повторного использования имеет статус not-provided, а внешнее полномочие имеет статус absent. Метка издателя является неподписанным описанием.

Аутентификация решения и Ваучер являются разными процессами

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

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

Где доступна команда

Процесс rule, выпуск решения и повторное выполнение предоставляет продукт Native. npm дополнительно предоставляет только проверочные decision inspect и decision authenticate. Публичная браузерная сборка WebAssembly и Playground не экспортируют эти команды решения.

Режим первого решения в Playground позволяет скачать точную передачу материалов с исходником для выбранного ввода. Распакуйте ZIP в новый каталог и выполните вложенную явную команду, чтобы перейти к этому процессу Native. Этот ZIP является материалом подготовки, а не каталогом решения, переносимым ядром, подписью или полномочием.

Куда дальше

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