이더리움 노드

이한길
BlueNode
Published in
7 min readOct 29, 2023

1. 노드와 클라이언트

노드

노드(Node):

  • 일반적 의미: 컴퓨터 네트워크를 구성하는 단일 개체로서, 네트워크에 연결된 다른 노드들과 데이터를 주고 받으며 통신한다.
  • 블록체인에서의 의미: 블록체인 네트워크의 구성원으로서 트랜잭션과 블록을 생성, 검증, 전파, 저장하는 컴퓨터.

노드의 기능:

  • 데이터 저장: 블록 사본을 로컬에 저장.
  • 데이터 검증: 블록과 트랜잭션의 유효성을 검증.
  • 데이터 전파: 블록과 트랜잭션을 다른 노드에 전파.
  • 지갑: 키와 주소를 관리하고, 트랜잭션을 생성 및 서명.

트랜잭션 검증: 노드가 어떤 트랜잭션을 전파받았을 때, 노드는 트랜잭션의 유효성을 검증한다. 이 때 디지털 서명을 사용해서 해당 트랜잭션이 진짜 그 사람이 보낸 것인지 혹은 다른 사람이 조작한 것인지를 확인해야 한다. 트랜잭션이 다음 조건을 만족하면 유효하다고 검증된다.

  • 발신자의 개인키로 서명된 메세지를 공개키로 복호화한 것과 원본 메세지가 일치함.
  • 발신자가 트랜잭션을 이행하기에 충분한 이더를 보유하고 있음.

블록 검증: 네트워크 전체가 올바른 하나의 블록으로 합의에 이르도록, 제안된 블록의 유효성을 검증하는 것. 블록의 유효성을 검증한다는 것은 블록에 포함된 트랜잭션들에 의한 상태 변경이 유효한지 확인하는 것이다.

가십(gossip): 블록이나 트랜잭션을 다른 노드들로 전파하고, 전파받은 노드들은 다시 이를 전파해 소문이 퍼져나가듯 데이터를 공유하는 통신 방식.

클라이언트

클라이언트(Client):

  • 일반적 의미: 컴퓨터 네트워크로 연결된 서버에 데이터를 요청해 제공받는 개체, 또는 서버와 통신하는 프로그램을 말한다.

하지만 블록체인에는 중앙 서버가 없다! P2P 블록체인 네트워크의 모든 각 노드가 서버이자 클라이언트이자 데이터베이스.

  • 블록체인에서의 의미: 컴퓨터에서 블록체인의 사양을 구현하여 노드를 형성하고 실행하는 프로그램. 즉, 노드는 클라이언트를 실행하여 생성된 클라이언트의 인스턴스이다.

클라이언트의 기능: 사용자는 클라이언트를 통해 노드를 실행하고 다른 노드와 통신하고, 트랜잭션을 생성하거나 블록체인의 상태를 조회하는 등의 노드의 동작을 제어할 수 있다.

클라이언트의 다양성: 이더리움은 단일 사양을 따르지만 서로 다른 팀에서 다양한 프로그래밍 언어로 개발한 여러 클라이언트들이 존재한다. 한 네트워크에 독립적으로 개발 및 유지 관리되는 여러 클라이언트가 존재하는 이유는 공격 및 버그에 대한 네트워크의 유지력이 향상되기 때문이다.

2. 노드

클라이언트는 크게 풀 노드, 아카이브 노드, 라이트 노드의 세 가지 유형의 노드를 실행할 수 있다.

풀 노드

풀 노드(Full node): 풀 노드는 모든 블록을 저장 및 검증하고, 자신과 다른 노드들이 블록과 트랜잭션의 최신 상태를 유지하도록 업데이트 및 동기화한다. 다른 노드가 요청할 시 데이터를 제공하고, 다른 노드에게 데이터를 요청할 수 있다.

  • 데이터 저장: 모든 블록 저장, 최근 상태만 저장.
  • 데이터 검증: 블록과 트랜잭션 유효성 검증.
  • 장점: 다른 노드의 도움 없이 자체적으로 트랜잭션 검증 가능.
  • 단점: 모든 블록을 저장함에 따른 엄청난 저장용량과 동기화 시간.

아카이브 노드

아카이브 노드(Archive node): 풀 노드의 기능에 추가적으로, 최근 상태뿐만 아니라 이전까지의 모든 상태를 저장하는 풀 노드의 일종.

  • 데이터 저장: 모든 블록 저장, 모든 상태 저장.
  • 데이터 검증: 블록과 트랜잭션 유효성 검증.
  • 장점: 과거의 잔액 상태를 조회하거나, 과거의 블록 안에 포함된 트랜잭션 내역 전체를 다시 실행 가능.
  • 단점: 풀 노드 이상의 엄청난 저장용량.

