Zeth 공개 발표: 첫 번째 Type 0 zkEVM
원문 제목: Zeth 발표: 첫 번째 Type Zero zkEVM
저자: Tim Cartens, Victor Graf, Rami Khalil, Steven Li, Parker Thompson, Wolfgang Welz, Zeth Collaboration
편집: bayemon.eth, ChainCatcher
오늘, RISC Zero zkVM 기반의 이더리움 오픈 소스 ZK 블록 검증기 Zeth가 공개되었습니다. Zeth는 zkVM 내에서 새로운 블록을 생성하는 데 필요한 모든 작업을 완료하여 검증자나 동기화 위원회에 의존하지 않습니다. Zeth는 이더리움 메인넷의 여러 실제 블록에서 검증되었으며, 이더리움 공식 테스트 스위트의 모든 관련 테스트를 통과했습니다. Zeth는 4주 이내에 zkVM 기반의 Rust 지원과 revm, etherthers, alloy를 포함한 강력한 모듈을 구현할 수 있습니다. zkVM의 연속성과 Bonsai 증명 서비스 지원 덕분에 Zeth는 몇 분 안에 이러한 증명을 생성할 수 있습니다. Zeth의 체인 상 검증 지원으로 누구나 저렴한 비용으로 체인 상에서 이러한 증명을 검증할 수 있습니다. 이 글에서는 더 많은 세부 사항을 소개하며, 코드에 대해 더 깊이 알고 싶다면 소스 코드를 확인하고 RISC Zero 개발자 포털을 방문해 주세요.
요약
약 1년 전, Vitalik은 zkEVM의 다양한 유형에 대해 설명했습니다:
이더리움은 처음부터 ZK 친화적으로 설계되지 않았기 때문에, 이더리움 프로토콜의 많은 부분이 ZK 검증을 수행하기 위해 많은 계산을 필요로 합니다. 1형 EVM의 목표는 이더리움을 완전히 복제하는 것이므로 이러한 비효율 문제를 완화할 수 없습니다. 현재 이더리움 블록의 증명은 완료하는 데 몇 시간이 걸립니다.
이더리움 발전 역사에서 관련 사례가 구현된 적이 있지만, 오늘 우리는 RISC Zero의 zkVM과 Bonsai 서비스를 사용하여 이더리움 블록 증명이 몇 분 만에 완료된다는 것을 기쁘게 발표합니다.
Zeth: 검증 가능한 이더리움 블록 생성
오늘, 우리는 RISC Zero zkVM을 기반으로 이더리움에 오픈 소스 ZK 블록 검증기 Zeth를 발표합니다.
Zeth는 주어진 이더리움 블록이 유효하다는 것을 검증자나 동기화 위원회에 의존하지 않고 증명할 수 있습니다. 이는 Zeth가 zkVM 내에서 새로운 블록 생성을 위해 필요한 모든 작업을 완료했기 때문입니다. 여기에는 다음이 포함됩니다:
- 거래 서명 검증
- 부모 블록의 상태 루트를 기반으로 계정 및 저장 상태 검증
- 거래 적용
- 블록 작성자에게 수수료 지급
- 상태 루트 업데이트
- 블록 생성을 위해 필요한 기타 작업
새로운 블록을 생성한 후, Zeth는 그 해시 값을 계산하고 출력합니다. zkVM 내에서 이 과정을 실행함으로써 우리는 새로운 블록이 유효하다는 ZK 증명을 얻을 수 있습니다.
RISC Zero의 zkVM과 인기 있는 Rust 크레이트(revm, ether, alloy)를 활용하여 우리는 4주도 채 되지 않아 Zeth의 첫 번째 버전을 작성했습니다. zkVM의 연속성과 Bonsai 증명 서비스 지원 덕분에 증명 생성은 단 몇 분 안에 완료될 수 있습니다. 체인 상 검증 지원 덕분에 우리는 저렴한 비용으로 체인 상에서 이러한 증명을 검증할 수 있습니다.
Zeth는 이더리움 메인넷의 여러 실제 블록에서 검증되었으며, 이더리움 공식 테스트 스위트의 모든 관련 테스트를 통과했습니다.
Zeth는 표준 이더리움 블록을 구축했기 때문에 1형 zkEVM으로 간주될 수 있습니다. 그러나 그 의미는 그 이상입니다: Zeth는 표준 Rust 코드 모듈(예: Reth와 같은 인기 있는 전체 노드에서 사용하는 코드 모듈)을 사용하여 구축되었기 때문에 우리는 이를 0형 zkEVM: 완전한 프로토콜 호환성 및 대량의 코드 재사용으로 간주하고 싶습니다.

