Песочница

Готовый пример возврата

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

Выберите фиксированный пример возврата

Возьмите готовый пример возврата со страницы загрузок или используйте examples/refund-workspace в репозитории Лиспекса. Архив и каталог репозитория имеют один фиксированный состав. Все ключи и создаваемые материалы держите вне этого неизменяемого каталога.

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

КонтурИсходникФорма входаРезультат
Обмен решениемgenerated/exchange/refund-window.lspxобычные записи JSONallow или deny
Ваучерgenerated/vouch/refund-window-native.lspx.pngзначения проверяемого входаapprove или deny

Результат обмена не является свидетельством Ваучера. Результат Ваучера не является результатом обмена. Контуры используют один деловой пример, но не делят идентичность, квитанцию, политику или полномочия.

Проверьте пример до начала работы

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

SH
mkdir -p ../refund-work
lispex workspace status --dir . --work-dir ../refund-work

workspace status проверяет точный состав примера, прежде чем сообщить о рабочих слотах. Состояние present-unchecked означает только наличие. Оно не означает проверку, доверие, свежесть или разрешение.

Выполните обмен решением в объявленных пределах

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

SH
mkdir -p ../refund-work/exchange
lispex rule run \
  --source ./generated/exchange/refund-window.lspx \
  --input ./generated/exchange/inputs/day-14-unopened.json \
  --prepare-limits ./generated/exchange/prepare-limits.json \
  --eval-limits ./generated/exchange/evaluation-limits.json \
  --out ../refund-work/exchange/decision

lispex rule inspect --dir ../refund-work/exchange/decision
lispex rule verify --dir ../refund-work/exchange/decision
lispex rule replay --dir ../refund-work/exchange/decision

Inspect и verify не выполняют правило. Replay создаёт один новый экземпляр встроенной программы, которая выполняет правило, и требует тот же результат. Переносимый результат сохраняет значение vouch_eligible false.

Подготовьте локального издателя и независимого получателя

Создайте закрытый ключ в каталоге вызывающей стороны вне каталога примера и рабочего корня.

SH
mkdir -p ../refund-issuer ../refund-recipient
lispex key generate --out-dir ../refund-issuer/key
lispex key inspect --public-key ../refund-issuer/key/public.spki.der

Для упражнения на одной машине скопируйте только проверенный открытый SPKI в каталог получателя и снова проверьте скопированные байты.

SH
cp ../refund-issuer/key/public.spki.der \
  ../refund-recipient/reviewed-issuer.spki.der
lispex key inspect \
  --public-key ../refund-recipient/reviewed-issuer.spki.der

Настоящему издателю и получателю нужен отдельно выбранный канал передачи и проверки. Локальная копия помогает пройти пример, но не является процедурой доверия. Не помещайте private.pkcs8.der в каталог примера, рабочий корень, каталог получателя, систему контроля версий или пакет.

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

SH
lispex decision policy create \
  --public-key ../refund-recipient/reviewed-issuer.spki.der \
  --semantic-rule-sha256 14bb6f2e43cee011aedbeafc71d3716789bea8117e8331cd6a7feb1858d7418f \
  --semantic-profile-id lispex/r7rs-rule-embedded-core/1 \
  --engine-artifact-sha256 fa6e52559e1f5a43e50a3b7ac0cc5add6930cff0aed8aaff462cff4609362870 \
  --portable-core-schema lispex.embed-receipt-core/v1 \
  --consumer-label refund-recipient \
  --out ../refund-recipient/decision-policy.json

lispex decision policy check \
  --policy ../refund-recipient/decision-policy.json

Создание политики записывает конфигурацию. Оно не аутентифицирует организацию издателя и не даёт полномочий повторного использования или действия.

Выдайте и аутентифицируйте переносимое решение

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

SH
lispex decision issue \
  --dir ../refund-work/exchange/decision \
  --private-key ../refund-issuer/key/private.pkcs8.der \
  --issuer-label refund-issuer \
  --out ../refund-work/exchange/refund.lpxdecision

Получатель использует свою политику и явно называет полученный пакет.

SH
lispex decision inspect \
  --bundle ../refund-work/exchange/refund.lpxdecision
lispex decision authenticate \
  --bundle ../refund-work/exchange/refund.lpxdecision \
  --policy ../refund-recipient/decision-policy.json
