패러다임: 이더리움 상태 성장의 도전과 해결책
저자: Storm Slivkoff, Georgios Konstantopoulos
편집: Luffy, Foresight News
이더리움 상태 성장과 가스 제한의 관계는 널리 오해되고 있다. 사람들은 일반적으로 상태 성장이 이더리움의 주요 확장 병목이라고 생각한다. 그러나 상태 성장에 대한 논의는 종종 용어의 부정확성과 상세한 정량적 증거의 부족으로 인해 방해받는다.
데이터 기반 접근 방식을 채택하면 상태 성장 문제를 더욱 명확하게 이해할 수 있다. 본 문서에서는 고해상도 데이터 세트를 활용하여 상태 성장의 크기와 형태를 이해한다. 이 과정에서 우리는 놀라운 결론에 도달했다: 현대 소비 하드웨어는 현재의 상태 성장률을 최소 10년 동안 유지할 수 있다. 또한 소프트웨어와 하드웨어의 지속적인 개선을 고려할 때, 이 경로는 무기한 연장될 수 있다.
우리는 이더리움이 명확한 로드맵을 가지고 있다고 믿는다: 1) 상태 성장을 확장 병목으로서 완전히 제거하기; 2) 가스 제한을 글로벌 규모의 탈중앙화 금융 시스템을 지원할 수 있는 수준으로 높이기. 본 문서 시리즈의 목표는 이러한 확장 로드맵을 이해하고 개발하기 위한 과학적 방법을 만드는 것이다.
이 문서는 이더리움 확장 시리즈의 첫 번째 부분으로, 주로 상태 성장에 대해 다루며, 두 번째 부분은 역사적 성장에 관한 것이고, 세 번째 부분은 상태 접근에 관한 것이며, 네 번째 부분은 가스 제한에 관한 것이다.
상태 성장란 무엇인가?
"상태 성장"이라는 용어는 일반적으로 이더리움의 확장 병목을 포괄적으로 설명하는 데 사용되며, 이는 데이터 크기가 이더리움 노드 하드웨어의 용량을 초과하는 것을 의미한다. 그러나 상태 성장은 이러한 단일한 방식으로 생각해서는 안 된다. 이더리움 데이터는 여러 유형이 있으며, 각 유형은 노드의 기본 하드웨어 구성 요소와 독특한 관계를 가진다. 따라서 각기 다른 확장 병목을 설명하기 위해 정확한 용어를 사용하는 것이 중요하다.
상태는 새로운 이더리움 블록을 구축하고 검증하는 데 필요한 데이터 집합이다. 상태는 계약 바이트코드, 계약 저장소, 계좌 잔액 및 계좌 랜덤 배열로 구성된다. 역사는 노드가 제네시스 블록에서 최신 블록으로 동기화하는 데 필요한 데이터 집합이다. 역사는 블록과 거래로 구성된다. 상태와 역사는 겹치지 않는 데이터 집합이다. 이러한 정의에 따르면, 적어도 3가지 서로 다른 현상이 노드의 하드웨어에 큰 압박을 가한다:
- 상태 성장: 새로운 계좌, 새로운 계약 바이트코드, 새로운 계약 저장소의 축적.
- 역사 성장: 새로운 블록과 새로운 거래의 축적.
- 상태 접근: 블록을 구축하고 검증하는 데 필요한 일련의 읽기 및 쓰기 작업.
각 병목은 노드의 하드웨어 제한과 독특한 관계를 가진다. 가장 관련성이 높은 네 가지 하드웨어 제한은 다음과 같다:
- 네트워크 IO는 노드가 피어 노드와 안정적인 합의를 이루기 위해 유지해야 하는 업로드 및 다운로드 속도량이다.
- 저장소 크기는 노드가 블록을 구축, 검증 및 배포하기 위해 영구 저장소에 저장해야 하는 데이터 양이다.
- 메모리 크기는 노드가 블록체인의 끝과 동기화하기 위해 메모리에 캐시해야 하는 데이터 양이다.
- 저장소 IO는 노드가 블록체인 끝과 동기화하기 위해 매초 수행해야 하는 읽기 및 쓰기 작업의 양이다.
이러한 병목과 하드웨어 제한 간의 관계는 그림 1에 나타나 있다.
그림 1: 이더리움 확장 병목
그림의 상단에서 시작하면, 이더리움이 거래를 실행할 때마다 해당 거래에 사용되는 모든 자원은 가스 가격으로 책정된다. 따라서 이더리움의 가스 제한은 모든 형태의 온체인 활동에 대한 속도 제한을 하는 단일 차원량이다. 가스 제한의 하위는 블록 크기와 각 블록의 작업이다. 각 블록의 바이트가 많을수록 역사 기록이 더 빨리 증가한다. 각 블록의 IO 작업이 많을수록 상태 접근률이 높아지고 (일반적으로) 상태 성장률도 증가한다.
따라서 확장 병목은 노드의 하드웨어 제약과 관련이 있다:
- 대량의 상태 성장을 지원하기 위해 노드는 충분한 저장소와 메모리 공간을 가져야 한다. 상태가 너무 커지면 저장소에 수용할 수 없거나 상태의 빈번한 접근 부분이 메모리에 포함될 수 없어 성능이 저하된다.
- 대량의 역사 성장을 지원하기 위해 노드는 많은 블록 데이터를 공유할 수 있는 충분한 네트워크 대역폭과 해당 데이터를 저장할 수 있는 충분한 저장 용량을 가져야 한다.
- 대량의 상태 접근을 지원하기 위해 노드는 핫 상태를 캐시할 수 있는 많은 메모리와 충분한 읽기 및 쓰기 작업을 지원할 수 있는 많은 저장소 IO를 가져야 한다.
특히 상태 성장에 대해 주요 도전 과제는 상태 규모의 성장 속도가 소비자 하드웨어의 지속적인 개선 속도를 초과하지 않도록 하는 것이다. 노드 메모리와 저장소는 제한된 자원이므로 상태가 성장하지 않거나 하드웨어가 정기적으로 업그레이드되지 않는 한 결국 병목에 도달할 것이다. 다행히도, 메모리와 저장소 하드웨어는 수년 동안 개선되어 왔다. 그럼에도 불구하고 이러한 개선에 대한 정확한 예측은 여전히 불확실하며, 그들의 빠른 성장이 무기한 지속될 것이라고 가정해서는 안 된다.
곧 출시될 EIP-4844에서 도입되는 데이터 블롭은 이러한 확장 관계에 일부 변화를 가져올 것이다. EIP-4844 이후에는 디스크에 축적된 역사 기록이 훨씬 적을 것으로 예상되며, 대량의 블롭 데이터를 전송할 때 네트워크 IO가 크게 증가할 수 있다.
본 문서에서는 메모리 크기와 상태 접근 패턴이 아닌 상태 크기와 상태 성장률에 주로 초점을 맞출 것이다. 우리는 향후 작업에서 다른 주제를 연구할 것이다.
이더리움 상태의 구성
상태 성장을 이해하는 다음 단계는 상태의 총 규모와 각 상태 기여의 크기를 조사하는 것이다. 현재 이더리움 상태 데이터의 양은 약 245.5 GB이다. 이 숫자는 reth 노드를 사용하여 측정된 것이지만, 각 노드 클라이언트의 숫자는 대략 비교할 수 있으며, 표와 같이 나타난다. 계좌, 계약 바이트코드 및 계약 저장소는 각각 상태의 14.1%, 4.3% 및 81.7%를 차지한다.
그림 2는 각종 스마트 계약 프로토콜이 얼마나 많은 상태 규모를 차지하는지를 보여준다. 아래 그림에서 각 계약 범주의 크기는 그 저장 슬롯과 바이트코드가 차지하는 바이트 수를 나타낸다.
그림 2: 이더리움 상태 분포
그림 2의 숫자는 노드 클라이언트가 디스크에 저장해야 하는 총 바이트 수를 나타낸다. 여기에는 인덱스 사용 데이터와 기타 유형의 저장 오버헤드가 포함된다. 각 계좌와 각 저장 슬롯의 평균 저장 크기는 각각 133.6 바이트와 191.3 바이트이다.
다음은 그림 2에서 가장 중요한 정보 중 일부이다:
- 토큰은 상태의 최대 기여자이다. 이더리움 상태의 최대 기여자는 ERC-20 및 ERC-721 토큰으로, 각각 상태의 27.2% 및 21.6%를 차지한다. 토큰이 이렇게 많은 상태를 차지하는 이유는 각 토큰의 각 사용자 잔액이 자신의 32 바이트 저장 슬롯에 개별적으로 저장되어야 하기 때문이다. 따라서 이더리움 상태 규모의 절반은 이더리움 사용자 총 수와 각 사용자가 보유한 토큰 총 수에 비례한다.
- 이더리움의 최소 7.4%의 상태는 휴면 상태에 있다. 이더리움 상태의 일부 가장 큰 계약은 더 이상 활성화되지 않는다. 이러한 프로토콜은 블록 공간과 상태 공간이 현재보다 훨씬 저렴했던 시기에 출시되었으며, 게임, 도박 및 사기 범주에 있는 대부분의 프로토콜과 더 이상 활성화되지 않는 많은 DEX(예: IDEX, Etherdelta 및 Oasis)를 포함한다. 이러한 프로토콜은 총 이더리움 상태의 최소 7.4%를 구성한다. 휴면 상태의 실제 수준은 더 높으며, 이는 ERC-20, ERC-721 및 기타 범주에서의 롱테일 프로젝트도 포함된다.
- L2 크로스체인 브릿지는 이더리움 상태의 2% 미만을 차지한다. 압축, ZK 증명 및 개선된 인코딩과 같은 기술을 활용함으로써 L2 거래는 메인넷보다 상태를 더 효율적으로 활용한다. L2가 메인넷 상태의 2%에 불과하지만, L2의 총 거래 수는 메인넷보다 5배 더 많다.
이더리움 상태는 얼마나 빨리 성장하는가?
상태 성장의 가장 중요한 측면은 시간에 따른 상태 성장률의 변화이다. 이 비율은 상태 문제의 심각성과 그 변화 추세를 드러낸다.
그림 3은 2015년 이더리움 설립 이후의 상태 성장률을 보여준다. 이 성장률은 각 계약 범주 내의 계약 바이트코드와 계약 저장소를 합산하여 계산되었다.
그림 3: 이더리움 상태의 시간에 따른 성장
다음은 그림 3에서 가장 중요한 정보 중 일부이다:
- 현재 상태는 매월 약 2.62 GB 성장하고 있으며, 이는 매월 5.99 GB의 정점보다 낮다. 이러한 숫자를 통해 5년 내에 상태 총 규모가 396 GB에서 606 GB 사이에 이를 것으로 예측할 수 있다. 현재의 성장률을 연간 12.8%로 설명할 수 있지만, 상태가 지속적으로 성장하는 동안 절대 성장률은 계속 감소하고 있으므로 단순한 지수 성장은 적합한 모델이 아닐 수 있다.
- 최근 상태 성장의 감소는 NFT 활동의 감소로 인한 것이다. 사람들은 다양한 유형의 네트워크 활동 간에 일정한 상관관계가 있을 것으로 기대할 수 있지만, 각 상태 기여자 간에는 놀라운 독립성이 존재한다. 예를 들어, 지난 몇 년 동안 총 상태 성장률이 감소했음에도 불구하고, 2020년 이후 ERC-20 상태 성장률은 실제로 매년 증가하고 있다.
- 상태 성장은 2021년 이후 최저 수준에 도달했다. 이러한 감소는 상당히 놀랍지만, 상태가 주로 새로운 토큰 잔액과 비례하기 때문에 이해할 수 있다. 상태 성장률이 계속 감소하고 있다면, 사람들은 이더리움이 더 높은 가스 제한을 지원할 수 있는 능력이 있다고 생각할 수 있다. 이는 사실일 수 있지만, 중요한 점은: 1) 현재의 가스 가격 모델 하에서는 성장률의 새로운 급증을 막을 수 있는 것이 없으며, 2) 상태는 가스 제한의 하위 병목이 아니다.
수용 가능한 상태 성장 값은 무엇인가?
우리는 이제 이더리움 상태의 1) 규모, 2) 구성 및 3) 성장률을 알고 있다. 우리는 수용 가능한 상태 성장 값의 범위를 어떻게 결정할 수 있을까? 이 질문은 예측할 수 없는 시장 힘과 이더리움이 어떤 균형을 선택해야 하는지에 대한 철학적 선택 모두에 따라 복잡하다.
가장 간단한 모델부터 시작하자. 미래 하드웨어가 개선되지 않는다고 가정할 때, 현재의 상태 성장 수준이 일반 소비자 하드웨어에서 얼마나 오래 지속될 수 있는지 살펴보자. 그림 3에서 볼 수 있듯이, 최근 몇 년 동안 상태의 연간 성장은 31GB/년에서 72GB/년 사이에 있었다. 현재 일반 소비자 하드웨어의 최대 저장 용량은 약 4TB, 메모리 용량은 약 64GB이다. 이를 통해 간단한 저장소 및 메모리 요구 예측 모델을 만들 수 있다:
- 저장소: 노드는 현재 약 1TB의 상태 데이터를 저장해야 한다. 이는 많은 노드가 최소 2TB 크기의 디스크를 사용하고 있음을 의미한다. 간단하게 하기 위해, 우리는 미래의 역사 성장을 무시하고 EIP-4444 이후의 세계에 있는 것처럼 가정하자. 우리는 미래의 운영 시간을 계산할 수 있다: (남은 저장 용량) / (상태 성장률), 표와 같이. 따라서 노드 저장 하드웨어는 현재의 상태 성장 속도를 10년 이상 지원할 수 있으며, 2TB의 공간을 소모하지 않는다. 현재의 상태 성장 수준에 따라 4TB는 거의 반세기 동안 운영을 지원할 수 있다.
- 메모리: Ethereum-on-arm 사용자는 이더리움 노드를 실행하는 데 필요한 최소 실행 가능한 메모리가 약 16GB라고 보고했다. 만약 메모리 요구가 상태 크기와 비례하여 증가한다고 가정하면, 매년 30GB에서 72GB의 상태 성장은 매년 2GB - 4.7GB의 추가 메모리를 필요로 한다. 따라서 현재의 가스 비율에 따라 32GB RAM은 3년에서 8년 동안 충분할 것이다. 64GB의 RAM은 10년에서 23년 동안 충분할 것이다.
이는 많은 가정이 포함된 단순화된 모델이다. 이 모델의 가능한 확장 조건에는 1) 역사 성장, 2) 메모리 요구의 비선형 확장, 3) 하드웨어 비용 감소, 4) 가스 제한 증가, 5) 연산 코드 가스 재가격 책정, 6) 미래 이더리움 아키텍처 개선이 포함된다. 이러한 각 요소는 비선형적으로 상호 작용할 수 있으며 시간이 지남에 따라 진화할 수 있다. 우리는 향후 작업에서 이러한 모델 확장을 탐구할 것이다.
장기적인 지속 가능성이 중요하다는 점을 강조해야 한다. 현대 하드웨어가 수년간 운영을 지원할 수 있다고 해서 운영 시간을 단축하는 데 소홀히 해서는 안 된다. 상태 성장을 가속화하는 모든 계획은 하드웨어 또는 소프트웨어 환경의 예측할 수 없는 변화에 대응하기 위해 중요한 완충 구역을 포함해야 한다.
상태 성장 문제를 어떻게 해결할 것인가?
상태 성장 문제를 해결하기 위해 많은 다양한 솔루션이 제안되었다. 이더리움 아키텍처의 세 가지 개선이 특히 두드러진다: 롤업, 버클 시도 및 상태 만료. 요약하자면, 이들은 단기, 중기 및 장기 상태 성장 문제를 해결하기 위한 종합 로드맵을 구성한다.
단기: 롤업은 상태 성장 문제를 해결할 수는 없지만, 네트워크 부담을 완화하는 데 기여한다. 그림 2와 그림 3에서 볼 수 있듯이, 롤업은 메인넷보다 상태를 더 효율적으로 사용할 수 있다. 활동을 L2로 전환하는 것은 사용자 탈퇴를 지원하기 위해 메인넷에 일정량의 상태를 저장해야 한다. 그러나 L2 거래의 상태 발자국은 메인넷 거래의 발자국보다 훨씬 낮다. 따라서 롤업은 생태계 내의 총 활동을 더 지속 가능하게 증가시킬 수 있다. 곧 출시될 EIP-4844로 인해 롤업의 채택이 증가할 것으로 예상되며, 블롭은 롤업을 더 저렴하게 만들 것이다.
중기: 버클 시도는 검증자 노드의 상태 성장 문제를 해결하려고 하지만, 새로운 거래를 구축해야 하는 노드의 문제는 해결하지 않는다. 버클 시도는 이더리움 상태의 새로운 데이터 구조이다. 이는 더 효율적인 경량 클라이언트와 "무상태" 노드를 지원한다. 이러한 노드는 기존 상태 값을 알지 못한 채로 새로운 블록을 검증할 수 있다. 이는 검증자 노드의 상태 성장 문제를 제거한다. 새로운 거래의 구축은 여전히 상태를 저장하고 접근해야 하지만, 이는 오늘날의 상황보다 더 지속 가능하다. 거래 구축은 여러 기계에 쉽게 분산될 수 있는 작업이다. 범위 측면에서, 버클 시도는 수년이 걸릴 수 있는 중대한 엔지니어링을 나타낸다.
장기: 상태 만료는 모든 노드의 상태 성장 문제를 해결하지만, 추가 인프라가 필요하다. 상태 만료는 노드가 비활성 상태의 일부를 버릴 수 있게 해준다, 그림 2와 같이. "상태 휴면"이라는 용어가 더 적합할 수 있다. 왜냐하면 대부분의 기존 제안은 "만료" 상태를 복구하기 위해 증명을 허용하기 때문이다. 시간이 지남에 따라 만료된 상태가 손실되는 것에 대한 우려는 역사 기록(블록 및 거래 데이터)이 사용 가능할 경우 상태를 재구성할 수 있다. 따라서 EIP-4444의 역사 보존 문제를 해결하기 위해 개발되는 모든 솔루션은 상태 보존 문제도 해결할 것이다. 그러나 버클 시도가 목표를 성공적으로 달성하면 상태 만료는 필요하지 않을 수 있다.
상태 성장 문제의 해결책은 더 많으며, 상태 임대 및 샤딩을 포함하지만, 역사적으로 이러한 것들은 사용자 경험이나 건전성에 영향을 미칠 수 있다. 더 먼 미래에 궁극적인 해결책을 달성하기 위해서는 이러한 해결책을 다른 해결책과 결합해야 할 수도 있다.
요약
상태 성장이 이더리움을 확장하는 데 있어 주요 도전 과제이지만, 우리는 이것이 해결 가능한 문제라고 믿는다. 데이터에 대한 우리의 해석을 통해 이더리움은 현재의 상태 성장 수준을 수년 동안 유지할 수 있으며, 아키텍처 업그레이드를 위한 편안한 완충을 제공한다.
우리는 경험적 접근 방식이 이더리움의 가스 제한을 설계하고 이더리움을 궁극적인 확장 솔루션으로 안내하는 데 필수적이라고 믿는다. 본 문서는 이러한 목표를 달성하기 위한 첫 번째 단계일 뿐이다. 상태를 초월하는 다른 유형의 데이터가 있으며, 각 데이터는 이더리움 노드와 이더리움 가스 제한에 부담을 준다. 우리는 향후 작업에서 이러한 다른 병목 현상을 탐구하기를 희망한다.