이 이정표는 ZK 기술과 이더리움 생태계가 한 걸음 더 나아갔음을 나타냅니다. 이 글에서는 Zeth의 첫 번째 버전을 몇 주 만에 작성한 방법, 성능, 작동 원리 및 이것이 ZK 프로젝트에 미치는 의미에 대해 논의할 것입니다.
RISC Zero는 zk 롤업, zkEVM, 경량 클라이언트 및 브리지를 더 쉽게 구축할 수 있게 합니다
우리는 다음 두 가지 이유로 Zeth를 작성했습니다:
- 다른 팀이 ZK 기반 인프라(예: ZK 롤업, zkEVM, ZK 경량 클라이언트, ZK 브리지 등)를 더 쉽게 구축할 수 있도록 합니다. Zeth는 EVM 기반 블록 생성을 위한 ZK 증명에 필요한 모든 것을 제공합니다. 이는 모든 zkEVM 또는 브리지의 핵심 구성 요소입니다. Zeth는 revm을 기반으로 오픈 소스이므로 프로젝트 개발자는 쉽게 수정하거나 사용할 수 있습니다. 증명은 체인 상에서 검증할 수 있으며(브리지 및 L2에 적합), 로컬 애플리케이션에서도 검증할 수 있습니다(전체 노드 및 경량 클라이언트에 적합).
- Zeth의 zkVM에서 EVM 성능에 대한 관련 연구를 수행합니다. 특히 이더리움 관련 작업에 대해 조사합니다(조사 결과 분석은 아래에 있습니다).
zk 롤업과 zkEVM
0형 zkEVM으로서 Zeth는 개발자가 완전한 로컬 EVM 및 이더리움 호환 zk 롤업을 구축할 수 있게 합니다. Zeth의 체인 상 증명 검증 지원 덕분에 ZK 기반 L2 확장 솔루션 구축이 매우 간단해질 것입니다.
기존의 ZK 롤업 및 zkEVM 회로는 설계상 단일 조각으로 되어 있으며, 개발자가 ZK 암호학에 대한 높은 수준의 이해가 없으면 업그레이드할 수 없습니다. 반면, zkVM 기반의 Zeth 접근 방식은 모든 개발자가 자신의 필요에 따라 맞춤화하고 수정할 수 있게 합니다.
Zeth는 revm을 기반으로 한 오픈 소스이며, 다른 zkEVM 및 EVM 호환 체인을 지원하도록 조정하는 것은 상대적으로 쉬운 일입니다. 따라서 Zeth는 향후 EIP 업데이트에 대해 상대적으로 더 빠르게 반응할 수 있습니다. 또한, Zeth는 모듈화 기능을 제공하여 개발자가 자신의 블록 생성 논리를 구축할 수 있게 합니다.
우리는 Zeth의 노력이 zk 롤업과 zkEVM의 민주화를 이루기를 바랍니다. ZK 기반 L2 솔루션은 이전에 수년간의 연구 개발과 1억 달러 이상의 자금이 필요했으며, 이는 대부분의 프로젝트가 감당할 수 없는 비용입니다.
경량 클라이언트와 브리지
의심할 여지 없이, 신호 체인의 도입은 경량 클라이언트와 브리지에 큰 혜택을 주었습니다. 이러한 기술은 이더리움의 성숙한 PoS 모델 위에 구축되어 있으며, 모든 사람이 규칙을 준수하는 전제 하에 경량 클라이언트와 브리지가 최근 블록을 쉽게 검증할 수 있게 합니다.
물론, 스테이킹의 전체 의미는 규칙을 준수하는 노드에 경제적 인센티브를 제공하는 것입니다. 그러나, 슬래싱이 노드에 가해지는 위협은 악행을 완전히 피할 수는 없습니다. 외부 인센티브는 이익의 "균형"을 항상 악행 쪽으로 기울게 만들며, 이러한 악성 행동을 올바르게 처리할 수 있는 경량 클라이언트나 브리지를 설계하는 것은 어렵습니다.
Zeth와 같은 도구가 있으면 노드의 악행 위험이 크게 줄어듭니다. 경량 클라이언트는 zkVM에 몇 개의 호출 인터페이스를 추가하기만 하면 Zeth와 통합할 수 있습니다. 브리지와 같은 체인 상 애플리케이션은 우리의 체인 상 증명 검증 계약을 사용하여 Zeth와 통합할 수 있습니다.
앞으로 우리는 경량 클라이언트와 브리지가 ZK 증명을 사용하여 주어진 블록이 유효한지를 결정하는 모습을 상상할 수 있습니다. 이러한 방법은 위험을 크게 줄이면서도 블록 검증 비용을 크게 증가시키지 않을 것입니다.
이는 애플리케이션 체인, 모듈화 생태계 및 새로운 체인에 특히 중요합니다. 이들은 이더리움의 대규모 전체 노드 커뮤니티가 제공하는 동일한 수준의 보안을 갖추고 있지 않기 때문입니다.
좋은 기반이 프로젝트 개발 프로세스를 단순화합니다
Zeth는 RISC Zero zkVM을 기반으로 하며, RISC-V 명령어 집합 아키텍처를 사용하여 개발자에게 친숙한 프로그래밍 경험을 제공합니다. 그러나 우리의 zkVM은 단순한 RISC-V 커널이 아닙니다. 우리는 해시 알고리즘 및 서명 검증과 같은 일반적인 암호화 작업을 위한 가속 회로도 갖추고 있습니다.
이러한 혼합 접근 방식(범용 CPU 커널과 가속 회로의 결합)은 우리에게 두 가지 장점을 제공합니다:
- 주류 프로그래밍 언어 지원.
- 주요 암호화 작업의 성능 저하 없음.
따라서 우리는 revm, ether 및 alloy에서 제공하는 기존 Rust 코드 패키지를 사용하여 Zeth를 신속하게 구축할 수 있었습니다. 기존 모듈을 재사용함으로써 우리는 4주도 채 되지 않아 Zeth의 첫 번째 버전을 완료했습니다. 이러한 속도는 덜 성숙한 생태계에서는 불가능합니다.
성능 측면에서 Zeth는 ECDSA 서명 검증을 위한 가속기 회로와 연속성을 활용합니다. 이는 우리의 ZK 프레임워크의 새로운 기능으로, nVidia CUDA 또는 Apple Metal을 사용하는 병렬 작업 GPU 클러스터를 통해 대규모 계산을 빠르게 증명할 수 있습니다. 연속성은 사용하기 쉽습니다: 이 기능은 zkVM에서 실행되는 모든 방문 프로그램에 투명하게 제공되며, 코드 수정 없이도 정상적으로 작동합니다.
우리의 zkVM을 사용하면 몇 시간 대신 몇 분 안에 이더리움 블록 유효성에 대한 ZK 증명을 신속하게 생성할 수 있습니다.
성능
우리는 Zeth 블록 생성기의 성능을 소개할 것입니다. Zeth는 여전히 새로운 제품이므로 이러한 데이터는 변경될 수 있지만, 우리는 미래 작업의 기준선으로 삼기 위해 몇 가지 구체적인 데이터를 제공하고자 합니다.
성능에 관해서는 몇 가지 요소를 고려해야 합니다:
- 증명 생성에 필요한 계산 자원.
- 증명 생성에 필요한 "벽 시간"(즉, 사용자가 증명을 얻기 위해 기다려야 하는 시간).
- 증명 생성의 총 비용(달러).
연속성
Zeth의 zkVM은 연속 실행을 통해 성능을 조정할 수 있습니다. 따라서 우리는 잠시 멈추고 "연속 실행"이 무엇인지에 대해 논의할 필요가 있습니다.
우리의 zkVM은 표준 RISC-V 프로세서를 구현하고 있습니다. 따라서 주기 단위로 실행됩니다. (우리 회로에서 대부분의 RISC-V 명령어 실행은 1주기만 필요하며, 물론 예외도 있습니다). 간단한 프로그램은 일반적으로 수십만 주기만 필요하지만, 더 복잡한 프로그램은 수십억 주기가 필요할 수 있습니다.
전형적인 ZK 시스템에서 이러한 실행 주기는 하나의 증명으로 집계됩니다. 주기 수가 증가함에 따라 증명 생성에 필요한 시간과 메모리도 증가합니다. 그러나 우리의 zkVM은 이러한 규칙을 따르지 않으며, 올해 초 우리는 전통적인 증명 모드 생성의 단점을 개선하는 연속성이라는 새로운 기능을 선보였습니다.
연속성 측면에서 증명 과정은 세 단계로 나뉩니다:
우리는 비증명 시뮬레이터에서 필요한 계산을 실행합니다. 이 과정에서 우리는 지금까지 실행된 루프 수를 계산합니다. 설정 가능한 시간 간격 내에 프로그램의 상태를 스냅샷합니다. 이는 실행 과정을 여러 조각으로 나누는 효과를 줍니다. 각 조각은 작으며, 일반적으로 100만 주기 이하를 나타냅니다.
이 조각들은 증명 생성 작업자 그룹에 할당됩니다. 그들은 주어진 프로그램 조각에 대한 ZK 증명을 생성합니다. 중요한 것은 그들이 병렬로 이 작업을 수행할 수 있다는 것입니다. 충분한 작업자가 있다면, 프로그램 조각을 증명하는 데 필요한 시간 내에 모든 프로그램 조각을 증명할 수 있습니다. 조각이 작기 때문에 필요한 시간은 일반적으로 짧습니다(수십 초).
분할 증명을 생성할 때, 이들은 최종적으로 롤업됩니다. 각 "롤업" 작업은 연속적인 두 개의 분할 증명을 가져와 이 조각들의 조합에 대한 새로운 증명을 생성합니다. 예를 들어, 조각 1이 상태 A에서 상태 B로 전환되는 프로그램을 증명하고, 조각 2가 상태 B에서 상태 C로 전환되는 프로그램을 증명하면, 롤업은 프로그램이 상태 A에서 상태 C로 전환되었다고 증명합니다. 충분한 작업자가 있다면, 이는 log(N) 시간 내에 완료될 수 있으며, 여기서 N은 조각의 수입니다.
이 숫자들을 깊이 살펴보면 이러한 단계의 실제 효과를 볼 수 있습니다.
이더리움 블록을 구축하는 것은 얼마나 어려운가?
먼저, 이더리움 블록을 구축하는 복잡성을 살펴보겠습니다. 아래 표에서는 몇 가지 실제 이더리움 블록을 선택하고, zkVM에서 Zeth를 사용하여 이를 재구성했습니다.

