인사이트
블록체인 구조와 블록체인 트랜잭션
2023년 02월 07일
블록체인 네트워크는 블록과 체인, 즉 여러 블록(Block)이 사슬(Chain)처럼 묶여 하나의 거대한 네트워크를 형성하는 구조이기 때문에 블록체인 네트워크라고 부릅니다.
그렇다면 블록체인을 이루고 있는 블록 하나하나의 구조는 어떻게 구성되어 있을까요? 블록 하나는 헤더(Header)와 바디(Body)로 나눠져 있으며 헤더는 메타데이터, 바디는 트랜잭션 리스트로 구성되어 있습니다.
메타데이터는 이 블록을 누가, 언제 생성한 블록인지, 이 블록의 크기와 총 코인 전송량은 얼마인지 같은 해당 블록 자체를 설명하는 데이터입니다. 이 메타데이터는 블록의 가장 상단에 위치하기 때문에 블록 헤더(Header)라고 부르기도 합니다.
블록체인을 구성하는 블록 헤더에는 위 그림과 같은 데이터가 담겨있습니다. 각 데이터가 무엇을 의미하는지 하나씩 살펴보겠습니다.
1) 버전
우선 버전 정보엔 해당 블록이 비트코인의 어떤 버전을 사용하고 있는지 표기합니다. 이는 이후에 있을 수 있는 소프트웨어 프로토콜의 업데이트를 추적하기 위한 버전 번호이기도 합니다.
2) 이전 블록 헤더 해시
이전 블록 헤더의 해시는 블록체인을 체인으로 묶어주는 중요한 개념입니다. 예를 들어, 101번째 블록을 채굴하려는 채굴자(Node)가 100번째 블록을 전달받았을 때 해당 블록의 헤더 데이터를 두 번 해시해서 101번째 블록에 담게 되는 것이죠.
이전 블록 헤더 해시는 흔히 블록 해시(Block Hash)라고 부르기도 하는데요. 그렇게 말할 경우 이 블록 해시가 블록 전체를 해시한 데이터인지, 이 해시 데이터가 담겨있는 블록을 해시한 데이터인지 알 수 없기 때문에 보다 정확하게 특징짓기 위해 이전 블록 헤더 해시라고 칭했습니다.
3) 머클 루트
머클 루트(Merkle Root)는 머클 트리의 최상단에 위치한 데이터를 의미합니다. 머클 트리(Merkle Tree)는 392개의 트랜잭션을 각각 해시한 후 2개씩 짝을 지어 해시하고, 해시한 데이터끼리 또 2개씩 짝을 지어 해시하는 과정을 하나의 해시값이 남을 때까지 반복하는 트리 구조입니다. 여기서 남은 하나의 해시값이 바로 머클 루트입니다.
머클 루트를 저장하는 이유는 바로 블록의 유효성을 확인하기 위해서입니다. 블록체인 네트워크는 여러 참여자가 있고, 그 참여자들의 환경은 전부 상이합니다. 네트워크에 기여하기 위해 블록체인 네트워크의 정보를 모두 내려 받기에는 무리가 있을 수 있죠. 하지만 머클 루트를 사용한다면 어떨까요? 트랜잭션이 하나라도 변경된다면 그에 따라 해시값이 변경되고, 자연스레 머클 루트 또한 변경되기 때문에 64글자를 비교하는 것만으로 해당 블록이 정상인지, 변조된 것인지 판별할 수 있습니다.
4) 타임스탬프
유닉스(UNIX) 시간의 시작인 1970년 1월 1일 자정을 기준, 초 단위로 해당 블록의 채굴 시각이 기록됩니다.
5) 난이도 목표
블록 생성을 흔히 ‘채굴한다’고 말합니다. 채굴 난이도는 방 안에서 물건을 찾는 것에 비유할 수 있는데요. 방에서 연필같이 작은 물건을 찾는 것이 책상처럼 큰 물건을 찾는 것보다 훨씬 어렵고, 시간이 오래 걸리는 것과 같은 것이죠.
블록체인은 블록마다 생성된 블록의 높이에 따라 자동으로 난이도 목표를 달리 설정해 채굴되는 속도를 일정하게 유지(비트코인의 경우 10분에 1개)합니다.
6) 논스
블록을 생성할 때 헤더에 담기는 많은 데이터 중 주어지거나, 계산하지 않는 값이 하나 있습니다. 바로 논스(Nonce)입니다.
채굴은 앞서 설명한 5가지 데이터와 논스를 조합해 목표에서 정한 값보다 작은 해시값을 찾는 것입니다. 5가지 데이터는 모두 자동으로 주어지거나, 계산되는 고정값이기 때문에 변숫값을 적용해가며 목푯값보다 낮은 해시값을 찾아야 하는데요. 여기서 변숫값이 바로 논스이죠. 이더리움은 트랜잭션 내에도 논스가 존재합니다.
사실 블록 내에 바디라는 필드는 존재하지 않습니다. 블록은 위에서 설명한 블록 헤더 외에 블록의 크기, 거래(트랜잭션) 리스트가 있는데요. 이 중 거래 정보를 담은 부분을 바디라고 칭하며, 블록 크기의 대부분을 차지합니다.
지금까지 설명 중 ‘트랜잭션’이라는 용어가 자주 언급되는데요. 트랜잭션이 무엇인지도 이어 알아보겠습니다.
트랜잭션(Transaction)이란, 블록체인이라는 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위라고 할 수 있습니다. 블록체인 네트워크는 하나의 커다란 데이터베이스로, 블록체인 내 트랜잭션 역시 다른 데이터베이스에서 트랜잭션의 안전성을 보장하기 위한 성질인 A.C.I.D를 가지고 있습니다.
비트코인과 이더리움 이 두 네트워크 트랜잭션의 가장 큰 차이는 논스(Nonce)의 유무입니다. 이더리움 트랜잭션에는 논스가 존재하고, 이 논스는 이중 지불을 방지하는 데 사용합니다.
* 이중 지불(Double Spending) : 원본 파일에 저장된 가치를 지불한 뒤, 해당 파일을 복사하여 다른 사람에게 또 지불하는 것을 의미
이더리움의 논스는 두 가지 특성을 가집니다. 트랜잭션 시 논스가 1씩 증가하며, 한 계정 내 논스는 유일하고 동일한 논스가 존재하지 않습니다. 한 계정의 트랜잭션들 또한 각각 고유한 논스를 가지고 있으며, 가장 오래된 순서부터 1씩 증가하는 값을 가집니다.
만약 논스가 1인 트랜잭션을 발신한 후 이어서 논스가 2인 트랜잭션을 발신한다면, 두 번째 트랜잭션은 어떤 블록에도 포함되지 않습니다. 두 번째 트랜잭션은 멤풀(Mempool)이라는 임시 저장공간에서 논스가 1인 트랜잭션을 기다리며, 논스가 1인 트랜잭션이 발신되면 멤풀에 있던 트랜잭션 역시 처리되고 블록에 포함됩니다.
같은 논스를 가진 트랜잭션이 다수 발신된 경우에는 가스비(수수료)가 가장 높은 트랜잭션 하나만 처리되며, 이런 방법으로 이더리움은 이중 지불을 방지합니다.
논스가 존재하지 않는 비트코인은 이중 지불을 어떻게 방지할까요? 바로 UTXO(Unspent Transaction Output), 미사용 트랜잭션 출력값을 사용합니다.
비트코인의 송금은 실제 금액을 발신하고, 수신하는 것이 아닌 송금하는 금액이 적힌 UTXO를 주고받습니다. 트랜잭션을 발생시키면 이 UTXO는 TX Pool에 들어가게 되는데요. 채굴하는 과정에서 이 UTXO에 사용 기록이 있다면 해당 거래를 무효화하는 방식으로 이중 지불을 방지합니다.
이런 논스의 존재 여부 외에도 비트코인의 트랜잭션은 화폐 송금 기능만 가지고 있다면, 이더리움 트랜잭션은 송금을 넘어 스마트 컨트랙트를 호출하는 용도로도 사용할 수 있다는 차이가 있습니다.
코드스테이츠 블록체인 부트캠프에서는 탄탄한 이론을 바탕으로 블록체인 생태계의 가능성에 도전하고 싶은 분들을 기다립니다. 블록체인 트랜잭션과 구조 등 이론 학습에 이어 더 깊고 넓은 블록체인 생태계를 배우고 싶다면, 코드스테이츠 블록체인 부트캠프와 함께해 보세요.
글 이유정 Blockchain Engineer, 신성훈 Educational Operation Manager (블록체인 부트캠프)
편집 최인성 Content Manager
🚀 블록체인 개발자 커리어의 시작,
블록체인 부트캠프가 더 궁금하다면?
목록 보기
추천글