lispex decision replay \
  --bundle ../refund-work/exchange/refund.lpxdecision \
  --policy ../refund-recipient/decision-policy.json

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

Файлы в samples/recipient навсегда помечены sample-do-not-trust. Они подходят только для тренировки команд и не могут стать настоящей политикой получателя или корнем доверия.

Начните отдельный путь Ваучера с изображением Лиспекса

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

Сначала проверьте четыре входа идентичности Ваучера.

SH
mkdir -p ../refund-work/vouch
lispex vouch source-id \
  --source-image ./generated/vouch/refund-window-native.lspx.png
lispex vouch input-id \
  --input ./generated/vouch/inputs/day-14-unopened.checked.json
lispex vouch key-id \
  --public-key ../refund-recipient/reviewed-issuer.spki.der
lispex vouch engine-id \
  --executable /absolute/path/to/lispex

Проверьте точный вывод движка, затем используйте полное напечатанное значение как ENGINE_ID. Политика Ваучера отделена от политики решения, даже если обе ссылаются на один проверенный открытый ключ.

SH
ENGINE_ID="sha256:<reviewed-native-engine-digest>"
lispex vouch policy create \
  --public-key ../refund-recipient/reviewed-issuer.spki.der \
  --engine-sha256 "$ENGINE_ID" \
  --source-image ./generated/vouch/refund-window-native.lspx.png \
  --out ../refund-work/vouch/policy.json
lispex vouch policy check \
  --trust-policy ../refund-work/vouch/policy.json

Выдайте сохранённый учебный вход из точного изображения. Значение --profile csk.checked-profile/v1 называет фиксированный проверяемый профиль, ту меньшую часть языка, внутри которой правило должно оставаться, чтобы вообще участвовать в Ваучере.

SH
ISSUER_KEY_URI="pkcs8-file:///absolute/path/outside-workspace/refund-issuer/key/private.pkcs8.der"
lispex vouch issue \
  --source-image ./generated/vouch/refund-window-native.lspx.png \
  --input ./generated/vouch/inputs/day-14-unopened.checked.json \
  --profile csk.checked-profile/v1 \
  --key-handle "$ISSUER_KEY_URI" \
  --out-dir ../refund-work/vouch/issued \
  --emit-bundle

Сохранённый проверяемый вход содержит только [14, false]. Выданный для него пакет служит только пошаговому примеру. Его нельзя повторно использовать в передаче приложению, потому что он не связывает ID запроса, исполнителя, действие и срок.

Выдайте отдельный пакет для шести значений запроса

Создайте файл вызывающей стороны ровно с этими байтами и одним конечным переводом строки. Значение поля input csk.checked-input/v1 называет фиксированную форму файла проверяемого входа, а поле value несёт сам вход.

JSON
{
  "input": "csk.checked-input/v1",
  "value": [
    14,
    false,
    "request-123",
    "operator-7",
    "refund",
    1785600000
  ]
}

Сохраните его как ../refund-work/app/current-request.checked.json. Выдайте новый пакет, который связывает все шесть значений.

SH
mkdir -p ../refund-work/app
lispex vouch issue \
  --source-image ./generated/vouch/refund-window-native.lspx.png \
  --input ../refund-work/app/current-request.checked.json \
  --profile csk.checked-profile/v1 \
  --key-handle "$ISSUER_KEY_URI" \
  --out-dir ../refund-work/app/current-request-issued \
  --emit-bundle

Правило возврата читает первые два значения. Идентичность входа Ваучера и подписанный контекст всё равно связывают все шесть точных значений. Дополнительная связь не доказывает аутентификацию исполнителя или уникальность запроса. Эти факты устанавливает окружающее приложение из собственного доверенного состояния.

Запустите новую проверку допуска для точного текущего запроса

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

SH
lispex vouch gate \
  --bundle ../refund-work/app/current-request-issued/vouch-input-bundle.json \
  --trust-policy ../refund-work/vouch/policy.json \
  --source-image ./generated/vouch/refund-window-native.lspx.png \
  --input ../refund-work/app/current-request.checked.json \
  --profile csk.checked-profile/v1 \
  --require-decision approve \
  --report-out ../refund-work/app/current-request-gate.json

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

Остановитесь на границе полномочий

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

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

Передача приложению · Использование Ваучера Лиспекса · Изображения Лиспекса