無知

갈 길이 먼 공부 일기

기술 공부/블록체인

이더리움의 작동방식 (5) | 블록, Ommer, 헤더, 로그블룸, 난이도

moozii 2022. 1. 5. 20:23

* 이 글은 How does Ethereum work, anyway? 라는 글을 읽어가며 이해한 바를 한국어로 번역하여 정리하는 글입니다. 시리즈의 형태로 끊어가며 업로드되었으니, 참고 부탁드립니다.

 

이더리움 블록체인의 구성 요소

 

이더리움 블록체인은, 

계정 / 상태 / 가스 및 수수료 / 상호작용 / 블록 / 상호작용의 집행 / 채굴 / 작업 증명 

등으로 구성된다. 

 

지난 글에 이어서 계속 설명한다.

 

5. 블록

이더리움의 블록은, 아래와 같이 구성된다.

1. 블록 헤더

2. 블록 내 포함된 트랜잭션 내역에 대한 정보

3. 부모 블록이 동일한 형제 블록들의 헤더의 집합 (Ommer blocks)

 

Ommer가 뭐야?

Ommer 블록은, <현재 블록의 부모 블록의 부모 블록(조부모 블록)과 부모 블록이 일치하는>, 즉 삼촌 블록 정도로 해석된다.

국내 여러 번역글은 부모가 동일한 형제 블록이라 서술해두기는 했는데, 원문 상에는 이렇다..

 

그래서 아래 이더리움 재단 공식 설명을 가져왔는데, 

ommer는 형제나 삼촌 다 일컬을 수 있기는 한 것 같다. 

어쨌든 공식적인 정의는, 

채굴자가 유효한 블록을 찾는 과정에서, 다른 채굴자가 먼저 블록체인의 끝에 블록을 올렸을 경우, 

이 유효하지만, 빠르게 나오지 못한 블록은 신규 블록들에 Ommer로서 추가되어 리워드의 일부를 수령하도록 하는 것이다. 

그러면 형제가 아니라 삼촌이 맞는 듯하다.

When a miner finds a valid block, another miner may have published a competing block which is added to the tip of the blockchain first. This valid, but stale, block can be included by newer blocks as ommers and receive a partial block reward. The term "ommer" is the preferred gender-neutral term for the sibling of a parent block, but this is also sometimes referred to as an "uncle".

https://ethereum.org/en/glossary/#ommer

 

다시 원문으로 돌아가면, 

이더리움은 설계 상 비트코인 등 타 블록체인에 대비해 블록 채굴 시간이 짧은데, 

이는 빠른 트랜잭션 작동이 가능하지만, 

한편으로는 경쟁하는 블록의 수가 그만큼 늘어나게 되어, 

경쟁에서 도태되어 메인 체인에 들어가지 못하는 <고아 블록>이 생성되기 마련인데, 

이들을 Ommer 블록으로서 추가하여 채굴자들의 리워드를 챙겨준다는 것이다.

 

Ommer로 추가되긴 하지만, 어찌되었든 추가되기 위해서는, 

다른 블록과 마찬가지로 유효함이 검증되어야 하고, 

유효하다는 의미는 현재 블록으로부터 6세대 이내에 들어와야 한다고 정의한다. 

 

6세대를 넘어서 격차가 발생하면, 더이상 Ommer 블록이라고 추가해줄 수 없는데, 

너무 오래된 트랜잭션을 추가해주기에는 복잡하고 무리가 생기기 때문이다.

 

이렇게 추가된 Ommer 블록은, 물론 최초 채굴자보다야 적지만, 그래도 보상을 수령한다. 

채굴자들이 최초 경쟁에 실패하더라도 경쟁에 참여할 인센티브를 일정 부분 보장해주는 것이다.

 

 

블록 헤더

블록 헤더에는 이런 구성요소가 포함된다.

https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369

 

1. parentHash, 부모해시

부모 블록의 헤더의 해시이다. 이를 통해 체인이 만들어진다.

 

2. ommersHash, 삼촌해시

현재 블록의 Ommer 명단의 해시를 담고 있다. 

 

3. beneficiary, 수혜자

블록 채굴에 대한 수수료를 수령하는 계정 주소이다.

 

4. stateRoot, 상태 루트

상태 트리의 루트 노드의 해시를 의미한다.

상태 트리가 헤더에 머클 패트리샤 트리 등의 형태로 저장되어

라이트 노드가 유효 상태 검증을 진행하기 용이해진다는 것을 기억해보자!

 

5. transactionsRoot, 트랜잭션 루트

이 블록의 모든 트랜잭션 내역을 담은 트리의 루트 노드의 해시이다.

 

6. receipitsRoot, 영수증 루트

이 블록의 모든 트랜잭션의 영수증을 담은 트리의 루트 노드 해시이다.

트랜잭션 영수증이란, 이더리움이 매 트랜잭션마다 생성된 정보를 보관하는 곳이다.
블록넘버 / 블록해시 / 트랜잭션해시 / 현재 트랜잭션에서 사용한 가스량 / 현재까지의 누적 가스 사용 총량 / 로그 등을 포함한다.

https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369

 

7. logsBloom, 로그불룸