예를 들어, 블록 17606771은 2131개의 조각을 생성합니다. 각 조각은 최대 2^20개의 실행 주기를 나타낼 수 있으므로, 전체 계산은 최대 2,234,515,456개의 실행 주기가 필요합니다.
일반적으로 우리는 전형적인 이더리움 블록이 20억에서 40억 개의 주기를 필요로 하지만, 때로는 95억 개의 주기가 필요할 수 있음을 봅니다. (처음에는 이러한 차이가 거래의 가스에 반영되지 않는 것에 놀랐습니다. 그러나 더 깊이 생각해보니, 가스 시스템은 일반 실행을 고려하여 설계되었기 때문에 ZK 증명에는 해당되지 않는 것이 이해가 됩니다).
연속성을 통해 이러한 규모는 쉽게 관리할 수 있습니다. 이 데이터를 기반으로, 10,000개의 노드가 zkVM 검증기를 실행하는 P2P 네트워크는 최대 블록의 최고 병렬 검증 성능을 달성할 수 있으며, 이는 이더리움이 현재 보유하고 있는 700,000개의 검증자 중 일부에 불과합니다.
증명 생성에 얼마나 걸리나?
기본 성능 데이터를 수집하기 위해, 우리는 64개의 GPU 작업자가 있는 Bonsai 테스트 인스턴스를 시작했습니다. 그런 다음, 우리는 그것이 Zeth를 사용하여 블록 17735424(182개의 거래, 3242개의 조각, 또는 약 3.4B 주기)를 증명하도록 요청했습니다.
증명을 생성하기 위해, zkVM은 먼저 실행을 여러 조각으로 나누어야 합니다. 아래 스크린샷에서 Executor 작업이 이 과정을 포착했습니다. 이 작업은 10분 동안 실행되었습니다. (대부분의 시간은 AWS와 같은 작업을 수행하는 데 소요되었습니다). 로컬 머신에서 동일한 작업은 6분도 채 걸리지 않았습니다. 우리는 향후 1년 내에 이 시간을 크게 단축할 수 있기를 바랍니다.
Executor는 결국 실행을 3242개의 조각으로 나누었습니다. 64개의 GPU로는 이는 상당한 분할입니다. 따라서 각 작업자는 50개의 분할 증명을 생성해야 합니다. 아래 그림과 같이, 이는 35분이 걸렸습니다. 만약 우리가 50배의 작업자를 보유하고 있었다면, 단 42초가 걸렸을 것입니다.
분할 증명이 완료되면 롤업이 시작됩니다. 3242개의 조각이 있으므로, 우리는 log_2(3242) = 12회의 롤업 과정을 수행해야 합니다. 롤업의 초기 단계에서는 작업량이 작업자보다 많기 때문에, 첫 번째 단계는 1분, 두 번째 단계는 35초, 세 번째 단계는 25초가 걸렸습니다. 일곱 번째 단계에 이르러서는 시간이 5초 조금 넘게 안정화되었습니다. 마찬가지로, 더 많은 작업자가 있다면 각 단계는 5초만 소요됩니다.
롤업이 완료되면 결과가 최종 확정되며, 이 또한 1분이 소요됩니다.
따라서 클러스터 규모가 부족한 경우, 우리는 약 50분 안에 증명을 생성할 수 있었습니다(유효 속도는 1.1 MHz). 클러스터 규모가 적절하다면, 우리는 증명 생성 속도가 더 빨라질 것이라고 예상합니다:
완전 병렬 상태에서는 증명 단계가 42 + 12 * 5 + 60초 또는 2분 42초 내에 완료될 수 있습니다.
우리가 보수적으로 반올림하고 실행기 시간을 계산에 포함하면, 시간은 약 9에서 12분 사이가 될 것입니다(유효 속도는 4.7 MHz - 6.3 MHz).
우리는 실행기와 증명 프레임워크를 지속적으로 개선함에 따라, 향후 1년 내에 이 시간이 크게 단축될 것이라고 낙관하고 있습니다.

