1. 계정 기반 모델 (Account Based Model)
- 계정(Account): 이더리움은 UTXO 모델이 아닌 ‘Account 계정’ 개념을 사용한다. 크게 Extrnally Owned Account ( EOA )와 Contract Account로 구분된다.
- EOA : 일반 사용자가 개인 키를 통해서 제어하는 계정이다. 거래 발생 시 서명이 필수며, 보유한 이더(ETH) 잔액도 존재한다.
- Contract Account: Smart Contract가 배포된 게정이다. 코드를 담고 있으며, 사용자의 트랜잭션이나 다른 컨트랙트로부터의 호출에 따라 EVM 코드가 실행된다.
UTXO Model이란?
UTXO ( Unspent Transaction Output ) Model은 비트코인(BTC)에서 사용하는 모델로, 각 코인이 어디서 왔고, 어디로 가는지를 ‘트랜잭션 출력(Output)’으로 추적하는 방식이다.
- 트랜잭션은 여러 입력(Input)과 출력(Output)을 가질 수 있다.
- 입력(Input): 이전 트랜잭션의 미사용 출력(UTXO)를 참조
- 출력(Output): 새로운 소유권을 명시 ( 예: 어떤 주소가 얼마만큼의 비트코인을 얻게 되는지)
- 이때, 잔액이라는 개념은 단순히 “아직 쓰이지 않은 트랜잭션 출력(UTXO)의 총합”이다.
- 장점
- 각 트랜잭션 자체가 독립적으로 유효성이 검증됨(해당 UTXO가 실제 존재하고 서명이 올바른가 확인)
- Double Spending(이중 지불)을 체크하기가 쉬움 ( 동일한 UTXO가 다시 사용되면 무효 )
- 단점
- UTXO가 많아지면 관리가 복잡해짐
- Smart Contract를 다루기엔 Account-based Model보다 직관성이 떨어질 수 있음
- 계정 상태: 각 계정에는 nonce, balance, storage, code가 존재하며, 전역 state는 World State를 이진 트라이(Merkle Patricia Trie)로 관리한다.
State란?
- State는 특정 시점에서 각 계정(Account)이 보유한 데이터(잔액, nonce, storage, code etc..)을 총칭하는 말이다.
- EOA의 경우: nonce, balance
- Contract Account의 경우: nonce, balance, storage, code
트랜잭션 실행이나 블록이 채굴(또는 검증)될 때마다 상태가 갱신된다.
World State란?
- World State는 이더리움 전체 네트워크에 존재하는 모든 계정의 상태를 합친 거대한 맵(또는 자료 구조)이다.
- 이 World State는 머클 패트리샤 트라이(MPT) 형태로 저장되며, 무결성과 변경 내역을 추적할 수 있게 한다.
- 흔히 상태 루트(stateRoot)라는 해시값으로 대표된다. 블록마다 해당 stateRoot가 박혀있어 ‘이 블록 시점에 전 세계 계정들의 상태가 이것이 맞다’라고 인증하는 역할이다.
정리하자면 State는 각 계정의 스냅샷, World State는 그 모든 계정 스냅샷을 합친 것이며, 블록체인은 매 블록마다 World State가 어떻게 달라지는지를 기록한다.
Key-Value DB란?
- Key Value DB : 각 계정의 상태 정보를 저장하는 구조이다. 해당 구조에서 각 계정의 32 byte address를 고유한 Key로 사용하고, 상태 객체( State Object )를 값으로 저장한다.

해당 구조는 문제점이 존재한다. 24년 4월 기준 Ethreum의 Account는 약 2억 6천만개이다. 간단한 Key-Value 구조는 네트워크의 규모가 확장됨에 따라 이러한 대규모 데이터를 처리하는 느린 탐색 속도를 보여준다. 느린 탐색 속도는 트랜잭션의 속도를 저하시키고, 이는 곧 네트워크 전체의 성능에 영향을 미친다. 따라서 이더리움은 MPT라는 효율적인 데이터 구조와 알고리즘을 사용한다.
MPT ( Merkle Patricia Trie )
정리해보면, 이더리움은 하나의 state machine이며, 트랜잭션은 state를 변경한다. 이 state는 key-value pair로 표현된다. key-value pair를 저장하는 방법은 여러가지 있지만 이더리움은 Modified Merkle Patricia Trie ( MPT )라는 특수한 방법을 사용한다.
MPT는 기본적으로 Patricia trie와 Merkle Tree를 합친 것이며, ethreum의 특성에 맞게 최적화를 추가적으로 하였다.
Trie, Patricia Trie란?

