PCL 정책 구조
컴플라이언스 규칙의 3계층 구조: PolicyTemplate → UnitPolicy → PolicyConfig.
PCL 정책은 재사용성과 명확성을 위해 3계층 구조를 사용합니다. PolicyTemplate은 규칙 유형의 청사진입니다. UnitPolicy는 템플릿을 구체적인 파라미터와 (선택적으로) 함수 selector와 결합한 인스턴스입니다. PolicyConfig는 UnitPolicy를 묶어 전역 또는 특정 컨트랙트에 적용합니다. (참고: 이전 초안에서는 이 중간 계층이 PolicyRef였으나, 현재 정식 명칭은 UnitPolicy입니다.)
PolicyTemplate
PolicyTemplate은 가장 기본적인 구성 요소입니다. 특정 유형의 컴플라이언스 검사에 대한 로직과 필요한 입력을 정의합니다. 특정 값을 포함하지 않고, 값에 대한 스키마만 정의합니다.template_id: 고유 식별자, 일반적으로PolicyTypeenum의 문자열 표현 (예:"DENYLIST_POLICY").name: 사람이 읽을 수 있는 이름 (예:"Denylist").description: 정책이 수행하는 작업에 대한 간략한 설명.param_schema: 정책에 필요한 파라미터의 구조와 유형을 정의하는 JSON 스키마 (바이트 배열). 예를 들어, denylist 스키마는{"denylist": ["address"]}.
템플릿은
PolicyAdmin이 등록하고 관리합니다.UnitPolicy
UnitPolicy는 구체적인 파라미터가 결합된 PolicyTemplate의 인스턴스입니다. 엔진이 실제로 평가하는 활성 규칙입니다.template_id: 사용할PolicyTemplate의 ID.parameters: 참조된 템플릿의param_schema를 따르는 JSON 객체 (바이트 배열, 종종 클라이언트가 base64 인코딩). denylist의 경우{"denylist": ["maroo1..."]}.selector: (선택) 4바이트 함수 selector. 지정 시 해당 selector를 호출하는 EVM 트랜잭션에만 UnitPolicy가 적용됩니다. 같은 컨트랙트가 함수별로 다른 규칙을 적용할 수 있게 합니다.
명명 참고: 이전 초안에서는 이를
PolicyRef라고 불렀습니다. 현재 정식 명칭은 UnitPolicy입니다. 전환기 동안 일부 코드 경로와 식별자에 여전히 옛 이름이 노출될 수 있으며, 동일 개념으로 취급하세요.PolicyConfig
PolicyConfig는 함께 적용되는 UnitPolicy의 모음입니다. 두 가지 유형이 있습니다.GlobalPolicyConfig:PclAnteDecorator를 통해 전체 마루 네트워크의 모든 트랜잭션에 적용되는 UnitPolicy 목록.PolicyAdmin이 관리.ContractPolicyConfig: 특정 스마트 컨트랙트 주소와 연결된 UnitPolicy 목록. 트랜잭션이 해당 컨트랙트와 상호작용할 때만 검사됩니다. 각ContractPolicyConfig는 후속 변경 권한을 제어하는 자체admin주소를 갖습니다.
계층 구조 예시
1. 템플릿 — 마루는
2. UnitPolicy —
3. Config — 이 UnitPolicy를
{"<denom>": {"max_limit": "int"}} 스키마의 VOLUME_POLICY 템플릿을 제공합니다.2. UnitPolicy —
PolicyAdmin이 template_id: "VOLUME_POLICY", parameters: {"aokrw": {"max_limit": "1000000000000000000000"}}로 UnitPolicy를 생성합니다.3. Config — 이 UnitPolicy를
GlobalPolicyConfig에 추가합니다. 이제 1,000 OKRW (1000 × 10^18 aokrw) 이상을 보내는 모든 트랜잭션은 ReasonCode: VolumeAboveMaxLimit과 함께 네트워크에서 거부됩니다.