증명 생성의 자원 소모
위의 테스트 클러스터는 AWS에 배포되었습니다. 이는 64개의 g5.xlarge 증명 노드와 1개의 m5zn.xlarge 실행 노드로 구성되어 있습니다. 아마존에 따르면, 각 g5.xlarge 노드는 다음과 같습니다:
- 1개의 GPU, 24 GiB GPU 메모리
- 4개의 vCPU, 16 GiB 메모리
이 글을 작성할 당시, 이러한 인스턴스의 온디맨드 가격은 시간당 1.006달러, 예약 인스턴스의 할인 가격은 시간당 0.402달러입니다. 동시에, 아마존 사양표에 따르면 우리의 m5zn.xlarge 노드는 다음과 같습니다:
- 4개의 vCPU, 16GB 메모리
이 글을 작성할 당시, 해당 인스턴스의 온디맨드 가격은 시간당 0.3303달러입니다.
우리는 이러한 숫자를 사용하여 위에서 설명한 블록 17735424의 증명 비용을 대략적으로 추정할 수 있습니다.
우리가 64개의 증명 노드를 배포했으며, 이 배포에서 증명 생성에는 50분이 걸린다고 가정해 보겠습니다(엔드 투 엔드). 유휴 작업자 시간을 무시하면, 64개의 증명 노드와 1개의 실행 노드의 50분 비용은 50/60 * (64 * 0.402 + 0.3303) = 21.72달러입니다. 이는 유휴 작업자에게 비용을 지불한다고 가정하기 때문에 과대 추정된 숫자입니다. 유휴 작업자 비용을 고려하지 않으면(예: 그들을 종료하거나 다른 작업을 하게 하는 경우), 비용은 약 19.61달러입니다.
- 이 블록에는 182개의 거래가 있으며, 거래당 0.11달러입니다.
- 거래 총 가치는 1.125045057 Eth, 약 2137.59달러입니다. 따라서 1달러의 증명으로 109.01달러의 사용자 자금을 확보할 수 있습니다.
- 동일한 블록이 지급한 보상은 0.117623263003047027 Eth(거래 수수료 제외)입니다. 이 글을 작성할 당시, 이는 약 223.48달러입니다. 따라서 우리의 증명 비용은 블록 보상의 약 8.7%에 해당합니다.
- 거래 수수료는 총 0.03277635 Eth, 즉 62.28달러로, 이는 우리의 증명 비용의 3배가 넘습니다.
주목할 점은 이러한 달러 추정치가 클러스터의 규모와 무관하다는 것입니다! 중요한 것은 조각의 수입니다. 이는 1대의 머신이 순차적으로 2개의 작업을 수행하는 비용이 2대의 머신이 병렬로 1개의 작업을 수행하는 비용과 같기 때문입니다. 따라서 클러스터 규모가 더 크면 증명 생성 속도가 더 빨라지지만 비용은 더 높아지지 않습니다.
비용을 추가로 줄일 수 있는 몇 가지 방법이 있습니다. zkVM의 성능을 계속 향상시키거나 Keccak 가속기를 추가하는 것 외에도, 더 저렴한 인스턴스를 찾아볼 수 있습니다. 중요한 것은 우리가 사용하는 머신 사양이 낮기 때문에(그리고 우리의 zkVM이 nVidia Cuda 및 Apple Metal을 지원하기 때문에), 이 작업은 일반 소비자 PC와 Mac으로 구성된 P2P 네트워크를 통해 쉽게 수행할 수 있습니다.
체인 상 검증
앞서 언급한 바와 같이, 우리는 RISC Zero Groth16 검증기를 사용하여 Sepolia에서 Zeth 증명을 검증했습니다. 이는 RISC Zero 프로토콜 스택의 상대적으로 새로운 부분으로, 이달 초에 출시되었습니다. 이 기능은 Bonsai를 사용하여 zkVM의 원주율 STARK 증명을 동등한 SNARK 증명으로 변환하고, 해당 증명을 체인 상 SNARK 검증기에 제출하는 방식으로 작동합니다.
거래 입력을 UTF-8 데이터로 간주하면, 우리는 해당 증명이 블록 17735424에 해당함을 알 수 있습니다.