위 사진은 Tree 구조이다. 탐색 Tree는 데이터를 효과적으로 검색하는 방법 중 하나이다. 그 중 이진 탐색 트리는 흔한 형태 중 하나이다.

Trie는 키가 문자열(address)인 경우 효율적인 검색을 제공하는 트리 기반 데이터 구조이다. Trie에서는 각 노드가 키의 한 문자를 표현하며, 루트에서 노드까지의 경로를 전체 키를 나타낸다.

Patricia trie는 Prefix tree, radix tree, trie 등 다양한 이름으로 불린다. 이는 기존 Trie의 메모리 효율을 개선한 데이터 구조로 경로 압축( Path Compression )을 통해 메모리 사용량을 줄인다. Patricia Trie는 path에 key를 집어넣어 공통된 prefix를 가지는 노드들은 같은 path를 가진다는 특성을 이용한다. 이러한 공통 prefix를 찾는 방법이 가장 빠르고 적은 메모리를 사용하며 구현도 간단하기에 router 등 낮은 사양의 기계에 들어가는 routing table 등에서 사용되기도 한다.
실제로 address들은 많은 공통 prefix를 가지기에 기존 Trie의 단점인 메모리 사용량을 크게 줄이면서 효율적인 검색까지 가능하다.
Merkle Tree란?

위에서 Trie는 효율적인 저장과 처리가 목적이였다면 Merkle Tree는 위변조 방지가 목적이다.
Merkle Tree는 hash들의 tree이다. Leaf 노드에는 데이터를 보관하며, leaf의 부모는 leaf의 hash를 가지고, 그 부모는 자식들의 hash의 합을 다시 hash한 값을 가진다. 이는 leaf 노드를 제외한 노드들은 모두 hash를 가지고 있기에 hash tree라고도 불린다.
이를 사용하면, 서로 다른 2개의 노드가 같은 데이터를 가졌는지 효율적으로 비교할 수 있다. 예를 들어, L1, L2, L3, L4가 있을 때 같은 Top Hash를 가졌는가만 따지면 된다. 만약 Top Hash가 다르고, 어떤 데이터가 다른지 알고 싶다면, 바로 자식인 Hash 0과 Hash 1을 비교하고, 둘 중 다른 브랜치의 hash를 비교해나가면서 어떤 데이터가 다른지 검증할 수 있다.
Light Client란?
- Full Node는 모든 블록 트랜잭션, 상태(World State) 전체를 저장하고 검증하기에 용량이 크고 동기화 시간이 오래 걸린다.
- Light Client는 블록 헤더만 내려받고, 필요한 상태 정보를 머클 증명(Merkle Proof)를 통해 검증하기에 리소스를 크게 절약할 수 있다.
- 장점
- 디스크/메모리 사용량이 훨씬 적고, 동기화(sync)가 빠르다.
- 스마트폰, 임베디드 장치 등 자원 한정적 환경에서 쉽게 구축 가능
- 단점
- 매번 특정 계정/트랜잭션 상태를 확인할 때, 풀 노드에게 머클 증명을 요청해야하므로 네트워크 의존도가 높다.
- 100% 스스로 검증을 못하기에, 신뢰 모델이 풀 노드에 어느정도 의존한다.
- 악의적인 노드가 해당 Merkle Tree Root에 존재하지 않는 Transaction을 위조하여 생성하고자 한다면, 정확히 같은 Root를 뽑아내는 Data를 찾아내야 한다.
Merkle Patricia Trie

