Используйте Native Lispex. Команды предназначены для Bash, в том числе Git Bash в Windows. Начните в новом каталоге и для каждого запуска задавайте новый путь результата.
Подготовьте четыре файла
Ввод [2, false] означает две строки под заголовком раздела. Сохраните правило как house-style.lspx, а ввод как heading.json. Создайте рядом два файла лимитов, приведённых ниже.
(let ((осталось-строк (car input))
(заголовок-главы? (car (cdr input))))
(if (< осталось-строк 2)
"deny"
(if заголовок-главы? "deny" "allow")))[2, false]prepare-limits.json задаёт лимиты подготовки правила.
{
"raw_source_bytes": 4096,
"prepare_work": 1000000,
"logical_allocation": 1000000,
"syntax_depth": 64
}evaluation-limits.json задаёт лимиты вычисления одного входа и записи
его результата.
{
"canonical_input_bytes": 4096,
"eval_work": 1000000,
"logical_allocation": 1000000,
"semantic_frames": 1000,
"traversal_depth": 256,
"output_bytes": 1000000,
"diagnostic_bytes": 1000000,
"transcript_bytes": 1000000,
"transcript_events": 100,
"result_bytes": 1000000
}lispex rule run --source house-style.lspx --input heading.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Все четыре команды завершаются с кодом 0 и выводят JSON. В таблице показаны выбранные поля фактического вывода.
| Команда | Поля вывода |
|---|---|
rule run | "decision": "allow", "category": "semantic-complete" |
rule inspect | "decision": "allow", "executed": false |
rule verify | "status": "verified", "executed": false |
rule replay | "status": "agreed", "fresh_instance": true |
Приложение передаёт число оставшихся строк и признак заголовка главы. allow означает оставить заголовок, а deny означает перенести его на следующую страницу.
| Ввод | Решение | Причина |
|---|---|---|
[2, false] | allow | Под заголовком раздела помещаются две строки |
[1, false] | deny | Под заголовком мало места |
[5, true] | deny | Глава начинается с новой страницы |
Найдите пять сохранённых файлов
rule run атомарно записывает готовый каталог decision.
Храните исходник отдельно вместе с входными файлами.
| Файл | Содержимое |
|---|---|
prepared.lpxembed | Подготовленное правило в установленном исполняемом формате |
canonical-input.lpxvalue | Точное значение запроса в установленном байтовом представлении |
result.lpxembed | Результат и его связь с запросом |
receipt-core.lpxreceipt | Переносимая основная запись, связывающая правило, ввод, лимиты, вычислитель, подробную запись выполнения и результат |
summary.json | Читаемая сводка этих записей |
rule inspect читает сохранённые данные. rule verify проверяет точный состав
файлов, идентификаторы, хеши и связи между записями. rule replay выполняет
запрос в новом экземпляре вычислителя и сравнивает результат и основную запись.
Неверный формат или изменение записей приводит к отказу.
Подпишите решение и аутентифицируйте издателя
В этом локальном упражнении вы создадите пару ключей и политику получателя из только что проверенного решения. Храните закрытый ключ вне каталога решения и системы контроля версий. Чтобы разделить роли издателя и получателя, пройдите рабочее пространство вёрстки. В нём получатель независимо проверяет открытый ключ и допустимое правило.
lispex key generate --out-dir issuer-key
lispex rule issue --dir decision \
--private-key issuer-key/private.pkcs8.der \
--issuer-label "Publisher A" \
--out issuer-envelope.json
lispex rule policy create --dir decision \
--public-key issuer-key/public.spki.der \
--consumer-label "Print 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-key/private.pkcs8.der \
--issuer-label "Publisher A" \
--out heading.lpxdecision
lispex decision inspect --bundle heading.lpxdecision
lispex decision authenticate --bundle heading.lpxdecision \
--policy recipient-policy.json
lispex decision replay --bundle heading.lpxdecision \
--policy recipient-policy.jsonКаждая команда завершается с кодом 0. В таблице перечислены созданные файлы и выбранные поля фактического вывода.
| Команда | Созданный файл или вывод |
|---|---|
key generate | issuer-key/private.pkcs8.der и issuer-key/public.spki.der. "status": "generated" |
rule issue | issuer-envelope.json. "status": "issued" |
rule policy create | recipient-policy.json. стандартный вывод пуст |
rule authenticate | package_integrity.status равно verified. signature_valid и policy_admitted равны true |
decision issue | heading.lpxdecision. "status": "issued" |
decision inspect | "decision": "allow", "executed": false |
decision authenticate | request_binding.status равно exact. signature_valid и policy_admitted равны true |
decision replay | "decision": "allow", "status": "agreed", "fresh_instance": true |
Пакет .lpxdecision содержит семь элементов в установленном байтовом формате.
К пяти сохранённым файлам добавляются манифест с перечнем и метаданными
и контейнер записи, подписанной издателем. Native создаёт, изучает,
аутентифицирует и повторно выполняет пакет. npm изучает и аутентифицирует его
без подключения к сети.
Выберите запись для своей задачи
Аутентификация решения проверяет целостность пакета, подпись издателя, допуск политикой получателя и связь с запросом. Повторное выполнение добавляет новый результат вычисления.
Ваучер Лиспекса использует собственные подписанные подробные записи выполнения и запрос, независимо предоставленный получателем. Локальная проверка допуска сопоставляет текущее выполнение Native с требуемым решением. Приложение проверяет актуальность запроса, предотвращает повторное использование, разрешает деловое действие и выполняет его.
Использование Ваучера Лиспекса · Что делает приложение после решения