Stable EVM

Stable EVM Stable EVM은 Stable의 Ethereum 호환 실행 계층으로, MetaMask와 같은 기존 Ethereum 도구 및 지갑을 사용하여 체인과 원활하게 상호작용할 수 있도록 합니다. Stable EVM은 EVM의 개발자 경험과 StableSDK의 모듈러한 고성능 인프라를 결합합니다. Stable EVM과 StableSDK 간의 간극을 메우기 위해, Stable EVM은 일련의 프리컴파일을 도입합니다. 이 프리컴파일들은 EVM 스마트 컨트랙트가 StableSDK의 네이티브 모듈 기능에 접근할 수 있도록 하며, 핵심 체인 로직을 안전하고 아토믹하게 호출할 수 있게 합니다. 이러한 설계는 스마트 컨트랙트가 토큰 전송, 스테이킹, 거버넌스 참여와 같은 특별한 작업을 수행할 수 있도록 합니다.

향후 로드맵 1: 낙관적 병렬 실행

역사적으로, 블록체인 시스템은 각 트랜잭션이 순차적으로 하나씩 처리되는 ‘순차 실행’에 의존해 왔으며, 이는 모든 노드에서 결정론적인 상태를 보장하기 위함이었습니다. 이러한 설계는 일관성을 보장하지만, 동시에 처리량과 확장성에 심각한 제약을 만듭니다. 특히 현대 블록체인이 수만 건의 TPS를 지원하고자 할 때 더욱 그러합니다. 이 제약을 극복하기 위해, Stable은 낙관적 병렬 실행(Optimistic Parallel Execution, OPE) 을 가능하게 하는 검증된 병렬 실행 엔진인 Block-STM을 채택하고 있습니다. 이를 통해 트랜잭션은 결정론성을 유지하면서 병렬로 실행될 수 있으며, 성능이 크게 향상됩니다.

Block-STM 작동 방식

Block-STM은 낙관적 동시성 제어 메커니즘을 활용합니다. 트랜잭션은 충돌이 없다는 가정 하에 병렬로 먼저 실행되며, 이후 검증 단계에서 충돌이 감지되면 재실행을 통해 처리됩니다. 이 과정은 다음 다섯 가지 핵심 기술에 기반합니다: 1. 다중 버전 메모리 구조 (Multi-Version Memory Structure) Block-STM은 각 메모리 키에 대해 여러 버전을 저장합니다:
  • 각 트랜잭션은 이전 트랜잭션이 커밋한 최신 버전을 읽습니다.
  • 실행 중의 읽기와 쓰기 모두 버전이 지정됩니다.
  • 이후 검증 시 이러한 버전들에 대한 일관성 검사를 통해 충돌 여부를 판단합니다.
2. Read-Set / Write-Set 기반 검증
  • 각 트랜잭션은 실행 중 읽은 키와 버전을 Read-Set에 기록합니다.
  • 실행이 끝나면 Write-Set이 다중 버전 메모리에 기록됩니다.
  • 검증 과정에서 다른 트랜잭션이 해당 Read-Set의 키를 수정한 경우, 이는 충돌로 간주되어 트랜잭션은 중단되고, 반복 시도 번호(incarnation number)를 증가시켜 재실행됩니다.
3. ESTIMATE 마커를 이용한 빠른 충돌 감지
  • 트랜잭션이 실패하면 해당 Write-Set은 ESTIMATE 플래그로 마크됩니다.
  • 다른 트랜잭션이 ESTIMATE로 표시된 값을 읽으면 (READ_ERROR 가 발생하면) 즉시 중단하고 재실행을 대기합니다.
  • 이를 통해 전체 트랜잭션을 다시 실행하지 않고도 의존 관계를 빠르게 식별할 수 있습니다.
4. 사전 정의된 트랜잭션 순서
  • 블록 내 모든 트랜잭션은 사전 정의된 결정론적 순서에 따라 실행됩니다.
  • 검증 및 커밋 단계 또한 동일한 순서를 따릅니다.
  • 이를 통해 병렬 실행 환경에서도 모든 노드가 동일한 최종 상태에 도달하도록 보장합니다.