- Patricia Trie는 키의 공통 prefix를 기반으로 데이터를 효율적으로 저장 및 검색을 하는 구조이고, Merkle Tree는 데이터 무결성 검증에는 유용하지만, 키 기반 검색 및 데이터 저장에는 Patricia Trie만큼 효율적이지 않다.
- MPT는 두 구조의 장점을 합친것이다.
- MPT는 Merkle Tree처럼 각 노드가 hash를 가지며, 이는 노드 내용의 sha3 hash로 결정된다.
- hash는 노드를 지칭하는 key로도 사용된다.
- geth에서는 leveldb를, parity에서는 rocksdb라는 key-value storage에 state를 저장한다.
- 이때 storage에 저장되는 key-value는 ethereum state의 key-value가 아니라 각각 노드의 hash와 MPT 노드 내용이다.
- ethereum-state의 key는 MPT에서 path로 사용된다.
- MPT에서 key가 같은지 비교하는 단위는 nibble이다.
- 하나의 node에서 최대 16개의 branch를 가질 수 있다.
- 노드도 값을 가지기 때문에, 16개의 branch와 값을 합쳐 17개의 아이템을 가진 배열이 branch node가 된다.
- 아래로 자식이 없는 노드는 leaf node라 불리며, 자신의 path와 value 2개의 아이템으로 이루어진 배열이다.
- 예를 들어 “0xBEA”라는 키에 1000이 들어있고, “0xBEE”라는 키에 2000이 들어있다고 생각해보자. 그렇다면 “0xBE”를 path로 가지는 branch node가 있고, 그 아래 “0xA”와 “0xE”를 path로 가지는 2개의 leaf node가 붙는다.