라이트 노드

SPV(Simple Payment Verify, 단순 지불 검증): 블록의 일부 정보만 가지고 있는 노드가 트랜잭션을 검증하기 위해, 풀노드에게 필요한 블록정보를 요청하여 머클트리를 통해 해당 트랜잭션이 검증된 트랜잭션인지를 확인하는 방법이다.

라이트 노드(Light node): 합의에는 참여하지 않고 트랜잭션을 처리하는 역할만 하는, 블록의 요약본(헤더)만 저장하고 있는 경량화 노드.

  • 데이터 저장: 모든 블록헤더(트랜잭션X)만 저장
  • 데이터 검증: 트랜잭션의 유효성만 검증(SPV).
  • 장점: 풀 노드를 실행하는 데 필요한 엄청난 하드웨어 자원 대신, 스마트폰에서 실행될 정도의 수준으로도 블록체인 네트워크에 참여할 수 있다. 따라서 모바일 지갑 등에서 사용한다.
  • 단점: 검증을 풀 노드에 의존해야 함.

3. 클라이언트

이더리움의 노드를 돌리기 위해서는 기본적으로 실행 클라이언트와 합의 클라이언트라는 두 개의 클라이언트를 실행해야 한다. 지분증명에 참여하는 검증자 노드는 여기에 검증자 클라이언트를 추가로 같이 실행해야 한다. 이더리움 네트워크의 노드는 다른 노드와 통신할 뿐만 아니라, 노드를 실행하는 실행 클라이언트와 합의 클라이언트 간에도 서로 통신해야 한다.

실행 클라이언트와 합의 클라이언트는 각각 고유한 네트워킹 스택을 가지고 있다. ‘트랜잭션 가십을 위한 실행 클라이언트 연결’과 ‘블록 가십을 위한 합의 클라이언트 연결’이라는 두 개의 별도 P2P 네트워크가 필요하다.

실행 클라이언트

실행 클라이언트(Execution client, 실행 엔진): 이더리움 네트워크에서 전파되는 새로운 트랜잭션을 수신하고, 로컬에서 이를 실행하며, 모든 현재 이더리움 데이터의 최신 상태와 데이터베이스를 보유하는 클라이언트. 실행 레이어 P2P 네트워크를 통해 트랜잭션을 가십한다.

  • 실행 클라이언트의 기능 분리
    이더리움이 지분증명으로 전환하면서 합의 로직과 블록 가십(전파 프로토콜)에 대한 책임이 별도의 합의 클라이언트로 넘어갔다.
  • 하지만 실행 클라이언트는 여전히 트랜잭션과 상태 관리를 처리하며, 들어오는 블록을 검증하는 데 필요한 실행 및 상태 관리 도구를 노드에 제공한다.

게스(go-ethereum; geth): 이더리움 재단에서 go언어로 개발한 공식 이더리움 실행 클라이언트.

합의 클라이언트

이더리움은 지분증명으로 전환하기 전까지는 실행 클라이언트만으로도 풀 노드를 실행하기에 충분했지만, 전환 후에는 반드시 합의 클라이언트와도 연결을 해야 실행할 수 있다.

합의 클라이언트(Consensus client, 비콘 노드): 이더리움의 지분증명 합의 알고리즘을 구현하여, 네트워크가 실행 클라이언트의 검증된 데이터를 기반으로 합의를 달성할 수 있도록 하는 클라이언트. P2P 네트워크를 통해 블록을 가십한다.

합의 클라이언트
Prysm: Go로 작성
Lighthouse: Rust로 작성
Nimbus: Nim으로 작성
Teku: Java로 작성
Lodestar: Typescript로 작성

검증자 클라이언트

누구나 이더를 스테이킹하지 않고 노드를 실행할 수 있다. 하지만 이더리움의 합의에 참여하고 이더를 보상으로 얻으려면, 노드는 실행 및 합의 클라이언트에 추가적으로 검증자 클라이언트를 함께 실행해야 한다.

검증자 클라이언트(Validator client): 노드가 검증자가 됨으로써 이더리움 네트워크의 합의에 참여할 수 있도록 하는 클라이언트. 합의 클라이언트와 함께 번들로 제공된다.

Reference
1. 개빈 우드, 마스터링 이더리움
2.
https://ethereum.org/en/developers/docs/
3.
https://geth.ethereum.org/docs

--

--