로그 정보로 구성된 블룸 필터이다.

블룸필터(Bloom Filter)는 특정 원소가 집합에 속하는지 검사하는데 사용할 수 있는 확률형 자료 구조이다. 블룸필터는 비트코인 언리미티드(Bitcoin Unlimited) 팀이 노드에 알려지지 않은 거래를 식별하는 데 도움을 주고 있다. 블룸 필터에 의해 어떤 원소가 집합에 속한다고 판단된 경우 실제로는 원소가 집합에 속하지 않는 긍정 오류가 발생하는 것이 가능하지만, 반대로 원소가 집합에 속하지 않는 것으로 판단되었는데 실제로는 원소가 집합에 속하는 부정 오류는 절대로 발생하지 않는다는 특성이 있다. 

http://wiki.hash.kr/index.php/%EB%B8%94%EB%A3%B8%ED%95%84%ED%84%B0
이더리움은 다양한 트랜잭션 및 메시지를 추적할 수 있도록 로그를 사용한다.
계약 내에서 <이벤트>를 정의하여, 로그를 명시적으로 생성할 수 있다. 
로그 항목에는, 로거의 계정 주소 / 해당 트랜잭션에서 발생한 다양한 이벤트 토픽 / 이벤트와 관련된 데이터를 포함한다.
(로그 엔트리 = 로그 항목)
무한한 로그 데이터는, 효율성을 위해 블룸 필터에 저장된다.

https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369

 

8. difficulty, 난이도

이 블록의 생성 난이도 레벨을 의미한다.

이전 블록의 생성 난이도와 타임 스탬프, 블록 번호를 이용해 계산합니다.
block_diff= parent_diff+parent_diff//2048*max(1-(block_timestamp-parent_timestamp)//10,-99)+int(2**((block.number//1000000)

https://programmer-student.tistory.com/18
난이도를 설정하여, 블록 유효성 검증 시간이 모두 동일하도록 한다. 
블록마다 특정 공식을 기반으로 새로이 난이도가 책정되는데, 특정 블록이 이전 블록보다 빠르게 검증되었을 경우, 
이더리움 프로토콜이 자동으로 블록 난이도를 상향한다.
블록 난이도는 채굴 시 사용되는 논스와 작업증명에 영향을 주며,
난이도와 논스의 상관관계는 아래 이미지와 같은 식으로 나타낼 수 있다.
한 블록당 평균적으로 15초 정도가 작업증명에 사용되도록, 난이도와 논스가 조정된다.

https://preethikasireddy.medium.com/how-does-ethereum-work-anyway-22d1df506369

where&amp;nbsp;Hd&amp;nbsp;is the difficulty.

 

9. number, 블록 수

제네시스 블록, 최초의 블록을 0번 인덱스라 할 때, 

자녀로 세대가 내려가면서 하나씩 카운트하여 현재까지의 블록의 수를 확인한다.

 

10. gasLimit, 가스 한계량

블록당 현재의 가스 한계량

 

11. gasUsed, 가스 사용량

이 블록에서 트랜잭션 전체에 사용된 가스 총량

 

12. timeStamp, 타임스탬프

블록체인에 저장한 시간. 유닉스 타임스탬프 형태를 취한다.

타임스탬프는 블록의 생성 시간을 나타내는 값이자 그 시간에 검증 가능한 거래가 존재했다는 것을 명백히 입증한다. 블록이 생성된 순간부터 블록에 존재하며 거래 시간을 식별하는 용도로 사용된다. 하지만 블록체인에서는 실제 거래를 생성한 시각과 블록에 정식으로 저장한 시각을 타임스탬프에 저장하는데 두 기록이 일치하지 않아 문제가 발생하기도 한다.

Unix time 이란 1970년 1월 1일 0시 0분 0초 (UTC) 로부터 몇 초나 지난것인지를 표현한 것이다.

http://wiki.hash.kr/index.php/%ED%83%80%EC%9E%84%EC%8A%A4%ED%83%AC%ED%94%84

 

13. extraData, 추가 데이터

블록에 관한 추가 데이터, 기타 정보

블록과 관련된 정보를 저장하는 임의 바이트 배열입니다. 용량은 32바이트 이하로 정해져 있습니다.
https://programmer-student.tistory.com/18

 

14. mixHash, 믹스해시

논스와 결합되면, 이 블록이 충분한 연산을 거쳤음을 증명하는 해시.

논스와 함께, 작업증명에서 해시값을 계산하는데 충분한 계산횟수를 보장하기 위해 사용하는 값
https://steemit.com/kr/@brownbears/58jo3j

 

15. nonce, 논스

믹스해시와 결합되면, 이 블록이 충분한 연산을 거쳤음을 증명하는 해시.

 

각 구성요소를 살펴보았으니, 

그중에서 블록 헤더에 포함된 3가지 트리 구조에 집중해보자.

 

1. 상태 루트에서 이어진 상태 트리

2. 트랜잭션 루트에서 이어진 트랜잭션 트리

3. 수령자 루트에서 이어진 수령자 트리

 

이는 모두 우리가 이전에 논의한 머클 파트리샤 트리이다.