- 이 외에 extension node라고 있는데 이는 branch node의 최적화이다.
- Ethereum에서 state는 하나의 branch node가 하나의 자식만 가지는 경우가 많기에 MPT는 하나의 자식만 가지는 branch node를 path와 자식의 hash를 가지는 extension node로 압축한다.
- 이때 2개 node ( leaf node, extension node ) 모두 2개의 아이템을 가진 배열이기에 구분할 방법이 필요하다.
- 그래서 MPT는 path에 prefix를 붙인다.
- 만약 node가 leaf node고 path가 짝수개의 nibble로 구성돼 있으면 0x20을 붙이며 홀수개의 nibble로 구성되어 있어면 0x3을 붙인다.
- extension node의 경우 짝수면 0x00, 홀수면 0x1을 prefix로 붙인다.
- 짝수면 2개의 nibble을 prefix로, 홀수면 1개를 붙이기 때문에 path는 항상 byte로 표현된다.
2. 합의 알고리즘과 네트워크 구조
PoW에서 PoS로의 전환
- PoW(Proof of Work): 초기 이더리움(ETH1)은 PoW 기반으로, 난이도 목표를 만족하는 해시를 찾는 과정을 통해 블록을 생성했다.
- PoS(Proof of Stake): 2022년 9월 ‘Merge’ 업그레이드를 통해 PoW에서 PoS로 전환되었다. 이제 이더를 스테이킹한 검증인(Validator)이 블록 생성 및 검증에 참여한다.
- Beacon Chain: PoS 검증인들의 스테이킹, 보상/벌칙 분배, 랜덤 시드 생성을 담당하는 체인.
- 검증인(Validator): 32 ETH를 예치하여 활성 검증인 세트에 등록되며, 새로운 블록을 제안하고 서명(Attestation)에 참여한다
- 슬래싱(Slashing): 이중 서명이나 악의적 행위를 할 경우 예치금이 일부 혹은 전부 소각되는 처벌 메커니즘이다.
Validator
- PoS(Proof of Stake) 체제에서, 블록을 만들어(제안) 네트워크에 내놓는 주체를 “검증인(Validator)”라고 부른다.
- 검증인은 32 ETH를 예치(stake)해야 활성 검증인 세트에 들어갈 자격이 생긴다.
- 검증이라는 행위는 크게 두 가지 의미가 있다.
- 블록 제안(Block Proposal): 라운드(슬롯)마다 무작위로 선정된 검증인이 새 블록을 만들어 네트워크에 전파
- 투표(Attestation): 다른 검증인들은 제안된 블록이 유효한지 확인하고, 서명(투표)을 통해 “이 블록이 맞다”고 지지함
- 왜 새 블록을 제안하는가?
- 블록을 제안해야 체인이 연속적으로 이어지며 트랜잭션이 처리됨.
- 이를 통해 트랜잭션이 최종 확정(Finality)되면서, 네트워크가 합의에 도달함.
- 검증인들은 제안/투표에 참여해 보상을 받거나(정상 동작) 처벌(슬래싱)을 당할 수 있음(규칙 위반 시)
Beacon Chain과 다른 체인
- Beacon Chain: PoS 이더리움의 핵심. 검증인들의 스테이킹, 무작위 시드 생성, 블록 제안자 선정 등을 처리하는 체인.
- Execution Layer(이전 PoW 체인): 실제로 EVM 트랜잭션이 실행되는 “실행 레이어(Execution Layer)” 체인이 있습니다. Merge 이후에도 이 체인은 계속 존재하며, 우리가 흔히 말하는 ‘이더리움의 상태’(account 상태, 트랜잭션)는 이 실행 레이어에 기록된다.
- 상호작용:
- Beacon Chain은 Validator를 관리하고, 제안자 선택/투표 절차(합의 레이어)를 담당.
- Execution Layer는 스마트 컨트랙트 실행, 계정 상태 변경 등(실행 레이어)을 담당.
- 두 체인은 서로 블록 헤더를 참조하고, 최종 합의 여부 등을 교환한다.
네트워크 계층
- P2P 네트워크: 이더리움 노드는 Kademlia 기반의 DHT(Distributed Hash Table)를 변형해 사용하며, 트랜잭션과 블록을 전파한다.
- 블록체인 구조: 각 블록은 이전 블록 해시, 트랜잭션 목록, 상태 루트, 트랜잭션 루트, 수수료 수익 등 메타데이터를 포함한다.
Kademlia란?
- Kademlia는 P2P 네트워크에서 노드를 효율적으로 찾고 라우팅하는 알고리즘(프로토콜)이다.
- 노드들은 “Kademlia 주소 공간”에서 자신의 Node ID(해시) 기반으로 위치를 결정하고, 거리(metric) 개념을 사용해 근접한 노드를 찾거나 라우팅합니다.
- 예: XOR 거리. 두 노드의 ID를 XOR 연산했을 때 결과값이 작을수록 가까운 노드로 간주.
DHT(Distributed Hash Table)란?
- 분산 해시 테이블: ‘Key-Value’ pair를 Worldwide 노드에 분산 저장하고, 특정 키에 대응하는 값을 효율적으로 조회할 수 있게 해주는 구조.
- 이더리움 노드들은 Kademlia 기반 DHT를 사용해 “내가 연결해야 할 피어(노드)는 어디 있는가?”를 찾고, 트랜잭션·블록 등을 전파합니다.
Kademlia DHT란?
- DHT(Distributed Hash Table): 네트워크에 참여하는 여러 노드가 키–값(key-value)을 분산 저장하여, 필요한 정보를 빠르게 조회할 수 있도록 만든 자료구조/프로토콜이다.
- Kademlia는 여러 DHT 구현 중 하나로, 기존의 다른 DHT들이 동시에 제공하지 못했던 여러 장점을 가지는 것으로 알려져 있다.
- (1) 노드 간에 교환되는 설정 메시지(configuration message) 수가 최소화된다.
- (2) 이미 “검색(query)” 중에 얻게 되는 정보(노드 주소 등)가 자연스럽게 구성(학습)된다.
- (3) 노드는 저지연 경로(low-latency path)를 활용해 쿼리를 라우팅할 수 있다.
- (4) 장애가 발생한 노드(죽은 노드)를 빠르게 회피하기 위해 병렬·비동기 쿼리를 사용한다.
- (5) 병렬·비동기 처리는 서비스 거부 공격(DoS/DDoS)이나 네트워크 장애에 좀 더 강인하다.
- (6) uptime 분포(노드 가동 시간)에 대한 약한 가정(weak assumptions on updime distributions)을 통해, 특정 노드들이 오래 살아 있는 안정된 네트워크를 선호한다.
정리하면 Kademlia는 노드 식별자(Node ID)를 이용해 근접성(closeness)을 정의하고, 그 근접성에 따라 키–값 쌍을 적절히 분산 저장/검색하여, 네트워크 규모가 크더라도 효율적인 조회를 가능하게 하는 DHT 프로토콜이다.
추가 : 병렬 비동기 쿼리가 장애 노드 및 DoS에 강한 이유
- 장애 노드 ( 죽은 노드 ) 회피
- 동기(Synchronous) 쿼리 방식이라면, 어떤 노드에게 요청을 보내었을 때 응답이 없으면 일정 시간( timeout ) 동안 기다려야 하므로, 전체 탐색 과정이 지연됨.
- 병렬 비동기 ( parallel/asynchronous ) 쿼리를 쓰면 여러 노드에게 동시에 요청을 보내고, 응답이 오는 대로 살아 있는 노드와의 통신을 계속 진행할 수 있다.
- 예시 : 노드 A, B, C에게 동시에 FIND_NODE 요청 → A가 죽었다면 응답이 안 올 뿐, B, C가 응답을 주므로 빠르게 다음 단계로 넘어감
- 결과적으로 장애 노드를 빠르게 배제하고, 탐색 지연을 최소화할 수 있다.
- Dos/DDos 방어
- 공격자가 특정 노드에 트래픽 집중(DoS)을 유발하거나, 거짓 응답을 유도한다 해도, 병렬 쿼리를 통해 여러 후보 노드 중 일부만 정상 동작해도 탐색이 이어질 수 있다.
- 공격자가 모든 경로(노드)에 동시에 공격을 가하지 않는 이상, 병렬 비동기 로직을 통해 전체 네트워크가 완전히 마비되는 위험을 줄일 수 있다.
- 또한, Kadmlia는 노드가 응답을 주지 않으면 해당 노드를 k-버킷에서 빠르게 제거 또는 후순위로 밀어내기때문에, 공격 노드를 빠르게 ‘신뢰도 낮은’ 상태로 두고 대체 노드를 이용할 수 있다.
추가: 약한 가정( weak assumptions on uptime distributions )란?
언급된 ‘약한 가정(weak assumption)은 아래와 같다.
- 노드들이 일정 수준 이상으로 온라인 상태를 유지할 것이다.
- 완벽하게 영원히 살아 있는 노드는 없지만, 일정 확률로 오래 접속한 노드일수록 계속 살아 있을 가능성이 크다.
등과 같은 강하지 않은( 절대적이지 않은 ) 통계적 및 확률적 전제 조건을 의미한다.
즉, 네트워크 운영 시 ‘어느 정도 노드들이 안정적으로 접속해 있을 것’이라고 가정하는데, 이를 약한 가정이라고 본다. 완전히 신뢰할 수 있는 것은 아니지만, p2p 환경에서 충분히 현실적인 전제라는 의미이다. Kademlia는 이런 수준의 가정으로도 효율적으로 동작하게 설게되었다.
Kademlia의 노드 ID와 키–값 저장
Node ID (160비트 공간)
- 참여하는 각 노드는 160비트 길이의 Node ID를 가진다
- 키(key) 또한 160비트라고 생각할 수 있으며, “어떤 키를 저장할 때, 그 키와 가장 가까운(근접한) Node ID를 가진 노드들에 저장한다”는 것이 핵심입니다.
근접성 개념
- “키(예: Key1)를 갖는 노드 10개 중 1개가 죽으면, 그 다음으로 가까운 노드에 저장된다”고 비유적으로 설명할 수 있다.
- 거리(metric)는 보통 XOR 거리를 사용한다. 두 노드(또는 키) ID를 XOR 연산했을 때 결과값이 작을수록 ‘가깝다’고 판단한다.
Node-ID 기반 라우팅 알고리즘
- Kademlia는 노드들이 서로 ‘k-버킷(k-bucket)’이라는 구조에 다른 노드들의 ID, IP, 포트 정보를 저장해 둔다.
- 검색할 때는 “타겟 키에 가장 가까운 노드(현재 알고 있는 노드 중)”부터 차례대로 질의(query)를 보내고, 응답받은 노드들이 알고 있는 더 가까운 노드 정보를 또 받아서, 점점 타겟 키에 가까워지는 방식이다.
‘Shortest Unique Prefix’ 개념과 이진 트리 예시
Shortest Unique Prefix
Input: [Zebra, dog, duck, dove]
Output: {z, dog, du, duv}