5. 협업 스케줄러
  • 협업 스케줄러는 실행 및 검증 워커 간에 작업을 스레드-세이프 방식으로 분배합니다.
  • 인덱스가 낮은 트랜잭션을 우선 처리하여, 조기 커밋을 가속화하고 재실행을 최소화합니다.
  • 스케줄러는 트랜잭션의 반복 시도 번호를 관리하며, 성공적으로 커밋될 때까지 반복 실행합니다.

Block-STM의 주요 이점

  • 락 없이 병렬성 실현: MVCC(Multi-Version Concurrency Control)를 활용하여, Block-STM은 뮤텍스 락 없이 여러 트랜잭션의 동시 읽기/쓰기를 가능하게 합니다. 충돌 검사는 실행 이후에만 수행되므로, 초기 처리 단계에서 최대 처리량을 확보할 수 있습니다.
  • ESTIMATE 마커를 통한 최소한의 오버헤드: 실패한 트랜잭션은 자신의 Write-Set에 ESTIMATE 마커를 설정하여, 여기에 의존하는 트랜잭션을 조기에 중단하고 불필요한 실행을 피할 수 있도록 합니다. 이로 인해 유효한 실행 경로에 더 빠르게 도달할 수 있습니다.
  • 효율적인 스케줄링 및 우선 커밋: 협업 스케줄러를 통해 인덱스가 낮은 트랜잭션을 우선 커밋함으로써, 재시도를 최소화합니다. 이는 전체 처리량을 개선하고 실행 주기를 단축시킵니다.
  • 결정론성과 합의 호환성: 모든 트랜잭션은 고정된 순서를 따르므로, 재실행된 트랜잭션도 결국 동일한 순서로 커밋됩니다. 이를 통해 모든 노드 간 안전하고 결정론적인 상태 합의가 가능하며, 병렬화된 환경에서도 합의 무결성이 유지됩니다.

Stable의 OPE

Optimistic Parallel Execution on Stable Stablechain은 낙관적 병렬 실행(OPE) 을 실행 계층의 핵심 기능으로 통합할 예정이며, 이는 낙관적 블록 처리(Optimistic Block Processing, OBP) 와 함께 사용됩니다. OPE와 OBP는 서로 보완적이지만 본질적으로 다른 전략이라는 점에 유의해야 합니다.

OBP란

  • OBP는 병렬 전략이 아니라, 실행 타이밍과 관련이 있습니다.
  • ProcessProposal 단계에서, Stable은 다른 노드에 블록이 전파되는 동안 해당 블록을 미리 실행합니다.
  • 결과 상태는 메모리에 캐시되며, 이는 FinalizeBlock 단계에서 재사용되어 불필요한 시간 낭비와 중복된 연산을 줄입니다.
OPE와 OBP를 결합함으로써, Stable은 실행 지연과 리소스 충돌을 모두 최소화하고, 높은 트랜잭션 부하 환경에서도 우수한 성능을 제공합니다.

예상 성능 향상

내부 벤치마크에 따르면, Block-STM 기반 OPEStableDB 통합을 통해 Stable은 전체 트랜잭션 처리량에서 최소 2배 이상의 향상을 달성할 수 있습니다.

향후 로드맵 2: StableVM++

OPE 및 OBP와 같은 노력은 다수의 트랜잭션을 동시에 실행하는 방식을 최적화 하는 데 초점을 맞추지만, 또 하나의 핵심 성능 요소는 각 개별 트랜잭션을 얼마나 효율적으로 처리할 수 있는가입니다. Stable은 현재 실행 속도를 높이기 위해 대체 EVM 구현체들을 탐색하는 중입니다. 그중에서도 C++로 작성된 고성능 EVM인 EVMONE이 기존의 Go 기반 EVM을 대체할 유력한 후보로 떠오르고 있습니다. EVMONE으로의 전환은 이론적인 벤치마크 기준으로 최대 6배의 EVM 실행 성능 향상을 가져올 것으로 기대됩니다.