Bonsai를 사용하여 STARK에서 SNARK로의 변환은 약 40초가 소요되었습니다. SNARK의 체인 상 검증에는 245,129 가스가 소모되었습니다(이 글을 작성할 당시 약 5.90달러).
물론, zkVM의 장점 중 하나는 여러 증명을 하나로 병합할 수 있다는 것입니다. 이 기능을 통해 우리는 체인 상에서 전체 증명 세트를 검증할 수 있으며, 추가 가스를 사용하지 않고도 가능합니다. 이렇게 하면 체인 상 검증 비용이 전체 증명 세트에 분산되어 모든 사람의 비용을 줄일 수 있습니다.
이것이 이더리움에 의미하는 바
앞서 언급한 바와 같이, 이더리움은 설계 시 ZK 친화성을 고려하지 않았습니다. zkEVM의 경우에서 보듯이, 특히 연산 코드, 디지털 서명 및 해시 함수와 관련하여 많은 작업을 다른 방식으로 수행할 수 있습니다.
이러한 변경이 성능을 향상시키긴 했지만, 우리는 여전히 이러한 변경 없이도 안정적인 성능을 달성할 수 있습니다. 비탈릭이 작년 다양한 유형의 zkEVM에 대해 설명했을 때, 이더리움 블록의 유효성을 증명하는 데 몇 시간이 걸렸습니다. 그러나 이제 우리는 몇 분 안에 이를 완료할 수 있습니다. ZK 성능은 급속도로 향상되고 있으며, 우리는 이 추세가 향후 몇 년간 지속될 것이라고 믿을 이유가 있습니다.
부록: Zeth의 작동 원리
이 부분은 개발자를 위해 준비되었습니다.
대략적으로 말하자면, Zeth가 블록을 구축하는 방식은 전체 노드와 유사합니다: 우리는 부모 블록, 거래 목록 및 블록 작성자에서 시작하여 많은 계산(서명 검증, 거래 실행, 전역 상태 업데이트 등)을 수행한 후, 새로운 블록의 해시 값을 반환합니다.
그러나 전체 노드와 다른 점은 우리가 zkVM 내에서 이러한 작업을 수행한다는 것입니다. 이는 우리가 주어진 해시 값을 가진 블록이 유효하다는 것을 증명하는 ZK 증명을 얻는다는 것을 의미합니다.
물론, 이는 도전이 없는 것은 아닙니다. 이 섹션에서는 이러한 도전과 우리가 이를 어떻게 해결했는지에 대해 설명하겠습니다.
암호학
첫 번째 도전은 암호학입니다. 이더리움 블록을 구축하려면 많은 작업이 필요하며, 그 중 가장 중요한 것은 해시(Keccak-256) 및 서명 검증(ECDSA 및 secp256k1)입니다.
우리의 zkVM은 타원 곡선에 대한 가속 지원을 제공하므로 ECDSA 서명 검증은 어렵지 않습니다.
하지만 해시의 경우, 우리는 그렇게 운이 좋지 않았습니다. 우리의 zkVM은 Sha2-256에 대한 가속 지원을 제공하지만(이 글을 작성할 당시) Keccak-256은 지원하지 않습니다. 따라서 현재 우리는 sha3 Rust 크레이트의 Keccak 구현만 사용하고 있습니다. 분석을 통해 우리는 이 작업이 많은 주기를 소모한다는 것을 알고 있습니다. 이는 최적의 솔루션은 아니지만, 우리의 zkVM은 이를 처리할 수 있으며, 우리는 이를 반복적으로 사용하고 나중에 Keccak 가속기를 추가할 수 있습니다.
계정 및 저장소: 성능과 보안
이더리움에서 계정과 저장소는 전 세계 Merkle Patricia Trie(MPT)에 의해 추적됩니다.
Etherscan의 데이터에 따르면, 이 글을 작성할 당시 이 트리는 약 250,000,000개의 고유 이더리움 주소의 상태를 포함하고 있습니다. 전체적으로 볼 때, 이는 그리 큰 데이터량은 아니지만, 우리는 그 저장 및 사용 방식에 대해 신중해야 합니다. 특히 MPT의 성능은 매우 중요합니다.
그러나 성능만이 유일한 요소는 아니며, 우리는 보안성도 고려해야 합니다.
Zeth의 블록 생성기는 고객의 신분으로 zkVM 내에서 실행됩니다. 이는 이더리움 P2P 네트워크나 다른 RPC 제공자에 직접 접근할 수 없음을 의미합니다. 대신, zkVM 외부에서 실행되는 독립 프로그램이 제공하는 데이터에 의존해야 합니다.
ZK 애플리케이션의 보안을 분석할 때, 우리는 외부 프로그램이 악의적일 수 있다고 가정해야 하며, 따라서 악의적인 데이터를 제공할 수 있습니다. 이러한 상황을 방지하기 위해, ZK 애플리케이션은 제공된 데이터가 유효한지 검증해야 합니다.
Zeth 블록 생성기에게는 모든 관련 계정 및 저장소 상태(즉, 주어진 거래 목록을 실행하는 데 필요한 계정 및 저장소)를 검증해야 한다는 의미입니다.
다행히도, EIP-1186은 주어진 계정(및 그 저장소) 상태를 Merkle 포함을 통해 증명하는 표준 방법을 정의하는 메커니즘을 제공합니다.
원칙적으로, Zeth의 블록 생성기는 EIP-1186 포함 증명을 검증하여 계정 및 저장소 상태를 검증할 수 있습니다. 그러나 이 방법은 이상적이지 않습니다.
대신, EIP-1186 포함 증명에 있는 데이터를 사용하여 부분 MPT를 구축하는 것이 더 좋습니다. 이는 주어진 거래 목록과 관련된 노드만 포함하는 MPT입니다. 관련 없는 분기는 해당 해시 값으로만 표시됩니다. 부분 MPT를 Merkle 포함 증명의 "결합"으로 간주할 수 있으며, 원하신다면 Merkle 부분 집합 증명으로 간주할 수도 있습니다.
부분 MPT를 검증하는 과정은 일반 EIP-1186 증명을 검증하는 것과 기본적으로 동일합니다: 루트 해시 값을 계산한 후, 부모 블록의 상태 루트와 비교합니다. 두 값이 같다면, 해당 계정과 저장소의 무결성을 신뢰할 수 있습니다.
부분 MPT가 검증된 후, 거래를 적용하고 부분 MPT를 업데이트할 수 있습니다. 새로운 상태 루트는 부분 MPT의 새로운 루트 해시 값을 계산하여 얻을 수 있습니다.
- Zeth 블록 생성기를 실행하기 전에, 우리는 샌드박스에서 거래 목록을 실행하여 어떤 계정과 저장소가 관련이 있는지 확인합니다. (이 과정은 또한 가장 오래된 관련 이전 블록을 확인하여 blockhash() 쿼리를 지원하는 데 필요합니다).
- 우리는 각 관련 계정 및 저장소에 대해 EIP-1186 포함 증명을 가져옵니다. (우리는 관련된 이전 블록도 가져옵니다).
- 우리는 이러한 포함 증명을 사용하여 모든 관련 데이터를 포함하는 부분 MPT를 구축합니다.
- 우리는 zkVM을 시작하여 Zeth 블록 생성기를 실행하고 부분 MPT 및 기타 입력(부모 블록, 거래 목록 등)을 제공합니다.
zkVM 내에서 Zeth 블록 생성기는:
- 부분 MPT 루트가 부모 블록의 상태 루트와 일치하는지 검증합니다.
- 부모 블록까지의 이전 블록의 해시 체인을 검증합니다.
- 거래를 적용합니다.
- 부분 MPT를 업데이트합니다.
- 부분 MPT의 새로운 루트 해시 값을 새로운 블록의 상태 루트로 사용합니다.
Zeth 블록 생성기가 완료되면, 새로운 블록의 해시 값을 출력합니다.
이 해시 값은 부모 블록에 대한 약속을 포함하므로, 부모 블록의 상태 루트도 포함됩니다(원래의 부분 MPT를 검증하는 데 사용됨). 이는 악의적인 검증자가 유효하지 않은 부모 블록을 제공하지 않는 한, 계정과 저장소에 대해 유효하지 않은 데이터를 제공할 수 없음을 의미합니다.
다시 말해: 부모 블록이 유효하다면, Zeth가 생성한 새로운 블록도 유효합니다.
따라서 누군가 Zeth가 생성한 새로운 블록과 ZK 증명을 제공한다면, 다음 세 가지를 확인하여 해당 블록의 유효성을 검사할 수 있습니다:
- ZK 증명이 유효하고 Zeth에서 온 것인지 확인합니다. 체인 외 애플리케이션의 경우, zkVM Rust 크레이트에서 제공하는 함수를 사용하여 확인할 수 있습니다. 체인 상 애플리케이션의 경우, 우리의 체인 상 증명 검증기를 사용하여 확인할 수 있습니다.
- ZK 증명이 새로운 블록의 해시 값을 제출했는지 확인합니다.
- 부모 블록이 예상하는 해시 값을 가지고 있는지 확인합니다.
이 모든 것이 확인되면, 새로운 블록은 유효합니다.
한계 및 향후 개선 사항
우리 프로젝트의 목표는 블록 구성 성능을 연구하는 것입니다. 이를 위해 우리는 범위를 병합된 블록으로 제한하기로 결정했습니다.
또한, Zeth가 주어진 블록이 유효하다는 것을 증명할 수 있지만, 현재로서는 합의(즉, 해당 블록이 정규 체인에 포함되어 있다는 것)를 증명할 수는 없습니다. 이는 향후 변경될 수 있으며, zkVM 내에서 검증자 또는 동기화 위원회의 서명을 검증하는 방법을 추가하여 해결할 수 있을 것입니다.
마지막으로, Zeth는 새로운 소프트웨어입니다. 우리는 이더리움 테스트 스위트와 다양한 실제 블록을 포함한 몇 가지 테스트를 수행했지만, Zeth는 여전히 몇 가지 버그를 포함하고 있을 수 있습니다. 이 글을 작성할 당시, Zeth는 실험적 소프트웨어로 간주되어야 합니다.