- 예: ["Zebra", "dog", "duck", "dove"]일 때,
- “Zebra”는 접두사 z만으로도 충분(“dog”나 “duck”과 겹칠 일이 없음).
- “dog”는 dog 자체가 접두사(“duck”이나 “dove”와 달라야 하므로).
- “duck”은 du로는 “duck/dove” 구분이 불가능하니 duc 혹은 duck까지 가야 함(문맥에 따라 다름).
- “dove”는 dov 혹은 dove가 필요.
- Kademlia에서 노드 ID의 이진 표현을 트리 형태로 가정했을 때, 루트에서부터 (0/1) 어느 방향으로 가야 특정 노드에 도달하는지를 찾는 개념이 이와 유사하다고 보시면 된다.
Kademlia 이진 트리
- 루트에서 시작해 비트가 0이면 왼쪽, 1이면 오른쪽 식으로 분기되어 노드의 위치가 결정된다고 볼 수 있다.
- 예시 ) 어떤 노드의 ID가 00111... ( 이진 형식 )이라면, 트리의 루트에서
- 1 번째 비트 → 0이면 왼쪽
- 두 번째 비트 → 0이므로 또 왼쪽
- 1이므로 오른쪽
- 1이므로 오른쪽
- …
- 이런 식으로 내려가면 해당 노드의 위치가 정해진다.
- 예시 ) 어떤 노드의 ID가 00111... ( 이진 형식 )이라면, 트리의 루트에서
- Kademlia에서 중요한 특징은 자신이 속하지 않은 서브 트리에 대해서도 적어도 하나의 노드를 알고 있어야 한다 이다.
- 그래서 “모든 노드는 필요 시 상대방 노드를 XOR 거리 기준으로 찾을 수 있다”는 것이 가능해진다.
- 예시: 노드가 00111에 속해 있다면, ‘00111과 전혀 겹치지 않는 prefix(예시: 1, 01, 000 … ) 쪽 서브 트리에 존재하는 노드 정보도 k-버킷을 통해 일부 가지고 있어야 한다.
- 이렇게 하면 어느 경로(접두사 prefix) 쪽으로 탐색을 가야 할 때도, 그쪽 분기를 대표하는 노드 정보가 있으므로 그곳에 질의를 보낼 수 있다.
- 결과적으로 “루트에서부터 어느 비트가 다른지”를 따라가면서, 타겟 노드 ID와 XOR 거리가 점차 줄어드는 방향으로 검색을 이어갈 수 있게 된다.
추가: K-Bucket이란?
- k-bucket은 Kademlia 노드가 유지하는 데이터 구조로, “서로 다른 XOR 거리 범위”마다, 그 범위 안의 노드 정보를 (최대 k개) 리스트로 보관한다.
- 예시: 160 비트 기준 0 ≤ distance < 2^0, 2^0 ≤ distance < 2^1, ..., 2^(n-1) ≤ distance < 2^n 같은 식으로 구간을 나누고, 각 구간마다 최대 k개의 노드를 저장
- 일반적으로 k값은 20 정도로 잡는다고 알려져 있다.
동작 방식
- 새 노드를 알게 되었을 때: 해당 노드와의 XOR 거리에 따라 적절한 k-버킷에 넣는다.
- 버킷이 가득 찼을 때: 가장 오래 응답이 없는(혹은 오래 접속하지 않은) 노드를 내보내고(또는 뒤로 밀고), 새 노드 등록
- 이렇게 하면 노드 A가 자신의 k-버킷에 “XOR 거리별로 고르게 분포된 노드 정보를 유지”하게 되고,
- 어떤 키 또는 노드 ID를 찾고자 할 때 “현재 XOR 거리상 가장 가까운 노드에게 물어본 뒤 → 응답 받은 더 가까운 노드에게 물어보는” 과정을 반복해 효율적으로 탐색할 수 있다.
RPC 메시지 흐름과 탐색 과정
- 노드 A는 “타겟 노드 ID(혹은 키) α”를 찾고자 할 때, 먼저 자기 k-버킷에서 가장 가까운 노드 여러 곳(예: 3개)에 요청을 보냄.
- 응답 노드는 “나는 직접 타겟 α를 모르지만, 대신 α에 더 가까운(또는 근접한) Node IDs”를 알려준다.
- 노드 A는 새로 얻은 노드들에게 계속해서 질의.
- 이 과정을 반복하면, 타겟에 점점 더 근접한 노드를 찾거나, 실제 타겟 노드가 응답을 주는 지점에 도달함.
- 각 쿼리는 비동기적으로 날아가고, 장애 노드는 응답을 주지 않으므로 빠르게 제외.
- 최종적으로 O(log N) (N은 네트워크 노드 수, 2^n 규모) 정도의 탐색 단계 안에 타겟 노드 또는 키-값에 닿을 수 있게 된다.
이 때, 다음과 같은 RPC 동작이 일어난다:
- PING / PONG: 상대 노드가 살아 있는지 확인.
- STORE: key–value 쌍을 저장하도록 요청.
- FIND_NODE: 특정 Node ID와 XOR 거리가 가까운 노드를 알려 달라고 요청.
- FIND_VALUE: 특정 key에 대응하는 value(또는 그 key에 가장 가까운 노드)를 알려 달라고 요청.
5. Kademlia의 실제 적용 예시 & 변형
- BitTorrent에서 수천만 노드가 사용하는 DHT가 Kademlia 계열 프로토콜을 기반으로 동작.
- Coral DSHT는 Kademlia를 확장한 형태로, 키 자체를 저장하기보다는 “파일을 제공할 수 있는 피어의 주소 목록”만 저장. 지역성(locality) 등을 활용.
- S/Kademlia(Secure Kademlia): Node ID 생성 과정에 PKI를 활용해서 시빌 공격(Sybil Attack)을 방어하고, 노드가 자신의 메시지를 서명하도록 요구하는 등의 강화책을 도입.
추가: Sybil Attack (시빌 공격)
- 시빌 공격은 하나의 물리적 주체(공격자)가 다수의 가짜 ID(다른 노드 ID)를 만들어 네트워크에 참여, 투표권이나 영향력을 부풀리는 공격 기법을 말한다.
- P2P 환경에서 공격자가 “수십, 수백 개의 노드 ID”를 생성해 특정 키 범위를 장악하거나, 잘못된 정보를 퍼뜨리는 식으로 문제를 일으킬 수 있다.
추가: PKI(Public Key Infrastructure)
- 공개 키 기반 구조: 노드 ID를 개인 키/공개 키를 통해 서명·인증받도록 하는 시스템이다.
- 예: 노드가 자신의 Node ID를 만들 때, 그에 대응하는 공개 키(공개키 해시 등)를 ID로 삼고, 통신 시 메시지에 서명하여 “내가 진짜 이 공개 키의 소유자임”을 증명.
- Kademlia의 Secure 확장판(S/Kademlia)에서는 노드가 무작위로 Node ID를 막 만드는 것이 아니라, 정당한 인증서 또는 서명이 있어야 유효한 노드로 인정받도록 설계하여, 시빌 공격을 어렵게 만든다.
- 완벽 차단은 아니더라도, 노드 ID를 대규모로 생성하려면 PKI 인프라가 요구하는 비용·절차가 늘어나므로 공격 난이도가 상승함
Sync(동기화)
노드 동기화란?
이더리움 네트워크에 새로 참여한 노드는 현재까지 생성된 블록과 블록에 포함된 상태를 다운로드 및 검증해야 합니다. 이를 노드 동기화(Sync)라고 부르며, 노드는 동기화를 마친 뒤에야 메인넷과 동일한 상태를 유지하면서 트랜잭션을 처리할 수 있게 됩니다.
Geth 기준 동기화 모드
- Full Sync(고전적 풀 동기화)
- 블록 #0(제네시스)부터 모든 블록을 순서대로 다운로드하고,
- 각 블록의 트랜잭션을 실제로 실행(EVM)해 보면서 World State(MPT)를 재구성.
- 이 방식은 시간이 오래 걸리고 디스크 사용량도 많지만, 완전한 재현성을 가진다
- Fast Sync(패스트 동기화)
- 블록 헤더와 트랜잭션만 빠르게 다운로드하고,
- 최신 블록 근처에서 최신 상태(머클 루트)를 통째로 전송받아 재구성.
- 이후 트랜잭션 검증은 최신 블록까지만 빠르게 검증하고, 이전 블록들은 헤더만 대조(또는 일부 샘플링)합니다.
- 블록 전체를 재현하는 대신, 합의가 끝난 블록에 대한 최종 상태를 신뢰하면서 시간을 크게 단축합니다.
- Snap Sync(스냅샷 동기화)
- Geth 1.10.x 이후 도입된 방식으로, 상태 스냅샷(계정·스토리지 정보)을 ‘스냅샷’ 형태로 빠르게 전송받아 재구성.
- 이전 블록은 최소한으로만 체크하고, 최신 상태를 최대한 빠르게 합쳐 가는 최적화 기법입니다.
- Fast Sync보다도 더 빠른 시간 안에 동기화를 완료할 수 있음.
- Checkpoint Sync (상황에 따라)
- 특정 체인 분기(체크포인트) 이상을 신뢰 기반으로 받아들이고, 그 이후 블록만 집중적으로 동기화.
- PoS 전환 후에는 검증인들의 최종성(finalized block) 지점 등을 체크포인트로 삼아 동기화 시간이 단축될 수 있습니다.
동기화 과정 개요
- Geth 노드는 부트노드(bootnode) 목록에서 첫 연결을 맺고,
- 이웃(peer) 노드들로부터 “체인 헤더”, “블록 데이터”, “상태 트리 일부” 등을 병렬로 수신.
- 일정 시점(최신 블록)에 도달하면, 이후에는 실시간으로 새 블록을 받아 검증하고 메인넷과 보조를 맞추게 됩니다.
Fork(포크)
임시 포크(체인 분기)
블록체인은 동시에 2개 이상의 새 블록이 전파될 수 있다. 예를 들어, 서로 다른 검증인(또는 채굴자)이 같은 높이(Block Height)의 블록을 거의 동시에 만들면 네트워크상에서 잠시 **분기(Fork)**가 생긴다.
- PoW 시절에는 “가장 길고(또는 난이도가 높은) 유효 체인”을 정본으로 채택.
- PoS 시절에는 검증인들의 투표(Attestation) 결과로 체인이 합의에 도달하며, 어느 블록이 다수의 지지를 얻었는지(또는 더 많은 attestations를 모았는지)에 따라 한쪽 분기가 살아남았다.
체인 선택 규칙
- PoS(BEACON CHAIN): 블록 제안 → 여러 검증인의 서명(Attestation)으로 지지받은 체인이 점차 높은 확률로 정본이 됨.
- 일시적 분기는 보통 짧은 시간(1~2슬롯) 안에 해소되고, 한쪽 블록이 고립(uncle/orphan) 처리된다.
하드포크 vs 소프트포크
- 하드포크(Hard Fork): 프로토콜(합의 규칙, EVM 규칙 등)이 바뀌어 이전 버전 노드와 호환 불가능. 예) The DAO 사건, Constantinople 업그레이드 등.
- 소프트포크(Soft Fork): 호환 범위 내에서 규칙을 제한하거나 변경하는 방식으로, 이전 노드와도 어느 정도 호환.
Finality(최종성)
PoS에서의 최종성
- **Finality(최종성)**이란 “한 번 블록이 확정되면, 경제적으로나 기술적으로나 되돌릴 수 없는 상태”를 말한다.
- PoW에서는 절대적 “최종성”이 존재하지 않고, 확률적으로 긴 체인이 뒤늦게 나타날 가능성이 작아지는 것에 의존했다(6 confirmations 등).
- PoS 이더리움에서는 Beacon Chain의 합의 알고리즘(예: Gasper, 현재 LMD-GHOST + Finality Gadget)으로 “epoch 단위”로 블록을 투표(attestation)하고, **수퍼다수(Supermajority)**가 동의하면 “최종화(Finalized Block)”로 간주한다.
Epoch, Checkpoint
- 한 에폭(epoch)은 여러 슬롯(slot)으로 구성되며(보통 32 슬롯 = 6.4분), 검증인들이 각 슬롯마다 블록을 제안·투표한다.
- 체크포인트(Checkpoint): 각 에폭의 첫 번째 블록을 기준으로, 해당 에폭이 끝난 후 충분한 투표가 모이면 그 체크포인트가 “정말로 확정”된다.
- 이렇게 체인이 최종화된다는 것은, 그 시점 이전 블록들을 되돌리면 스테이킹 된 예치금이 슬래싱되어 막대한 경제적 피해가 발생하므로, 네트워크상에서 사실상 불가능에 가깝다.
Reorg(재조직) 한계
- PoS 체제에서는 “Finalized” 블록 이전 구간을 되돌릴 경우, 대규모 슬래싱이 발생하므로 실용적으로 불가능하다.
- 반면, 아직 최종성이 부여되지 않은 “head(최신) 블록” 근방에서는, **임시 포크(짧은 reorg)**가 일어날 수 있습니다만, 보통 몇 개의 슬롯을 넘어서지 않는다.
참조
'Blockchain' 카테고리의 다른 글
geth eth 프로토콜 분석 - 1 (1) | 2024.09.04 |
---|---|
Blockchain CTF Template 구현 (0) | 2024.08.14 |
간단한 개념 정리 (1) | 2024.07.25 |
Cross-Chain Lending Protocol: 유동성 확보와 편의성을 위한 설계 및 비교 분석 - Part 2 (0) | 2024.07.20 |
Cross-Chain Lending Protocol: 유동성 확보와 편의성을 위한 설계 및 비교 분석 - Part 1 (0) | 2024.07.19 |