프로그래머블 컴플라이언스 레이어 (PCL)

compliance external-dapp

사용자 정의 트랜잭션 규칙 및 규제 정책을 정의하고 시행하기 위한 온체인 프레임워크입니다.

프로그래머블 컴플라이언스 레이어(PCL)는 마루 네트워크의 핵심 모듈로, 블록체인 상에서 직접 컴플라이언스 정책을 생성하고 시행할 수 있게 합니다. 이 모듈은 EVM 트랜잭션을 실행 전후로 체인 전역 규칙에 대해 검증하고, 호출이 PCL 등록 프록시를 거치거나 Privacy 같은 정책 인식 프리컴파일에 도달할 때는 실행 중에 컨트랙트별 규칙에 대해 검증합니다. 이를 통해 스마트 컨트랙트의 핵심 로직을 변경하지 않고도 KYC/AML 확인, 전송 제한, 거래량 한도와 같은 복잡한 규제 요건을 구현할 수 있습니다.

주요 기능

전역 및 컨트랙트별 정책

네트워크 전체에 규칙을 적용하거나 특정 스마트 컨트랙트를 대상으로 세분화된 제어를 할 수 있습니다.

템플릿 기반 정책 생성

미리 정의된 재사용 가능한 정책 템플릿(예: 거부 목록, 거래량 한도, EAS 증명)을 사용하여 복잡한 규칙을 신속하게 구성합니다.

EVM 네이티브 통합

체인은 EVM 트랜잭션만 받습니다. 정책 관리자가 PCL 제어 평면 메서드를 호출하는 복구용 호출을 제외한 모든 트랜잭션은 실행 전과 실행 성공 후에 전역 정책 검사를 받습니다. 따라서 체인 전역 컴플라이언스는 체인 레이어에서 강제됩니다.

EAS를 통한 확장성

EAS(Ethereum Attestation Service)를 활용해 온체인 attestation 기반 규칙을 시행하여 신원·자격 증명 확인을 지원합니다.

아키텍처

graph TD
    subgraph TX["Every transaction"]
        A["Tx submitted"] --> B{"Global policies<br/>at submission and before execution"}
        B -- pass --> D["EVM execution"]
        B -- violation --> E["Rejected before execution"]
        D --> R{"Global policies again<br/>after execution"}
        R -- pass --> F["State committed"]
        R -- violation --> S["Tx fails, still mined and charged"]
    end

    subgraph PX["A call into a PCL-wrapped contract"]
        G["Call via PCL proxy"] --> H{"PCL preCall<br/>contract and global policies"}
        H -- pass --> K["Execute contract logic"]
        H -- violation --> L["Revert"]
        K --> T{"PCL postCall"}
        T -- pass --> U["Return result"]
        T -- violation --> L
    end

    subgraph CFG["PCL configuration"]
        M["Policy admin"] -- manages --> N["Policy templates"]
        M -- manages --> O["Global policy config"]
        P["Contract policy admin"] -- manages --> Q["Contract policy config"]
        N --> O
        N --> Q
    end
    classDef evm fill:#0096AA,stroke:#0096AA,color:#fff;
    classDef precompile fill:#FF8C50,stroke:#FF8C50,color:#fff;
    class A,D,E,F,S,G,K,L,U,M,P evm;
    class B,R,H,T,N,O,Q precompile;

PCL은 전역 검사를 실행 전에는 체인의 실행 전 검사에서, 실행 후에는 트랜잭션 후처리 훅에서 다시 수행하고, 컨트랙트별 검사는 PCL 프록시의 preCall/postCall 훅에서 수행합니다. 모든 정책 구성은 온체인에 저장되며 지정된 관리자 계정이 관리합니다.

정책 시행 흐름

PCL은 모든 트랜잭션을 프로토콜 레이어에서 규칙 집합에 대해 검증합니다.

모든 트랜잭션은 먼저 체인의 실행 전 검사를 통과합니다(노드의 JSON-RPC도 트랜잭션이 제출될 때 같은 PCL 검사를 실행합니다). PCL은 이 검사에 참여해, 트랜잭션의 함수 selector에 설정된 활성 전역 정책(모든 selector에 설정된 정책 포함)을 트랜잭션 자체의 호출(발신자, 수신자, 값, selector)에 대해 실행합니다. 이 단계에서 어떤 전역 정책이라도 실패하면 트랜잭션은 실행 전에 거절되며 가스를 지불하지 않습니다.

컨트랙트별 정책은 실행 중에, 호출이 PCL 등록 프록시를 거치거나 신뢰된 ERC-4337 EntryPoint가 사용자 오퍼레이션(UserOperation)에 대해 preCall / postCall을 호출할 때만 실행됩니다(정책 인식 프리컴파일인 Privacy 프리컴파일은 자체적으로 평가합니다). 프록시는 구현 컨트랙트를 실행하기 전에 PCL의 preCall을, 실행 후에 postCall을 호출합니다. PCL 프록시가 없는 컨트랙트를 직접 호출하면 전역 정책만 검사되므로, 그 호출에는 컨트랙트 범위 강제가 적용되지 않습니다. 성공한 모든 EVM 트랜잭션에 대해 체인은 실행 후 발신자와 트랜잭션이 수행한 모든 호출을 대상으로 전역 정책을 다시 실행합니다. 이 단계에서 위반이 발견되면 트랜잭션은 실패합니다. 상태는 되돌려지지만 블록에는 포함되며 가스비도 부과됩니다. 실행 전후의 전역 정책과 프록시 훅 경로의 컨트랙트별 정책이 함께 네트워크 전체에서 정책을 일관되게 강제합니다.
참고: 실행 전 검사는 유효하지 않은 트랜잭션이 멤풀에 도달하기 전에 거절합니다. 네트워크 리소스를 아끼고 사용자에게 즉각적인 피드백을 줍니다.

정책 템플릿 및 구성

PCL은 규칙을 처음부터 정의하는 대신 템플릿 기반 시스템을 사용합니다. PolicyTemplate은 규칙 유형의 청사진이며, IPcl.sol의 정식 Solidity 구조체가 인스턴스의 파라미터 레이아웃을 선언합니다. 마루는 7개 내장 템플릿(EAS_POLICY, DENYLIST_POLICY, VOLUME_POLICY, PERIODIC_VOLUME_POLICY, AGENT_OKRW_TRANSFER_LIMIT_POLICY, LOGICAL_POLICY, FOR_EACH_POLICY)을 제공합니다.

모듈 파라미터에 설정된 권한 계정 PolicyAdmin(거버넌스로 제어됨)이 이러한 템플릿을 등록·관리합니다.

규칙을 활성화하려면 관리자가 PolicySet을 생성합니다 — { templateId, policy, selector } 형태의 튜플이며, policy는 해당 템플릿의 파라미터 구조체를 ABI 인코딩한 값입니다(JSON이 아닙니다). 예를 들어 denylist는 templateId = "DENYLIST_POLICY", policy = abi.encode(DenylistPolicy({ addresses: [...] })), 빈 selector(Solidity의 hex"", viem의 "0x")로 구성되어 모든 호출에 적용되는 PolicySet입니다. PolicySet 항목들은 GlobalPolicyConfig(체인 전역) 또는 ContractPolicyConfig(컨트랙트별)로 묶여 적용됩니다.

다음 단계

ESC
검색어를 입력하세요