왜 "소형 모드" zkEVM이 더 효율적이라고 말할까요?
저자: Fox Tech CEO 강수약, Fox Tech CTO 린옌시
서론: 이더리움 가상 머신은 이더리움 블록체인 위에 구축된 코드 실행 환경으로, 계약 코드는 외부와 완전히 격리되어 EVM 내부에서 실행됩니다. 그 주요 기능은 이더리움 시스템 내의 스마트 계약을 처리하는 것입니다. 이더리움이 튜링 완전하다고 말하는 이유는 개발자가 Solidity 언어를 사용하여 EVM에서 실행되는 애플리케이션을 만들 수 있기 때문이며, 모든 계산 가능한 문제를 계산할 수 있습니다. 그러나 튜링 완전함만으로는 충분하지 않으며, 사람들은 EVM을 ZK 증명 시스템에 포장하려고 시도하고 있지만, 포장 시 많은 중복이 발생하는 문제가 있습니다. Fox가 발명한 "소표 모드" zkEVM은 원래의 Solidity 이더리움 개발자가 zkEVM으로 원활하게 이전할 수 있도록 보장하면서, EVM을 ZK 증명 시스템으로 포장할 때 발생하는 중복 비용을 대폭 줄입니다.
EVM은 2015년 출시 이후 서사시적인 ZK 변화를 겪고 있습니다. 이 대변화는 주로 두 가지 방향으로 진행됩니다.
첫 번째 방향은 이른바 zkVM 트랙으로, 이 트랙 프로젝트는 애플리케이션의 성능을 최적화하는 데 전념하고 있으며, 이더리움 가상 머신과의 호환성은 주요 고려 사항이 아닙니다. 여기에는 두 가지 하위 방향이 있습니다. 첫 번째는 자체 DSL(도메인 특화 언어)을 만드는 것이며, 예를 들어 StarkWare는 Cairo 언어의 보급에 힘쓰고 있습니다. 두 번째는 기존의 비교적 성숙한 언어와의 호환성을 목표로 하며, 예를 들어 RISC Zero는 zkVM이 C++/Rust와 호환되도록 노력하고 있습니다. 이 트랙의 난점은 ISA 명령어 집합을 도입함으로써 최종 출력의 제약이 더 복잡해진다는 것입니다.
두 번째 방향은 이른바 zkEVM 트랙으로, 이 트랙 프로젝트는 EVM 바이트코드의 호환성에 전념하고 있으며, 즉 바이트코드 수준 및 그 이상의 EVM 코드가 ZkEVM을 통해 해당하는 제로 지식 증명을 생성합니다. 이로 인해 원래의 Solidity 이더리움 개발자는 비용 없이 zkEVM으로 이전할 수 있습니다. 이 트랙의 주요 선수로는 Polygon zkEVM, Scroll, Taiko 및 Fox가 있습니다. 이 트랙의 난점은 EVM과 같은 시스템이 ZK 증명 시스템에 포장될 때 발생하는 중복 비용에 대한 호환성입니다. Fox는 오랜 시간 동안의 고민과 검증을 통해 첫 번째 세대 zkEVM의 막대한 중복을 근본적으로 줄일 수 있는 열쇠인 "소표 모드" zkEVM을 찾았습니다.
데이터와 증명 회로는 zkEVM이 증명을 생성하는 두 가지 핵심 요소입니다. 한편, zkEVM에서 증명자는 모든 거래에 관련된 데이터를 필요로 하며, 거래가 가져오는 상태 전이가 올바르다는 것을 증명해야 합니다. 그러나 EVM의 데이터 양이 많고 구조가 복잡합니다. 따라서 증명에 필요한 데이터를 정리하고 조직하는 방법은 효율적인 zkEVM을 구축하는 데 신중하게 고려해야 할 문제입니다. 다른 한편으로는 일련의 회로 제약을 통해 계산 실행의 유효성과 정확성을 효율적으로 증명(또는 검증)하는 방법이 zkEVM의 안전성을 보장하는 기초입니다.
우리는 먼저 두 번째 문제에 대해 이야기하겠습니다. 이는 zkEVM을 설계하는 모든 팀이 고려해야 할 문제이며, 이 문제의 본질은 "우리가到底 무엇을 증명해야 하는가?"입니다. 현재 모두가 이 문제에 대한 접근 방식은 유사합니다. 하나의 거래(또는 그와 관련된 op-code)는 다양할 수 있기 때문에, 각 단계의 작업이 가져오는 상태 변화를 순서대로 증명하는 것은 비현실적입니다. 따라서 우리는 분류하여 증명해야 합니다.
그림 1: 대표, 소표 두 세대 zkEVM 해결책
예를 들어, 우리는 스택에서 요소의 변화가 있을 때마다 이를 하나의 블록으로 묶어 스택 회로 증명을 위해 전용으로 작성하고, 순수한 산술 작업을 위해 전용 산술 회로를 작성하는 등의 방식으로 진행할 수 있습니다. 이렇게 하면 각 회로가 고려해야 할 상황이 상대적으로 단순해집니다. 이러한 다양한 기능의 회로는 서로 다른 zkEVM에서 다른 이름으로 불리며, 어떤 사람들은 이를 회로라고 부르기도 하고, 어떤 사람들은 (하위) 상태 기계라고 부르기도 하지만, 이 사고의 본질은 동일합니다.
이렇게 하는 의미를 더 명확하게 설명하기 위해 예를 들어 보겠습니다. 지금 덧셈 작업(스택의 상위 2개 요소를 꺼내고 그 합을 스택의 맨 위에 놓는 작업)을 증명해야 한다고 가정해 보겠습니다:
원래 스택이 [1,3,5,4,2]라고 가정하면,
분류하지 않고 분해하지 않으면, 우리는 위의 작업을 수행한 후 스택이 [1,3,5,6]로 변하는 것을 증명해야 합니다.
그러나 분류하여 분해하면, 우리는 다음 몇 가지 사항을 각각 증명하기만 하면 됩니다:
- 스택 회로:
- C1: [1,3,5,4,2]에서 2와 4를 팝한 후 [1,3,5]로 변하는 것을 증명합니다.
- C2: [1,3,5]에서 push(6) 후 [1,3,5,6]로 변하는 것을 증명합니다.
- 산술 회로:
- C3: a=2, b=4, c=6, a+b=c를 증명합니다.
증명의 복잡성은 회로가 고려해야 할 다양한 상황의 수와 관련이 있으며, 분류하지 않으면 회로가 커버해야 할 가능성이 매우 커질 것입니다.
그림 2: 첫 번째 세대 zkEVM에서 사용된 대표 모드
분류하여 분해하면 각 부분의 상황이 상대적으로 단순해져 증명의 난이도가 크게 줄어듭니다.
그러나 분류하여 분해하는 것은 다른 문제를 초래할 수 있습니다. 그것은 서로 다른 종류의 회로 간 데이터 일관성 문제입니다. 예를 들어 위의 예에서 우리는 실제로 다음 두 가지 사항을 증명해야 합니다:
- C4: "C1에서 팝한 수" = "C3의 a와 b"
- C5: "C2에서 푸시한 수" = "C3의 c"
이 문제를 해결하기 위해 우리는 첫 번째 문제로 돌아가야 합니다. 즉, 거래에 관련된 데이터를 어떻게 조직할 것인가에 대한 문제입니다. 이 주제를 계속 탐구하겠습니다.
직관적인 방법은 다음과 같습니다: trace를 통해 모든 거래에 관련된 각 단계를 분해하여 관련된 데이터를 파악하고, trace에 없는 데이터를 얻기 위해 노드에 요청을 보내며, 이후 이를 다음과 같이 큰 표 T로 배열합니다:
"첫 번째 작업" "첫 번째 작업에 관련된 데이터"
"두 번째 작업" "두 번째 작업에 관련된 데이터"
…
"n번째 작업" "n번째 작업에 관련된 데이터"
이렇게 하면 위의 예에서 우리는 다음과 같은 한 줄을 기록하게 됩니다:
"k번째 작업: 덧셈" "a=2, b=4, c=6"
위의 C4는 다음과 같이 증명될 수 있습니다:
- C4(a): C1에서 팝한 수와 큰 표 T의 k번째 작업이 일치합니다.
- C4(a): C3의 a와 b가 큰 표 T의 k번째 작업과 일치합니다.
C5도 비슷합니다. 이 작업(어떤 요소가 표에 나타났음을 증명하는 것)은 lookup이라고 불립니다. lookup의 구체적인 알고리즘은 본문에서 자세히 설명하지 않지만, lookup 작업의 복잡성은 큰 표 T의 크기와 밀접한 관련이 있음을 상상할 수 있습니다. 따라서 이제 우리는 첫 번째 문제로 돌아갑니다: 증명에 사용할 데이터를 어떻게 조직할 것인가요?
그림 3: Fox가 발명한 "소표 모드" zkEVM
우리는 다음과 같은 일련의 표를 구성하는 것을 고려합니다:
표 Ta:
"유형 a의 첫 번째 작업" "유형 a의 첫 번째 작업에 관련된 데이터"
"유형 a의 두 번째 작업" "유형 a의 두 번째 작업에 관련된 데이터"
…
"유형 a의 m번째 작업" "유형 a의 m번째 작업에 관련된 데이터"
표 Tb:
"유형 b의 첫 번째 작업" "유형 b의 첫 번째 작업에 관련된 데이터"
"유형 b의 두 번째 작업" "유형 b의 두 번째 작업에 관련된 데이터"
…
"유형 b의 m번째 작업" "유형 b의 m번째 작업에 관련된 데이터"
…
이렇게 여러 개의 소표를 구성하는 것은, 필요한 데이터와 관련된 작업의 유형에 따라 해당 소표에서 직접 lookup을 수행할 수 있어 효율성을 크게 향상시킬 수 있습니다.
간단한 예를 들어 보겠습니다(우리가 매번 하나의 요소만 lookup할 수 있다고 가정할 때). 만약 우리가 a~h 이 8개의 문자가 [a,b,c,d,e,f,g,h]에 모두 존재함을 증명해야 한다면, 우리는 크기가 8인 표에 대해 8번의 lookup을 수행해야 하지만, 만약 우리가 표를 [a,b,c,d]와 [e,f,g,h]로 나눈다면, 우리는 각각 크기가 4인 두 개의 표에 대해 4번의 lookup만 수행하면 됩니다!
FOX라는 이 레이어2의 zkEVM에서는 이러한 소표 디자인을 사용하여 효율성을 높이고 있으며, 다양한 상황에서 완전한 증명을 보장하기 위해 구체적인 소표 분할 방식은 신중하게 설계해야 하며, 효율성을 높이는 핵심은 표의 내용 분류와 크기 균형에 있습니다. 비록 이 프레임워크 내에서 완전한 zkEVM을 구현하는 데는 막대한 작업량이 필요하지만, 우리는 이러한 zkEVM이 성능 면에서 혁신적인 진전을 이룰 것으로 기대합니다.
결론: Fox가 발명한 "소표 모드" zkEVM은 원래의 Solidity 이더리움 개발자가 zkEVM으로 비용 없이 이전할 수 있도록 보장하면서, EVM을 ZK 증명 시스템으로 포장할 때 발생하는 중복 비용을 대폭 줄입니다. 이는 zkEVM 구조의 중대한 혁신으로, 이더리움 확장 솔루션에 깊은 영향을 미칠 것입니다.