Scroll 연구: zkEVM의 설계 도전과 해결책
출처:Scroll Tech
편집: 쿠키, 체인 캡처
개요
zk-Rollup은 매우 저렴하고 안전한 이더리움 2층 확장 솔루션입니다. 그러나 기존의 zk-Rollup은 특정 애플리케이션에만 제한되어 있어 개발자가 zk-Rollup에서 범용적인 조합 가능한 DApp을 구축하고 기존 애플리케이션을 이전하는 데 어려움을 겪고 있습니다. 우리는 zkEVM을 도입하여 EVM 검증을 위한 zk 증명을 생성함으로써 EVM과 완전히 호환되는 zk-Rollup을 구축하여 모든 이더리움 애플리케이션이 쉽게 이 zk-Rollup으로 이전할 수 있도록 합니다.
이 문서는 zkEVM의 설계 도전과제와 실행 가능성을 소개하고, 제로에서 시작하여 zkEVM을 구축하기 위한 자세한 계획을 제안합니다.
배경
zk-Rollup은 이더리움의 최상의 확장 솔루션으로 인정받고 있습니다. 이더리움 Layer 1의 보안을 유지하면서도 모든 다른 Layer 2 솔루션에 비해 거래 속도가 가장 빠릅니다.
중장기적으로 ZK-SNARK 기술의 개선과 함께 ZK 롤업은 모든 사용 사례에서 우위를 점할 것입니다. --- 비탈릭 부테린
zk-Rollup의 기본 개념은 많은 거래를 하나의 Rollup 블록으로 집계하고, 체인 외부에서 블록에 대한 간결한 증명을 생성하는 것입니다. 그런 다음 Layer 1의 스마트 계약은 zk-Rollup의 증명을 검증하고 상태를 직접 업데이트하기만 하면 되며, 거래를 다시 실행할 필요가 없습니다. 증명 검증 상태는 다시 계산을 실행하는 것보다 가스 비용이 훨씬 저렴하며, 데이터 압축(즉, 검증을 위해 최소한의 온체인 데이터만 유지)은 가스 비용을 줄이는 데 도움이 됩니다. 이러한 거래 프로세스는 가스 비용을 한 자릿수로 절약합니다.
zk-Rollup은 안전하고 효율적이지만, 범용 DApp을 구축하기 어렵고 그 응용은 여전히 지불 및 교환(swap)으로 제한됩니다. 이는 주로 다음 두 가지 이유 때문입니다.
첫째, zk-Rollup에서 DApp을 개발하려면 스마트 계약의 논리를 작성하기 위해 특수 프로그래밍 언어(즉, R1CS)를 사용해야 합니다. 이 프로그래밍 언어의 문법은 복잡하며, 개발자가 제로 지식 증명에 능숙해야 합니다.
둘째, 현재의 zk-Rollup은 조합 가능성을 지원하지 않습니다[1]. 이는 여러 zk-Rollup 애플리케이션이 Layer 2 내에서 상호작용할 수 없음을 의미하며, DeFi 애플리케이션의 조합 가능성을 크게 저하시킵니다.
간단히 말해, 현재 zk-Rollup은 개발자에게 친숙하지 않으며 기능이 제한적입니다. 우리는 이러한 문제를 해결하고, 원주율 EVM 검증을 직접 지원하여 개발자에게 빠른 개발 경험을 제공하고 Layer 2 내 애플리케이션의 조합 가능성을 지원하여 기존 이더리움 애플리케이션이 쉽게 zk-Rollup으로 이전할 수 있도록 하고자 합니다.
zk-Rollup에서 범용 DApp 구축하기
zk-Rollup에서 범용 DApp을 구축하는 방법에는 두 가지가 있습니다.
- 다양한 DApp을 위한 전용 회로("ASIC") 구축
- 스마트 계약 실행을 위한 범용 "EVM" 인코딩 구축
"회로(circuit)"는 제로 지식 증명에서 사용되는 프로그램 표현 방법을 의미합니다. 예를 들어, hash(x) = y를 증명하려면 ASIC 회로를 사용하여 해시 함수를 다시 작성해야 합니다. 회로는 매우 제한된 계산 표현식만 지원합니다(예: R1CS는 덧셈(add)과 곱셈(mul)만 지원). 따라서 개발자가 회로 언어로 프로그램을 작성하는 과정은 매우 어렵고, 모든 프로그램 논리(조건문, 반복문 등)를 add와 mul을 사용하여 구축해야 합니다.
첫 번째 방법은 개발자가 다양한 DApp을 위해 전용 "ASIC" 회로를 설계해야 하며, 이는 제로 지식 증명의 가장 원시적인 방식으로 수행해야 합니다. 맞춤형 회로 설계를 통해 각 DApp의 비용을 줄일 수 있습니다. 그러나 회로가 "정적"이기 때문에 애플리케이션에 조합 가능성을 제공할 수 없으며, 전문적인 회로 설계 지식이 필요하므로 개발 경험이 매우 나쁩니다[2].
두 번째 방법은 특별한 설계나 회로 전문 지식이 필요하지 않습니다. 이 기계 증명 기반의 고급 아이디어는 모든 프로그램이 CPU에서 실행될 수 있게 하며, 개발자는 기본 단계를 검증하기 위해 범용 CPU 회로만 구축하면 됩니다. 그런 다음 이 CPU 회로를 사용하여 프로그램의 실행을 검증합니다. 이 시나리오에서 프로그램은 스마트 계약을 의미하고, CPU는 EVM입니다. 그러나 비용이 너무 높아 지난 몇 년 동안 이 방법이 널리 채택되지 않았습니다. 예를 들어, 개발자가 검증 단계를 추가하고 싶어도 전체 EVM 회로의 비용을 감당해야 합니다. 실행 추적에 수천 개의 단계가 포함되어 있다면 EVM 회로 비용은 1000배가 될 것입니다[3].
최근에는 이 두 가지 방법을 최적화하기 위한 많은 연구가 진행되고 있습니다. 여기에는 다음이 포함됩니다:
(i) 회로에서 SHA256의 100배 효율성을 가진 새로운 제로 지식 증명 친화적 언어인 Poseidon 해시 제안
(ii) TinyRAM과 같은 범용 검증 가능한 가상 머신
(iii) Plookup과 같은 점점 더 많은 범용 최적화 기술과 더 빠른 속도의 암호학 라이브러리.
우리는 이전에 각 DApp을 위한 "ASIC" 회로를 설계하고, 암호를 통해 통신하는 것을 제안했습니다. 그러나 커뮤니티의 피드백에 따라 우리는 우선 순위를 변경하고 두 번째 방법에 중점을 두어 범용 EVM 회로(소위 "zkEVM")를 우선 구축하기로 했습니다. zkEVM은 Layer 1과 완전히 동일한 개발 경험을 지원합니다. 우리는 기본 설계의 복잡성을 개발자에게 남기지 않고, 맞춤형 EVM 회로 설계를 통해 효율성 문제를 해결할 것입니다.
zkEVM의 설계 도전과제
zkEVM은 구축하기 어려우며, TinyRAM과는 달리 zkEVM의 설계와 구현은 더 많은 도전 과제가 있습니다. 그 이유는 다음과 같습니다:
첫째, EVM은 타원 곡선에 대한 지원이 제한적입니다. 현재 EVM은 BN254 쌍만 지원하며, 순환 타원 곡선을 직접 지원하지 않기 때문에 재귀 증명을 수행하기 어렵습니다. 다른 전용 프로토콜도 이 제한 하에서는 사용하기 어렵습니다. EVM 호환 검증 알고리즘이 아니면 사용할 수 없습니다.
둘째, EVM의 워드 길이는 256비트입니다. EVM은 256비트 정수에서 실행되며(대부분의 일반 VM은 32-64비트 정수에서 실행됨), zk 증명은 소수 필드에서 작동합니다. 회로 내부에서 "불일치 필드 산술"을 수행하려면 범위 증명이 필요하며, 이는 각 EVM 단계에서 약 100개의 제약 조건을 추가하여 EVM 회로의 크기를 두 자릿수로 확대합니다.
셋째, EVM에는 많은 특수 작업 코드가 있습니다. EVM은 전통적인 VM과 달리 많은 특수 작업 코드(예: CALL)와 실행 컨텍스트 및 가스 관련 오류 유형을 가지고 있습니다. 이는 회로 설계에 새로운 도전을 제공합니다.
넷째, EVM은 스택 기반 가상 머신입니다. SyncVM(zksync) 및 Cario(starkware) 아키텍처는 레지스터 기반 모델을 기반으로 하며 특정 IR/AIR를 정의합니다. 스마트 계약 코드를 새로운 zk 친화적인 IR로 컴파일하기 위한 전문 컴파일러가 필요합니다. 이 방법은 언어 호환성이 있을 뿐 원주율 EVM 호환성이 없으며, 스택 기반 모델과 원주율 도구 체인을 직접 지원하는 것이 더 어렵습니다.
다섯째, 이더리움 저장 레이아웃의 비용이 너무 큽니다. 이더리움 저장 레이아웃은 Keccak 및 MPT[4]에 크게 의존하며, 이들은 모두 zk 친화적인 유형이 아니며 높은 비용을 발생시킵니다. 예를 들어, Keccak 해시의 회로 크기는 Poseidon 해시의 1000배입니다. 그러나 Keccak을 다른 해시로 교체하면 기존 이더리움 인프라에 일부 호환성 문제가 발생할 수 있습니다.
여섯째, 기계 기반 증명에는 높은 비용이 있습니다. 위의 모든 문제를 적절히 처리할 수 있다 하더라도, 이를 결합하여 완전한 EVM 회로를 얻는 효과적인 방법을 찾아야 합니다. 앞서 언급한 바와 같이, 간단한 작업 코드인 add는 전체 EVM 회로의 비용을 초래할 수 있습니다.
왜 zkEVM이 가능할까요?
연구자들이 이 분야에서 이룬 큰 발전 덕분에, 최근 2년 동안 해결된 효율성 문제들이 증가하고 있으며, zkEVM의 실행 가능성을 입증하고 있습니다! 주요 기술 발전은 다음과 같은 몇 가지 측면에서 비롯됩니다:
다항식 약속(polynomial commitment)의 사용. 지난 몇 년 동안 대부분의 제로 지식 증명 프로토콜은 R1CS를 사용하고 있으며, PCP 쿼리는 특정 애플리케이션의 신뢰할 수 있는 초기 설정(trusted setup)에 인코딩되었습니다. 이러한 상황은 일반적으로 회로가 과부하되어 사용자 정의 최적화를 수행할 수 없게 만들며, 각 제약 조건의 차수는 2(이중 선형 쌍(bilinear pairing)은 지수에서 한 번의 곱셈만 허용함)를 요구합니다. 개발자는 다항식 약속 계획을 사용하여 범용 설정(universal setup) 또는 투명 설정(transparent setup)을 통해 제약 조건을 어떤 차수로든 높일 수 있어 백엔드 선택의 유연성을 크게 향상시킵니다.
데이터 테이블 쿼리 매개변수 및 사용자 정의 도구. 데이터 테이블 쿼리 매개변수의 최적화는 처음에 Arya에서 제안되었고, 이후 Plookup에서 최적화되었습니다. 이는 zk 친화적이지 않은 프로그래밍 문장(예: AND, XOR 등)의 비트 연산을 많이 생략할 수 있습니다. 사용자 정의 도구는 개발자가 높은 제약을 효율적으로 수행할 수 있게 합니다. TurboPlonk와 UltraPlonk는 개발자가 데이터 테이블 쿼리와 사용자 정의 도구를 더 쉽게 사용할 수 있도록 우아한 문법을 정의합니다. 이는 EVM 회로의 비용을 줄이는 데 매우 도움이 됩니다.
재귀 증명의 실행 가능성이 점점 높아지고 있습니다. 과거에는 재귀 증명이 특별한 순환 타원 곡선(즉, MNT 곡선 기반의 구성)에 의존하여 많은 비용이 필요했습니다. 현재는 효율성을 희생하지 않고 이러한 의존성을 변경하는 기술이 더 많이 등장하고 있습니다. 예를 들어, Halo는 쌍친화적인 타원 곡선을 사용할 수 있으며, 특별한 내적 매개변수를 사용하여 재귀 비용을 분산시킬 수 있습니다. Aztec는 기존 프로토콜에 대해 직접 집계 증명을 수행할 수 있음을 보여주었습니다(쿼리 데이터 테이블은 비지역 필드 작업의 비용을 줄여 검증 회로의 비용을 낮출 수 있습니다). 이 방법은 회로 부하의 확장성을 크게 향상시킬 수 있습니다.
하드웨어 가속이 더욱 효율적입니다. 우리는 GPU 및 ASIC/FPGA 가속기를 제조하였으며, ASIC 증명자에 대한 논문이 최대 컴퓨터 회의(ISCA)에 수락되었습니다. GPU 증명자는 Filecoin의 구현보다 약 5배에서 10배 빠릅니다. 이는 증명자의 계산 효율성을 크게 향상시킬 것입니다.
zkEVM은 어떻게 작동하며, 어떻게 구축할까요?
강력한 직관과 기술적 개선 외에도, 우리는 무엇을 증명해야 하는지 더 명확히 알고, 더 구체적인 아키텍처를 수립해야 합니다. 우리는 후속 기사에서 더 많은 기술 세부사항과 비교를 소개할 것입니다. 여기서는 전체 작업 흐름과 몇 가지 핵심 아이디어를 설명합니다.
개발자와 사용자의 작업 흐름
개발자는 EVM 호환 언어를 사용하여 스마트 계약을 실행하고, 컴파일된 바이트코드를 Scroll에 배포할 수 있습니다. 그런 다음 사용자는 거래를 보내 스마트 계약과 상호작용할 수 있습니다. 사용자와 개발자의 경험은 Layer 1과 완전히 동일합니다. 그러나 가스 비용은 현저히 줄어들며, Scroll에서의 거래 주문은 즉시 사전 확인됩니다(출금은 몇 분 내에 완료됩니다).
zkEVM의 작업 흐름
Layer 1과 Layer 2의 표면적인 작업 흐름에는 큰 차이가 없지만, 두 시스템의 기본 처리 과정은 완전히 다릅니다: Layer 1은 스마트 계약의 재실행에 의존하고, Layer 2는 zkEVM 회로의 유효성 증명에 의존합니다.
Layer 1과 Layer 2 거래의 상황이 어떻게 다른지 더 자세히 설명해 보겠습니다.
Layer 1에서는 스마트 계약의 바이트코드가 이더리움 저장소에 저장되고, 거래는 P2P 네트워크에서 방송됩니다. 각 거래에 대해 모든 전체 노드는 해당 바이트코드를 로드하고 EVM에서 실행하여 동일한 상태에 도달해야 합니다(거래는 입력 데이터로 사용됨).
Layer 2의 스마트 계약 바이트코드도 동일한 방식으로 처리되지만, 후속 단계는 거래가 체인 외부에서 중앙 집중식 zkEVM 노드로 전송됩니다. 그런 다음 zkEVM은 바이트코드를 실행하고 애플리케이션 거래 후 상태가 올바르게 업데이트되었음을 증명하기 위해 간결한 증명을 생성합니다. 마지막으로 Layer 1 계약은 증명을 검증하고 상태를 업데이트하며, 거래를 다시 실행할 필요가 없습니다.
이제 실행 과정을 깊이 살펴보고 zkEVM이 최종적으로 무엇을 증명해야 하는지 알아보겠습니다. 원주율 실행에서 EVM은 먼저 바이트코드를 로드한 다음, 처음부터 바이트코드의 작업 코드를 하나씩 실행하며 각 작업 코드에 대해 다음 세 가지 하위 단계를 수행합니다:
(i) 스택, 메모리 또는 저장소에서 요소를 읽기
(ii) 이러한 요소에 대해 일부 계산 수행
(iii) 결과를 스택, 메모리 또는 저장소에 다시 쓰기[5]. 예를 들어, add 작업 코드는 스택에서 두 요소를 읽고, 이들을 더한 후 결과를 스택에 다시 씁니다.
따라서 zkEVM의 증명은 실행 과정에 해당하는 다음 몇 가지 측면을 포함해야 합니다:
- 바이트코드가 저장소에서 올바르게 로드됨 (가상 머신이 주어진 주소에서 로드된 작업 코드를 올바르게 실행할 수 있도록)
- 바이트코드의 작업 코드가 하나씩 실행됨 (바이트코드는 순서대로 실행되며, 어떤 작업 코드도 누락되거나 건너뛰지 않음)
- 각 작업 코드가 올바르게 실행됨 (각 작업 코드의 세 가지 하위 단계가 읽기, 쓰기 및 계산을 올바르게 수행함)
zkEVM 설계의 주요 특징
zkEVM 아키텍처를 설계할 때 우리는 위의 세 가지 문제를 처리/해결해야 합니다.
첫째, 암호 검증기를 위한 회로 설계. 이 부분은 "검증 가능한 저장소"와 같으며, 우리는 암호 검증기라는 기술 수단을 사용하여 검증 결과의 정확성을 보장합니다[6]. 예를 들어, 머클 트리를 사용하면 배포된 바이트코드가 머클 트리의 리프 노드로 저장됩니다. 그런 다음 검증자는 간결한 증명을 사용하여 주어진 주소에서 로드된 바이트코드를 검증할 수 있습니다(즉, 검증 회로의 머클 경로를 검증). 이더리움 저장소의 경우, 회로는 머클 패트리샤 트리와 Keccak 해시 함수를 호환해야 합니다.
둘째, 바이트코드와 실제 실행 간의 연관성을 생성하는 회로 설계. 바이트코드를 정적 회로로 이동하면 jump와 같은 조건부 작업 코드(스마트 계약의 loop, if else 문에 해당)가 임의의 위치로 점프할 수 있는 문제가 발생합니다. 특정 입력으로 해당 바이트코드를 실행하기 전까지 점프 목적지는 불확실합니다. 그래서 우리는 실제 실행 추적을 검증해야 합니다. 실행 추적은 "전개된 바이트코드"로 간주될 수 있으며, 실제 실행 순서에 따라 정렬된 작업 코드를 포함합니다(즉, 다른 위치로 점프하면 추적에 해당 목표 작업 코드와 위치가 포함됩니다).
증명자는 실행 추적을 회로의 증거 데이터로 직접 제공합니다. 우리는 특정 바이트코드와 특정 입력을 사용하여 이 실행 추적이 "전개"되었음을 증명해야 하며, 이는 프로그램 카운터의 값을 일관되게 유지하도록 강제하는 목적입니다. 목적지가 불확실한 문제에 대한 해결책은 증명자가 모든 데이터를 제공하도록 하는 것입니다. 그런 다음 매개변수를 통해 효율적으로 일관성을 확인합니다(즉, 증명이 정확한 전역 카운터를 가진 작업 코드가 "버스"에 포함되어 있는지 확인).
셋째, 각 작업 코드에 대한 회로 설계(각 작업 코드의 읽기, 쓰기 및 계산이 올바른지 증명). 이는 가장 중요한 부분으로, 실행 추적의 각 작업 코드가 올바르고 일관되게 실행되었음을 증명해야 합니다. 모든 것을 직접 결합하면 높은 비용이 발생합니다. 여기서 최적화 방안은:
1) 우리는 읽기와 계산을 두 개의 증명으로 나눕니다. 하나의 증명은 모든 작업 코드에서 사용되는 요소를 "버스"에 넣고, 다른 증명은 "버스"의 요소에 대한 계산이 올바르게 수행되었음을 증명합니다. 이는 각 부분의 비용을 크게 줄일 수 있습니다(계산 증명을 생성할 때 전체 EVM 저장소를 고려할 필요가 없습니다). 전자는 "상태 증명"으로, 후자는 "EVM 증명"으로 불립니다. 또 다른 발견은, 조회 선언이 "버스 매핑"을 효과적으로 처리할 수 있다는 것입니다.
2) 우리는 각 작업 코드에 대해 더 높은 차수의 맞춤형 제약 조건을 설계할 수 있습니다(즉, 하나의 EVM 단어를 여러 데이터 블록으로 나누어 더 효율적으로 처리할 수 있습니다). 우리는 필요에 따라 선택 다항식을 통해 제약 조건을 "열 수" 있는지 선택할 수 있습니다. 이렇게 하면 각 작업이 전체 EVM 회로의 비용을 소모하지 않도록 할 수 있습니다.
이 아키텍처는 이더리움 재단에 의해 처음 제안되었으며, 여전히 초기 단계에 있으며 적극적으로 개발되고 있습니다. 우리는 이더리움 재단과 긴밀히 협력하여 이 EVM 회로를 구현할 최상의 방법을 찾고 있습니다. 지금까지 우리는 EVM 회로의 가장 중요한 특징을 정의하였고, Halo2 라이브러리의 UltraPlonk 문법을 사용하여 일부 작업 코드를 구현하였습니다. 더 자세한 내용은 후속 기사에서 소개할 예정입니다. 관심 있는 독자들은 이 문서를 읽어보시기 바랍니다. 개발 프로세스는 투명하게 진행될 것입니다. 이는 전체 커뮤니티의 힘을 모은 완전한 오픈 소스 설계가 될 것입니다. 더 많은 사람들이 참여하여 기여하기를 바랍니다.
zkEVM은 또 무엇을 가져올 수 있을까요?
zkEVM은 단순히 Layer 2 확장에 그치지 않습니다. 우리는 이를 Layer 1의 유효성 증명을 통해 이더리움 Layer 1을 직접 확장하는 방법으로 이해할 수 있습니다. 이는 특별한 Layer 2 없이도 기존 Layer 1을 확장할 수 있음을 의미합니다.
예를 들어 개발자는 zkEVM을 전체 노드로 사용하여, 이 증명을 통해 기존 상태 간의 전환을 직접 증명할 수 있습니다. 모든 Layer 1 거래는 Layer 2로 어떤 것도 이전할 필요 없이 직접 증명할 수 있습니다! 더 넓게 말하자면, zkEVM을 사용하여 전체 이더리움에 대해 간결한 증명을 생성할 수 있습니다. 마치 Mina와 같습니다. 유일하게 추가해야 할 것은 증명 재귀(블록의 검증 회로를 zkEVM에 삽입하는 것)입니다[7].
결론
zkEVM은 개발자와 사용자에게 동일한 경험을 제공할 수 있습니다. 안전성을 희생하지 않으면서도 비용은 몇 자릿수 저렴합니다. 이를 모듈화 방식으로 구축하기 위한 아키텍처가 제안되었습니다. 이는 최근 제로 지식 증명에서의 돌파구를 활용하여 비용을 줄입니다(사용자 정의 제약, 조회 매개변수, 증명 재귀 및 하드웨어 가속 포함). 우리는 더 많은 사람들이 zkEVM 커뮤니티에 참여하여 함께 아이디어를 모으기를 기대합니다!
비고:
[1]: Starkware는 2021년 9월 1일 발표에서 조합 가능성을 구현했다고 밝혔습니다.
[2]: 회로는 고정적이고 정적입니다. 예를 들어, 프로그램을 회로로 구현할 때 가변 상한 루프를 사용할 수 없습니다. 상한은 최대값으로 고정되어야 합니다. 회로는 동적 논리를 처리할 수 없습니다.
[3]: 독자의 이해를 돕기 위해, 우리는 여기서 EVM 회로의 비용을 자세히 설명합니다. 앞서 언급했듯이, 회로는 고정적이고 정적입니다. 따라서 EVM 회로는 모든 가능한 논리를 포함해야 합니다(이 양은 add만 포함하는 회로의 10000배입니다). 이는 당신이 add를 증명하고 싶어도, 여전히 해당 EVM 회로에 포함될 수 있는 모든 논리의 비용을 부담해야 함을 의미합니다. 즉, 비용이 10000배로 확대됩니다. 실행 추적에서는 일련의 작업 코드를 증명해야 하며, 각 작업 코드는 높은 비용을 초래합니다.
[4]: EVM 자체는 머클-패트리샤 트리(MPT)와 밀접하게 연결되어 있지 않습니다. 현재 MPT는 이더리움 상태 저장에만 사용됩니다. 다른 것으로 교체하는 것은 쉽습니다(누군가는 Verkle 트리를 MPT 대신 사용할 것을 제안했습니다).
[5]: 이는 매우 단순화된 추상 개념입니다. 기술적으로 "EVM 상태"의 목록은 더 길며, 프로그램 카운터, 가스 잔여량, 호출 스택(위의 모든 것 외에도 각 호출의 주소와 정적), 로그 집합 및 거래 범위 변수(핫 저장 슬롯, 환불, 자살)를 포함합니다. 우리는 조합 가능성을 직접 지원하기 위해 다양한 호출 환경에 대한 식별자를 추가할 수 있습니다.
[6]: 저장량이 많기 때문에 우리는 누산기를 사용하여 저장합니다. 메모리와 스택은 편집 가능한 Plookup을 사용할 수 있습니다(이 방법을 통해 "RAM"을 효과적으로 구현할 수 있습니다).
[7]: 전체 재귀 증명을 zkEVM 회로에 추가하는 것은 쉽지 않습니다. 재귀를 구현하는 가장 좋은 방법은 순환 타원 곡선을 사용하는 것입니다(즉, Pasta 곡선). 우리는 이더리움 Layer 1에서 재귀를 검증할 수 있도록 하는 "포장(wrapping)" 과정을 도입해야 합니다.