Ethereum GHOST Protocol에 대한 이해

이홍석
TOMAK
Published in
8 min readJul 26, 2018

1. 요약

GHOST Protocol은 Bitcoin의 성능 향상과 보안성 향상을 위해 나온 알고리즘이다. Ethereum은 이 GHOST Protocol을 약간 수정하여 적용하였다. 이를 통해 빠른 블록 생성 속도를 가지면서 보안성도 높이는 결과를 얻었다. 블록 생성 속도와 보안성, stale 블록의 생성확률에는 연관성이 있다. 블록 생성 속도가 느린 비트코인은 stale 블록의 생성확률이 낮아서 보안성이 높다. 블록 생성 속도가 빠른 이더리움은 stale 블록의 생성확률이 높아서 보안성이 낮다. 하지만 GHOST Protocol을 적용하여 stale 블록을 잘 처리하고 보안성도 높이는 결과를 가져왔다.

2. 필요한 배경지식

2.1. Hash

2.2. PoW

3. 서론

GHOST Protocol은 stale 블록의 처리에 대한 알고리즘이다. GHOST protocol은 bitcoin을 위해 나왔다. 비트코인은 블록생성시간이 약 10분으로 느리지만 stale블럭의 생성확률이 매우 낮다. 그래서 stale 블록이 발생하면 가장 긴 블록을 메인블록체인(Canonical Blockchain)에 연결하고 나머지 stale 블록은 버린다. 하지만 이를 위해 10분을 기다리므로 비트코인은 매우 느리다. 이를 보완하기 위해 이더리움은 블록생성 시간을 약 12초 정도로 매우 빠르게 만들었다. 그러나 블록이 빠르게 생성되면 그만큼 stale 블록이 생성될 확률이 높아지므로 안정성이 떨어진다. 따라서 이를 보완하기 위해 이더리움은 수정된 GHOST protocol을 적용했다. GHOST protocol에 대해서 다음 본문에서 알아보자.

4. 본론

GHOST Protocol은 Greedy Heaviest Object subTree의 약자이고 말 그대로 가장 큰 무게를 가진 subtree를 선택하는 알고리즘이다. Bitcoin의 경우 fork가 발생했을 때 더 긴 블록이 연결된 블록을 메인 체인으로 하고 Uncle은 버린다. Ethereum의 경우에는 fork가 발생했을 때 더 무거운 쪽을 선택한다. 이더리움은 이런 수정된 GHOST Protocol을 사용한다. 먼저, GHOST Protocol의 기본 메커니즘을 따라가보자. 다음은 GHOST Protocol algorithm이다.

위 알고리즘을 간단히 설명하자면 먼저 Genesis Block에서 출발하여 Subtree들이 각각 얼마나 블록을 포함하고 있으며 그 블록들의 개수가 많은 쪽을 메인 chain의 블록으로 하겠다는 것이다. 아래 그림을 예시로 보자.

