실행 한도를 정해 규칙 실행하기

소스와 입력 파일을 만들고 두 네이티브 평가기를 실행해 성공과 자원 종료를 읽습니다.

자원 한도를 정해 규칙을 실행하고 결과 파일을 검사할 수 있습니다. 이 가이드에서는 결정 평가기로 문자열을, 전체 평가기로 벡터를 반환합니다. 이렇게 정한 한도 묶음을 자원 프로파일이라고 부릅니다.

네이티브 리스펙스와 Python 3을 설치하세요. 새 작업 디렉터리를 쓰고 텍스트 파일은 UTF-8과 LF 줄바꿈으로 저장하세요. 명령이 새 결과 파일을 만들므로 다시 실행할 때는 아직 쓰지 않은 출력 이름을 고르세요.

평가기 고르기

명령언어 프로파일예제
lispex embedlispex/r7rs-rule-embedded-core/1"allow" 또는 "deny" 반환
lispex embed fulllispex/r7rs-rule-current-profile-bounded/1내장 프로시저 205개를 제공하는 프로파일로 벡터 반환

두 평가기는 별도 제품입니다. 준비나 평가를 시작할 때마다 메모리와 자원 사용량 계수기를 가진 새 인스턴스를 만듭니다. 두 제품 모두 외부에서 가져오는 함수가 없는 WASM 모듈을 실행합니다.

1. 소스와 입력 만들기

다음 결정 규칙 전체를 policy.lspx로 저장하세요. 평가기는 입력값을 input이라는 이름에 연결합니다.

LISPEX
(if (< input 15) "allow" "deny")

정수 입력 14를 주면 규칙은 "allow"를 반환합니다. 이 정수를 lispex.embed-value/v1 바이너리 형식으로 저장할 make-input.py를 만드세요.

PYTHON
from pathlib import Path

Path("input.lpxvalue").write_bytes(bytes.fromhex("03 0000000000000002 3134"))
print("input.lpxvalue: 11 bytes (integer 14)")

스크립트를 실행합니다.

SH
python make-input.py

다음 한 줄을 출력하고 input.lpxvalue를 만든 뒤 종료 코드 0으로 끝납니다.

input.lpxvalue: 11 bytes (integer 14)

입력 파일에는 스크립트에 적힌 11바이트 전체가 들어갑니다. 첫 바이트는 정확한 정수를 나타냅니다. 다음 8바이트는 길이 2를, 마지막 2바이트는 UTF-8 텍스트 14를 담습니다. 일반 JSON 파일과는 인코딩이 다릅니다.

2. 준비 한도와 평가 한도 정하기

prepare-limits.json을 만드세요.

JSON
{
  "raw_source_bytes": 4096,
  "prepare_work": 1000000,
  "logical_allocation": 1000000,
  "syntax_depth": 64
}

evaluation-limits.json을 만드세요.

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을 읽고 축약 문법을 핵심 형식으로 바꿉니다. 바이트코드를 만들고 검증한 뒤 선택한 언어 프로파일을 확인합니다. 소스와 의미 규칙, 기능 집합, 바이트코드, 평가기, 준비 한도를 기록합니다.

SH
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은 식별자와 상태를 요약하며 자원 사용량 계수기를 나열하는 출력과는 다릅니다.

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
}

저장한 결과를 확인합니다.

SH
lispex embed verify --artifact result.lpxembed

앞과 같은 JSON을 출력하고 종료 코드 0으로 끝납니다. 파일 구조와 해시와 값, 이식 가능한 핵심 기록, 내장 평가기 식별자를 확인합니다. 이식 가능한 핵심 기록은 한 번의 실행을 입력과 결과에 연결한 기록입니다. verify는 파일을 만들지 않습니다.

4. 전체 평가기 실행하기

다음 전체 소스를 full-policy.lspx로 저장하세요. 전체 언어 프로파일의 vector를 쓰며 같은 입력에 #(14 15)를 반환합니다.

LISPEX
(vector input (+ input 1))

1단계와 2단계의 입력 파일과 한도 파일을 그대로 씁니다.

SH
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로 표시합니다.

JSON
{
  "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
}

결과를 확인한 뒤 기록된 요청을 새 인스턴스에서 재실행합니다.

SH
lispex embed full verify --artifact result.lpxfull
lispex embed full replay --artifact result.lpxfull

각 명령은 앞의 전체 평가기 JSON을 그대로 출력하고 종료 코드 0으로 끝납니다. 생성 파일은 없습니다. 재실행은 기록된 응답과 이식 가능한 핵심 기록을 확인합니다. 전체 평가기 파일에는 소스 식별자와 준비한 프로그램이 들어가므로 원본 소스는 따로 보관하세요.

결정 평가기를 다시 실행할 때는 준비 파일과 입력과 한도를 다시 전달합니다.

SH
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만 바꾼 파일입니다.

JSON
{
  "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
}
SH
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 보고서를 출력합니다. 그중 결과를 구별하는 필드는 다음과 같습니다.

결정 평가기 출력에서 발췌

JSON
{
  "category": "semantic-exhausted",
  "code": "eval_work"
}

전체 평가기 출력에서 발췌

JSON
{
  "category": "exhausted",
  "code": "eval_work"
}

eval_work는 다 쓴 자원의 이름입니다. 작업량 한도가 0이므로 규칙의 값을 만들기 전에 평가가 멈춥니다. 종료 코드 0은 결과 파일을 정상 저장했다는 뜻입니다. 규칙이 끝까지 실행됐는지는 category로 구별하세요.

애플리케이션에서 결과 사용하기

결과 파일은 규칙과 입력, 선택한 한도, 평가기, 이벤트 기록, 결과를 함께 묶습니다. 결정 교환은 서명된 기록 묶음과 수신자 정책을 더합니다. 리스펙스 바우치는 서명된 근거를 인증하고 로컬에서 행동 허용 여부를 판정합니다. 호출 애플리케이션이 네트워크 접근과 업무 행동을 결정합니다.

실행 조건 · 평가기 참조