Вы можете выполнить правило с явными лимитами ресурсов и проверить файл результата. В этом руководстве вычислитель решений возвращает строку, а полный вычислитель — вектор. Такой набор лимитов называется профилем ресурсов.
Установите Native Лиспекс и Python 3. Работайте в новом каталоге. Сохраняйте текстовые файлы в UTF-8 с переводами строк LF. Команды создают новые файлы, поэтому при повторении выбирайте свободные имена результатов.
Выберите вычислитель
| Команда | Профиль языка | Пример |
|---|---|---|
lispex embed | lispex/r7rs-rule-embedded-core/1 | Возвращает "allow" или "deny" |
lispex embed full | lispex/r7rs-rule-current-profile-bounded/1 | Возвращает вектор в профиле со всеми 205 примитивными процедурами |
Это два отдельных продукта. Каждая подготовка или вычисление использует новый экземпляр со своей памятью и счётчиками расхода ресурсов. Оба выполняют модули WASM без импортов.
1. Создайте исходник и ввод
Сохраните полное правило решения в policy.lspx. Вычислитель связывает входное
значение с именем input.
(if (< input 15) "allow" "deny")Для целого числа 14 правило возвращает "allow". Создайте make-input.py,
чтобы записать это число в двоичном формате lispex.embed-value/v1.
from pathlib import Path
Path("input.lpxvalue").write_bytes(bytes.fromhex("03 0000000000000002 3134"))
print("input.lpxvalue: 11 bytes (integer 14)")Запустите скрипт.
python make-input.pyОн печатает следующую строку, создаёт input.lpxvalue и завершается с кодом 0.
input.lpxvalue: 11 bytes (integer 14)Файл содержит все 11 байтов, указанных в скрипте. Первый байт обозначает точное
целое число. Следующие восемь задают длину 2, а последние два содержат текст
14 в UTF-8. Обычный файл JSON использует другую кодировку.
2. Задайте лимиты подготовки и вычисления
Создайте 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
}prepare_work ограничивает работу подготовки, а eval_work — работу вычисления.
logical_allocation считает выделение в единицах ресурсной модели вычислителя.
Это отдельный лимит от памяти WASM. Остальные поля ограничивают размер
ввода, глубину, вывод, диагностику, запись событий и результат.
Запись событий сохраняет порядок событий вычисления.
3. Выполните правило решения
Подготовка читает UTF-8, разворачивает сокращённые формы, создаёт и проверяет байткод. Затем она проверяет выбранный профиль языка. Она записывает исходник, семантическое правило, набор возможностей, байткод, вычислитель и лимиты подготовки.
lispex embed prepare --source policy.lspx --limits prepare-limits.json --out policy.lpxembed
lispex embed evaluate --prepared policy.lpxembed --input input.lpxvalue --limits evaluation-limits.json --out result.lpxembed
lispex embed inspect --artifact result.lpxembedВсе три команды завершаются с кодом 0. prepare создаёт policy.lpxembed,
а evaluate — result.lpxembed. Обе команды ничего не печатают. inspect
не создаёт файлов и печатает следующий JSON. Здесь он отформатирован для чтения.
JSON содержит идентификаторы вычислителя, правила, ввода и статус завершения.
semantic-complete означает, что правило выполнено. inspect показывает статус
и идентификаторы; закодированное возвращённое значение хранится в result.lpxembed.
Хеши ниже относятся к точным байтам примера, включая последний LF в исходнике.
Файл исхода хранит лимиты подготовки и вычисления раздельно. JSON проверки содержит идентификаторы и статус, а не перечень счётчиков расхода ресурсов.
{
"abi_id": "lispex.embed-wasm-abi/v1",
"bytecode_sha256": "4d3707ba9a0b64f5165ebd0996dd8b2fa5bf4c958f7afbc9062203f46f8eb068",
"canonical_input_sha256": "4892c71b4803d6f2057433116b87927c62eed7754252cd5048a8663903cf6e2c",
"canonical_source_sha256": "a8cc61bac9abf9d6f8647a529402d348a4d045f1006f3b4c67f21adefa33743e",
"category": "semantic-complete",
"code": "complete",
"engine_artifact_sha256": "fa6e52559e1f5a43e50a3b7ac0cc5add6930cff0aed8aaff462cff4609362870",
"feature_set_sha256": "c7ac2d3037b43dd90889467aabdcd2d3c061559bde12bb8330d878886c5ab429",
"model_id": "lispex-vm-meter/1",
"operation": "evaluate",
"payload_bytes": "23",
"portable": true,
"portable_core_bytes": "1900",
"portable_core_sha256": "9949d0c240c3e641cbee652c7d05d32612414759e77bbf3d5d91ff63b2bdfd5f",
"receipt_schema_id": "lispex.embed-receipt-core/v1",
"schema": "lispex.embed-artifact-inspection/v1",
"semantic_profile_id": "lispex/r7rs-rule-embedded-core/1",
"semantic_rule_sha256": "2419de25f5fcec98e74d9119c28687ab5b440be322502f8f7b24cec19424dc22",
"submission_sha256": "aa9f358366f58ab0fbc36c93c974b27ce908a10eb0898ad9313e756072d6552f",
"submitted_source_sha256": "30a60354485c671766d6a7196b3418529304f3feae6ca040999715fd90f9f847",
"vouch_eligible": false
}Проверьте сохранённый результат.
lispex embed verify --artifact result.lpxembedКоманда печатает тот же JSON и завершается с кодом 0. Она проверяет структуру,
хеши, значения и переносимую основную запись, а также идентификатор встроенного
вычислителя. Переносимая основная запись связывает один запуск с его вводом и
исходом. verify не создаёт файлов.
4. Запустите полный вычислитель
Сохраните полный исходник в full-policy.lspx. Он использует vector из полного
профиля языка и возвращает #(14 15) для того же ввода.
(vector input (+ input 1))Используйте файлы ввода и лимитов из шагов 1 и 2.
lispex embed full prepare --source full-policy.lspx --limits prepare-limits.json --out policy.lpxfull
lispex embed full evaluate --prepared policy.lpxfull --input input.lpxvalue --limits evaluation-limits.json --out result.lpxfull
lispex embed full inspect --artifact result.lpxfullВсе три команды завершаются с кодом 0. Первые две ничего не печатают и создают
policy.lpxfull и result.lpxfull. inspect не создаёт файлов и печатает JSON,
отформатированный ниже. Полный вычислитель обозначает успешный исход как complete.
{
"abi_id": "lispex.embed-wasm-abi/v1",
"category": "complete",
"code": "complete",
"component_id": "lispex-evaluator/rust-vm-current-profile/1",
"engine_artifact_sha256": "dd4cde2976d825ae99b542d308d87489ac96848e0710329dbb9173664d8c5ad8",
"fallback_count": 0,
"kind": "evaluate",
"model_id": "lispex-full-vm-meter/1",
"portable_core_assigned": true,
"portable_core_bytes": "1932",
"portable_core_sha256": "1201ac2939e678db7926d160deb4ccb4a566a5d74b15fe19076bdd48bd88e730",
"receipt_schema_id": "lispex.embed-receipt-core/v1",
"replayable": true,
"request_sha256": "05d3c7bb9ee45728e8dcd6f84e974e76d225c3cd1c77799332fd8d12ff25bcb3",
"schema": "lispex.full-embed-artifact/v0",
"semantic_profile_id": "lispex/r7rs-rule-current-profile-bounded/1",
"source_retained": false,
"value_codec_id": "lispex.embed-value/v1",
"vouch_eligible": false
}Проверьте результат, затем повторите записанный запрос в новом экземпляре.
lispex embed full verify --artifact result.lpxfull
lispex embed full replay --artifact result.lpxfullКаждая команда печатает тот же JSON полного вычислителя, завершается с кодом 0
и не создаёт файлов. Повторный запуск проверяет записанный ответ и переносимую
основную запись. Храните исходник отдельно: файл полного вычислителя сохраняет
его идентификатор и подготовленную программу.
Для повторного вычисления решения снова передайте подготовленный файл, ввод и лимиты.
lispex embed evaluate --prepared policy.lpxembed --input input.lpxvalue --limits evaluation-limits.json --out rerun.lpxembedКоманда ничего не печатает, создаёт rerun.lpxembed и завершается с кодом 0.
Каталог решения с командой повторного выполнения описан в
руководстве по решающим правилам.
5. Прочитайте остановку по лимиту
Создайте low-work-limits.json с полным содержимым ниже.
По сравнению с шагом 2 изменяется только eval_work.
{
"canonical_input_bytes": 4096,
"eval_work": 0,
"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 embed evaluate --prepared policy.lpxembed --input input.lpxvalue --limits low-work-limits.json --out exhausted.lpxembed
lispex embed inspect --artifact exhausted.lpxembed
lispex embed full evaluate --prepared policy.lpxfull --input input.lpxvalue --limits low-work-limits.json --out exhausted.lpxfull
lispex embed full inspect --artifact exhausted.lpxfullВсе четыре команды завершаются с кодом 0. Каждая команда evaluate ничего
не печатает и создаёт указанный файл exhausted. Каждая команда inspect
печатает отчёт JSON. Ниже показаны поля, определяющие исход в этих отчётах.
Выбранные поля вывода вычислителя решений
{
"category": "semantic-exhausted",
"code": "eval_work"
}Выбранные поля вывода полного вычислителя
{
"category": "exhausted",
"code": "eval_work"
}eval_work указывает исчерпанный ресурс. Нулевой лимит работы останавливает
вычисление до получения значения правила. Код завершения 0 означает, что
файл исхода успешно записан. Поле category показывает, завершилось ли правило.
Используйте результат в приложении
Файл исхода связывает правило, ввод, выбранные лимиты, вычислитель, запись событий и результат. Обмен решениями добавляет контейнеры подписанных записей и политику получателя. Ваучер Лиспекса аутентифицирует подписанные данные и проверяет локальное условие допуска действия. Вызывающее приложение решает вопросы сетевого доступа и деловых действий.