비트코인과 이더리움의 근간이 되는 기술인 블록체인부터 알아보자.
블록체인이란?
탈중앙화, 투명성, 불변성 특징을 가진 네트워크에 저장된 데이터 기록(블록)을 체이닝하여 만드는 기록 기술.
탈중앙화: "네트워크"에 저장된 데이터 기록이라고 헀잖아요? 네트워크는 각 컴퓨터(노드)들이 이루는겁니다. 한 데이터를 한 놈만 가지고 관리하는게 아니라, 네트워크를 구성하는 모든 노드늘이 주인이 되어서 가지고 관리하고 있는겁니다. 그래서 탈 중앙화 라고 합니다.
투명성: 위에서 말한 것처럼 한 데이터에 대한걸 모든 노드들이 다 알고 있기에 투명성이 보장된다고 하는 겁니다.
불변성: 자 그럼 각자 관리하면 각자 데이터를 수정하고 달라지지 않냐라는 생각이겠지만, 한 데이터를 수정하거나 바꾸기 위해선 네트워크를 구성하는 51%이상의 노드들이 수정에 동의 혹은 합의해야합니다. 사실상 이게 현실적으로 불가능하기 때문에 불변성을 보장한다고 하는 겁니다.
비트코인과 이더리움
위에서 설명한 블록체인을 기반으로 생긴게 비트코인과 이더리움입니다.
비트코인(중앙 기관 없는 디지털 화폐를 만들자): 거래를 목적으로 개발된 디지털 통화(BTC)이자 시스템입니다.
"거래 내역"이 블록이 되어 체인을 이룹니다.
크게보면 비트코인에서의 "거래 장부"가 블록체인이라고 보면 됩니다.
이더리움(신뢰 없이도 운영되고 관리되는 애플리케이션을 개발하고 운영하는 플랫폼을 만들자): 비트코인처럼 화폐의 역할과 플랫폼의 역할을 함. 이더리움에선 화폐를 이더(ETH)라고 부름.
주 목적은 괄호 안에 있는 내용이라 달라.
뭐 비트코인의 업글이라고 생각할 수 있지만 목적 자체가 달라 업글이라고 보기엔 좀 그렇다.
이더리움에서 블록에는 화폐(이더)의 이동뿐만 아니라, 스마트 계약의 상태 변화, 앱의 모든 변화들을 블록에 저장함.
비트코인과 이더리움의 차이
비트코인은 화폐의 이동(변화)이 거래가 되고 거래 내역들이 블록을 이룬다고 했지.
이더리움은 화폐의 이동(변화) 뿐만 아니라 스마트 계약의 호출, 생성, 상태, 앱의 상태 변화 등 바꾸는 모든 행위까지 포함하여 블록을 이뤄.
사실이게 가장 큰 차이점임.
GPT가 깔끔하게 정리한걸 보여줌
비트코인은 ‘돈의 거래’를 위한 시스템이고,
이더리움은 ‘상태의 변화’를 위한 시스템이다.
다시 블록체인이란?
자 그럼 이제 블록체인에 대해 더 자세히 이해할 수 있게됌.
이름이 "블록" "체인"이니 블록은 이해했고 왜 이 블록들을 체인했지? 라고는 생각이 들었다.
결론부터 말하자면,
시스템 불문 모든 블록들은 이전 블록의 해쉬값을 함께 저장함.(해쉬값이 뭔진 알제? 블록의 0.00000000000001만 바뀌어도 해쉬값이 바뀐다.)
그럼 먼저 만들어진 A블록의 해쉬값을 B블록이 저장하겠지? 이 둘을 체이닝하면 B가 존재하기 위해선 A가 불변해야함.
이렇게 "의존 구조"가 나오고 시스템적으로 강제처럼보이는 신뢰가 생기니 체이닝을 하여 블록체인이라는게 생긴거지
이래서 악성 노드가 블록체인 네트워크에 들어오거나 생겨도 본인 블록이나 다른 사람 계정 해킹해서 블록바꾼다고 해도 해쉬가 바뀌니 이전 블록, 그 이전 블록에 등록된 그 이전 이전 블록을 다 바꿔야 하니 현실적으로 불가능 하니까 신뢰성이 생기는겨
시간선(변하지 않은 타임라인 및 기록 및 흔적)
위에서 체이닝 관련 이야기를 했었지.
블록은 원칙적으론 시간 순서대로 나열되고 체이닝된다.
이 덕분에 블록 체인은 시간이 변하지 않는 가장 진실된 타임라인이라는 소리를 듣곤하지
그러나 현실에선 가끔 꼬이는 경우가 생긴다.
한 네트워크는 겁나 많은 노드로 이루어 지기때문에 블록이 생성되는 타이밍이 겹치는 경우가 생긴다.
이럴 경우를 포크가 생겼다라고 함.
포크가 생기면 겹친 블록에서 잠시 두가지 체인으로 나뉘고 그 뒤로 다시 똑같이 순서대로 블록이 생기고 체이닝된다.
이제 체인이 2개가 되었지?
이후 포크가 생기기 전과 같이 노드들이 블록을 생성해서 체인에 계속 이어 붙겠지
어떤 체인에 배정되서 블록이 체이닝된다는 기준은 처음엔 네트워크 전파 속도 차이였다가 어느 정도 체인이 형성된 이후엔 "누적 작업량"이 높은 체인에 연결된다.
체인1은 유럽, 체인 2는 미국에서 만들어졌으면 이후 유럽에 사는 노드가 만드는 블록은 체인1에 체이닝 되는거라고 보면된다.
이렇게 두 블록이 쭉 이어지다보면 어느 순간 한 체인이 압도적으로 "누적 작업량"이 많아진 체인이 생기겠지.
그럼 누적 작업량이 적어진 포크 이후 체인에 있는 블록들은 "고아 블록"이 되고 많았던 체인은 공식 타임라인으로 인정이 되는거지.
고아 블록의 운명은?
고아 블록 내의 거래 내역(트랜잭션)은 유지된다.(입금 대기 상태라고 이해하셈)
공식 체인에 들어가야지만 거래가 되었다라고 하기 때문이다.
대부분의 노드 소프트웨어들은 이 트랜잭션을 mempool에다가 올린다.
블록은 채굴자라는게 네트워크에 올려 체이닝하는데 채굴자가 올린 블록이 고아 블록이 되면 블록을 체인에 올리면 주는 보상은 못받음(시간과 자원은 썼지만 아무것도 받지 못한거임)
근데 이더리움은 고아블록말고 언클 블록이라고 부르고 보상은 어느정도 준다고 하네.
채굴자? 니 누군데
블록을 만들고 만든 블록을 체인에 등록하는 사람을 말한다.
일단 채굴자는 네트워크에 흩어진 거래(트랜잭션)들을 모아다가 블록을 만들어.
그 후 체인에 올리기 위해 작업 증명이라는걸 해
작업 증명이 되면 네트워크로 전파하고 다른 노드들이 검증한 뒤 체인에 정식적으로 붙어.
그리고 일정의 보상을 받지.
합의 -> 작업 증명(PoW)
네트워크에 미리 정해진 기준의 해쉬값보다 작아야 블록이 유효하다고 인정함.
채굴자가 만드는 블록은 아래 것들로 구성됨
hash = SHA256(이전 해시 + 거래들 + 시간 + nonce)
이 값들을 요리조리 바꿔가며 해쉬 기준에 충족하도록 맞추는 것임.
그래서 막 GPU 공장 해놓고 채굴장이라고 하는게 이런 작업하는거 때문임.
좀더 어렵게 말하면 이건 합의 과정인거임.
이 블록이 우리 체인에 들어와도 되는지 합의과정을 맞추기 위한 과정이라고 보면된다.
그 과정의 여러 방법중 하나가 작업 증명(PoW)인거고.
코드로 보면 요런 느낌
nonce = 0
while True:
hash = SHA256(block_header + nonce)
if hash < target:
break # 성공!
nonce += 1
왜 이렇게 어렵게 하냐?
너무 느리면 블록 변조가 쉬우니까 변조도 막을겸 노력의 증거를 보이는겸사겸사인거임
비트코인은 약 2주마다 조정해서 10분당 1블록 목표를 유지한다고 함.
더 자세한 hash만드는건 아래에 나올 블록 포맷에서 좀 더 자세히 다룰게
합의 -> 작업 증명(PoS)
합의 단계에서 사용하는 방법 중 다른 하나에 PoS라는게 있음.
우선 PoW에선 채굴자라는 표현을 사용했지만 PoS에선 검증자라고 말하는게 이해하기 편해
이건 처음부터 본인 코인, 그니까 돈을 담보로 보여주고 블록 생성할 권한을 얻는거야.
돈을 많이 넣은 사람에게 검증자가 될 높은 확률의 기회를 주는거지.
이러면 돈많은 나쁜놈이 이상한 짓 할 수 있는거 아니냐라고 하겠지만, 부정행위하면 예치한 코인 몰수라서 할 엄두가 안나
일단 전체적인 프로세스는 아래와 같지.
1. 검증자가 되고 싶은 불특정 다수가 네트워크에 코인을 예치하여 후보가 됨
2. 네트워크가 가장 많이 예치한 사람에게 블록 만들 기회를 줌
3. 선택 받은 사람이 블록을 만들어 네트워크에 올림
4. 검증 과정을 거침
5. 검증이 okay되면 네트워크에 올라가고 예치금과 보상을 받음(채굴 보상은 아니고 수수료나 일부 새 코인 보상을 받음)
6. 부정행위하면 예치금 몰수.(슬래싱이라고 부름)
그럼 예치금 없는 사람은 채굴자가 되는 기회조차 없는거 아니냐? 이로인해 중앙화가 되는거 아니냐?라는 걱정이 많았지만, 한사람이 대표로 작은 예치금들을 모으는 "스테이킹 풀"이라는 작업을 통해 해결했다고 볼 수 있지.
비트코인은 아직 PoW 쓰지만 이더리움은 2022년 The merge라는 프로젝트 이후로 PoS를 채택하여 사용중임.
이유는 PoS가 에너지(전기)를 덜 쓰고 스테이킹 풀 덕분에 참여 조건 장벽이 오히려 더 낮아지게 되기 때문이지.
The merge라는 프로젝트에 대해선 다른 포스트에 정리하도록 하지.
검증
검증은 크게 두가지 검증으로 나뉨
1. 블록 자체에 대한 검증
2. 블록 안의 거래(트랜잭션)에 대한 검증
블록자체에 대한 검증은 아래 항목들을 검사함.
- 이전 블록 해시가 유효한지 즉, 체인에 잘 이어졌는지
- 시간이 너무 앞서거나 늦지 않았는지
- 해당 블록의 해시값이 목표하는 해시값보다 작은지
- 블록 포맷이 올바른지
- 채굴자 보상 요청을 규칙에 맞게 잘 기입했는(너무 많이 혹은 너무 적게 기입하진 않았는지 보는거임)
여기서 블록 포맷에 대한 개념이 나오는데 이거 끝나고 설명함.
트랜잭션에 대한 검증은 아래 항목들을 검사함.
- 트랜잭션이 올바른 개인 키로 서명되었는지
- 송금자가 실제로 그 금액만큼의 코인을 가지고 있는지 잔고 확인
- 이미 쓴 돈을 또 쓰려는 시도는 아닌지 이중 지불 체크
- 트랜잭션 수수료 계산이 규칙에 맞는지
- 트랜잭션 구조가 정확한지
자 이 과정을 노드 관점으로 좀 쉽게 설명하자면.
자자 새로들어오려는 블록놈좀 볼까?
너 규칙대로 블록 잘 만들었나? -> 음 좋아 잘했군
넣은 트랜잭션에 이상한거 없제? -> 음 좋군
보상 너무 많이 가져가려고 하는건 아니제? -> 음 적당하군
시간도 제대로 쓴 것 같고, 블록도 너무 크지 않네?(해쉬값 검증) -> 음 좋네
좋아써! 블록 컴온.
이런 느낌임.
블록 포맷
비트코인 기준이지만 왠만하면 블록은 아래 포맷을 따른다.
보통 크게 2가지로 구성된다고 보는데 블록헤더와 트랜잭션 리스트다.
블록헤더는 아래 포맷 거의 고정되게 들간다고 보면되고 아래 구성들을 SHA-256으로 두번 해싱하면 그게 블록의 해시값임.
version (4 bytes) | 블록의 소프트웨어 버전 |
previous_block_hash (32 bytes) | 이전 블록의 해시 |
merkle_root (32 bytes) | 모든 트랜잭션의 머클 트리 루트 |
timestamp (4 bytes) | 블록 생성 시간 |
difficulty_target (bits) (4 bytes) | 난이도 조정용 값 |
nonce (4 bytes) | 해시 퍼즐을 풀기 위한 숫자 |
난이도 조정용 값은 네트워크에서 정한 목표 해시값임 ㅇㅇ
머클 트리라는게 나오는데 이거 다음 목차에서 설명함.
이제 저게 블록의 헤더로 들어가고 내용에 트랜잭션 리스트들이 들어가겠제
근데 트랜잭션 들가기 전에 항상 첫번째 리스트엔 "코드베이스 트랜잭션"이라는게 들어감
이건 블록을 올리는 채굴자가 보상을 받기 위해 본인 지갑으로 보상 넣는 트랜잭션을 넣는거임
보상만 들가는게 아니라 그 아래 올 모든 트랜잭션의 수수료까지 포함해서 받게 된다.
수식으로 한 눈에 보자면 아래와 같이 코인베이스 트랜잭션이 구성된다.
[블록 보상] + [해당 블록에 포함된 모든 트랜잭션 수수료]
왜 이름이 코인베이스 트랜잭션이냐?
코인 거래하는 트랜잭션의 가장 첫번째(베이스)로 나오는 트랜잭션이기 때문.
이더리움이나 PoS체인은 코인베이스 트랜잭션이 따로 없고 보상이 자동 지급된다.
머클 트리
머클은 사람 이름이라 뭐 딱히 의민 없다. 걍 외워라.
머클 트리는 쉽게 말해 여러 트랜잭션 해시들을 하나의 해시로 줄여주는 트리 구조임.
어떻게 하냐? 트랜잭션 해시 2개를 하나로 합친다.
그럼 3개도 아니고 4개도 아니고 왜 하필 2개냐?(왜 이진 트리냐?)
알고리즘 조금이라도 공부해본 사람은 알겠지만, 트리 깊이(depth)가 log2의 N으로 딱 떨어짐.
그래서 속도 측면이든 표준화나 효율성(대표적인 블록체인들이 다 이진 트리 구조임)측면이든 2개가 좋은거제.
그리고 검증과정에서도 머클 트리 구조가 좋음(이 트랜잭션이 이 블록에 들어가 있는가?를 확인하는 도중에 도움이 됌)
왜냐면 2개씩만 묶으면 방향이 하나니까 한 방향으로만 보면 되기 때문이지.
예를 들면 체인에 H2라는 트랜잭션이 있는지 확인하려면 H1과 H3만 보면되지 3개씩 묶으면 더 확인해봐야하는거니까..
암튼 머클 트리 계산은 아까 말한 것처럼 2개를 하나로 합치는 과정을 무한 반복하여 최종적으로 한개의 해시가 나올때 까지 하면 된다.
최종적으로 나오는 대가리 해시를 머클 루트라고 부름.
이상 블록체인 관련된 배경 지식들은 어느정도 정리한 것 같네.
공부나 상식 자랑에 도움이 되길..
틀린 부분은 최대한 없게끔했는데 혹시라도 있으면 많은 태클 부탁.
궁금한점도 언제든지.
'Smart contract audit' 카테고리의 다른 글
[Smart contract audit]Solidity Helloworld! (0) | 2025.06.08 |
---|---|
[Smart contract audit]이더리움 (0) | 2025.06.07 |
[Smart contract audit]스마트 컨트랙트 (0) | 2025.06.07 |