위 그림에서 Genesis 블록 [0]에서 출발해보자. [0]를 부모로 가지는 노드는 [1B]와 [1A]이다. [1B]를 루트로 한 Subtree의 노드의 개수는 총 12개이고 [1A]는 6개이다. 따라서 메인체인에 붙게 되는 것은 [1B]이다. 그 다음으로 [1B]를 부모로 가지는 노드는 [2D], [2C], [2B]이다. 이들을 루트로 같는 subtree의 노드개수는 각각 4, 5, 2이다. 따라서 메인에 붙게 되는 노드는 [2C]이다. 마찬가지로 알고리즘을 적용하면 [0]-[1B]-[2C]-[3D]-[4B] 와 같이 된다. (위 그림에서 attacker`s secret chain이라고 쓰여있는 부분을 선택하는 것이 bitcoin이다. 그림만 보면 생각보다 쉽게 공격당할 수 있다고 생각하겠지만 실제로는 공격자의 hash power가 전체의 51%를 차지해야 가능한 공격이다.)

이제 이더리움의 수정된 GHOST Protocol로 넘어오자. 수정된 GHOST Protocol의 내용은 다음과 같다.

  • 하나의 블록은 반드시 하나의 모블록을 지정해야 하며, 0 또는 그 이상의 삼촌을 지정해야 한다.
  • 블록 B에 포함된 삼촌은 다음과 같은 속성들을 가지고 있어야 한다.
  • B의 k번째 조상의 직접적인 자손이어야 한다. 여기서 2 <= k <= 7.
  • B의 조상이어서는 안된다.
  • 유효한 블록 헤더여야 하지만, 이전에 확인되었을 필요도, 또는 심지어 유효한 블록일 필요도 없다.
  • 이전 블록들에 포함된 모든 삼촌들, 그리고 같은 블록에 포함된 모든 다른 삼촌들과는 달라야 한다(중복포함방지)
  • 블록 B에 있는 각 삼촌 U에 대해, B의 채굴자는 코인베이스 보상에 더해 추가로 3.125%를 더 받고, U의 채굴자는 기본 코인베이스 보상의 93.75%를 받는다.

위 내용을 좀 더 자세하게 설명해본다. 먼저 첫번째 줄은 블록 헤더에 관한 내용이며 parent block을 가리키고, 0개 이상의 uncle block을 가리킬 수 있는 것이다. 그 다음 문장은 B에 포함된 uncle block에 대한 속성을 의미한다. k가 2부터 7이면 B의 부모 노드(k=1)를 제외하고 7번째 조상노드까지의 직접적인 자손을 의미한다. 예를들어 k=2면 B의 부모 노드의 조카 노드이다. B의 조상노드는 당연히 uncle블록이 될 수가 없다. 조카 블록은 uncle 블록에 포함되므로 B에서 포함할 필요가 없다. 다음 문장은 말 그대로의 의미이고 마지막 문장은 비트코인과는 다른 점이다. uncle 블록을 채굴한 사람은 coinbase 보상의 93.75%를 받고 uncle블록을 포함하는 블록 B를 채굴한 사람에게는 3.125%를 추가로 받는다. (단, uncle블록은 transaction reward를 받지 못한다) 추가로 이더리움에서 메인체인의 선택은 블록이 동시에 도달했을땐 난이도 값이 더 큰 쪽을 선택한다. 블록이 선택되면 난이도값이 점점 누적된다.

다음은 consensus.go의 일부 내용이다. 소스를 보면 위의 GHOST 프로토콜이 어떻게 구현되어있는지 알 수 있다.

5. 분석

먼저, 블록 크기와 블록 생성 시간, transaction 처리 성능, fork 수, 보안성은 다음과 같은 상관관계를 가진다.

블록 사이즈와 블록생성속도가 커지면 transaction 처리율이 올라가고 fork되는 블록의 수가 늘어난다. 이것은 블록체인 네트워크의 보안성이 떨어진다는 것이다.

Bitcoin에 경우 블록생성속도는 매우 느리다(약 10분). 이로인해 transaction 처리 성능은 낮아지고 대신 fork되는 블록의 수는 작아진다. fork의 수가 작아지므로 stale 블록이 발생하는 빈도가 줄어서 자연스럽게 보안성이 늘어난다. 하지만 블록생성속도가 매우 느리다는 단점이 있다. Ethereum에서는 이것을 개선했다. 블록생성속도를 약 12초 정도로 매우 빠르게 유지하는 것이다. 하지만 그렇게 블록생성속도를 올리면 위와 같은 상관관계에 의해 fork의 수가 많이 늘어난다. 즉 이는 네트워크의 보안성을 많이 낮춘다. 이를 해결하기 위해 이더리움은 수정된 GHOST Protocol을 사용했다. stale 블록에 대해 보상을 주고 가장 긴 것이 아닌 가장 무거운 것을 사용했다. 그리하여 네트워크의 보안성을 올리고 transaction 처리율을 유지하면서 블록생성속도도 빠르게 할 수 있는 것이다. 다음 그림은 Bitcoin에 Longest Chain Rule과 GHOST Protocol(원래 버전)을 각각 적용했을 때의 성능 비교를 시뮬레이션 한 그래프이다.

위의 그래프를 보면 블록 생성 속도가 빨라지면 트랜잭션 처리율이 증가하는데, GHOST 프로토콜과 Longest Chain Rule 이 거의 비슷하게 증가하는 것을 알 수 있다. 그러나 보안성은 매우 큰 차이를 보이는 것을 알 수 있다. 이를 약간 수정하여 블록 생성 속도가 빠른 Ethereum에 도입한다면 보안성을 많이 지킬 수 있는 것이다.

6. 결론

블록생성속도를 올리는 것은 블록체인 네트워크 전체의 처리율과 아주 밀접한 관계를 가진다. 하지만 이는 블록체인 네트워크의 보안성을 내리지만 GHOST 프로토콜을 이용하여 이를 보완할 수 있다. 따라서 이더리움의 GHOST 프로토콜은 전체 성능과 보안에 아주 중요한 역할을 한다고 할 수 있다.

7. Reference

--

--