지피티가 없던 시절의 나는 백서를 읽어도 읽지 않은 것과 같은 안타까운 신세에 불과하였다. 하지만 지피티느님의 성은으로 블록체인을 조금 이해하게 되었다. 10년만에 알게 된 이더리움 백서에 담긴 이론들이다.
이더리움의 튜링 완전성
이더리움(Ethereum)이 튜링 완전(Turing-complete)하다는 주장은 대체로 맞는 주장입니다. 다만 "튜링 완전"이라는 개념은 몇 가지 전제를 필요로 하는데, 이더리움의 경우 이를 다음과 같이 볼 수 있습니다.
EVM(Ethereum Virtual Machine)의 설계: 이더리움은 트랜잭션 내에서 EVM 상에서 실행되는 스마트 컨트랙트 코드가 임의의 계산을 수행할 수 있도록 설계되었습니다. 이는 조건문, 반복문, 임의의 상태 변경, 메모리 접근 등을 모두 지원하므로 이론적으로 튜링 기계로서의 계산 능력을 가집니다.
계산의 제약 조건: 이더리움에는 “가스(gas)”라는 계산 비용 개념이 있어 무한 루프나 비정상적인 종료를 막습니다. 즉, 무한히 계산을 이어갈 수는 없으며, 가스 부족 시 실행이 중단됩니다. 이 때문에 이더리움의 튜링 완전성은 이론적으로는 성립하지만, 실질적으로는 "가스 제한이라는 외부적 자원 제약" 하에서의 튜링 완전성입니다. 이는 현실적으로 “튜링 완전한 계산을 시도할 수는 있으나, 자원(가스)이 허용하는 한도 내에서만 계산이 가능하다”는 의미입니다.
종합하면, 이더리움 블록체인 상의 EVM은 언어적으로 혹은 계산 이론적인 관점에서 튜링 완전성을 목표로 설계되었으며, 이는 대체로 받아들여지는 사실입니다. 다만 이 튜링 완전성을 현실적으로 제어하기 위해 가스 시스템이라는 자원 제약 메커니즘이 존재한다는 점이 특징적입니다.
해시 -SHA256
-sha256은 어떤 길이의 데이터이든지 간에 256비트로 전환된다. 이는 체인방식으로 데이터를 처리하기 때문이다.
-따라서 긴 데이터에 대해 해시함수는 일정의 압축과정이 된다.
SHA-256에서 긴 데이터를 처리하는 방식
입력 데이터를 512비트 블록으로 나누기
데이터가 길면 512비트 블록 여러 개로 나눕니다.
예를 들어, 10,000비트 데이터는 10,000 ÷ 512 = 약 19.5 → 20개의 블록이 필요합니다.
마지막 블록이 512비트보다 짧다면, 패딩을 통해 정확히 512비트로 맞춥니다.
각 블록을 순차적으로 처리
해시 함수는 각 블록을 독립적으로 처리하지 않고, 이전 블록의 출력값을 다음 블록의 입력값으로 사용합니다.
이 과정을 체인 방식의 압축이라 부릅니다.
내부적으로 사용되는 256비트 상태값(초기값 포함)을 계속 갱신하며 데이터를 처리합니다.
압축 함수로 고정된 상태값 유지
긴 데이터가 들어오더라도, 각 블록의 연산 결과는 항상 256비트 상태값으로 압축됩니다.
예를 들어, 20개의 블록이 있으면 다음과 같은 흐름으로 진행됩니다:
마지막 상태값 H20이 최종 출력 해시값입니다.
출력값 생성
모든 블록을 처리한 후 최종 상태값은 **256비트(32바이트)**로 고정됩니다.
머클트리
-각각의 트렌젝션들은 머클트리로 구조화 된다.
-트젠젝션 데이터중에 어느 하나라도 변경된다면 root값은 달라지게 된다.
-머클트리는 데이터가 원본 데이터인지 여부를 확인하는 용도로 쓰인다.
머클 트리의 작동 원리
단계별 설명:
데이터 준비
예를 들어, 4개의 데이터 A, B, C, D가 있습니다. 각 데이터를 해시 함수에 넣어 해시 값을 생성합니다.
부모 노드 생성
두 개의 리프 노드 해시 값을 합쳐서 부모 노드의 해시 값을 만듭니다.
루트 노드 생성
두 부모 노드의 해시 값을 다시 합쳐서 최상위 루트 노드의 해시 값을 생성합니다.
결과 트리 구조:
Root: 전체 데이터의 요약 해시 값
H1, H2, H3, H4: 각각의 데이터(A, B, C, D)의 해시 값
작업증명
-변수를 논스로 목표값을 해시값으로 해서 블록헤더에 대한 해시함수 연산을 수조번 반복해서 목표 해시값보다 작은 논스를 찾는 과정이 바로 채굴이다.
블록체인 채굴 과정에서 논스(Nonce)는 "목표값 이하의 해시값"을 찾기 위한 핵심 변수입니다. 채굴자는 블록 헤더의 데이터를 해시 함수(SHA-256)에 입력하여 출력값(해시)을 생성하며, 이 해시가 네트워크가 설정한 목표값(Target)보다 작아야 합니다. 이를 통해 블록의 유효성을 확인하고 새로운 블록을 추가하게 됩니다.
블록 헤더란?: 블록 헤더(Block Header)는 블록체인 상의 각 블록을 대표하는 핵심적인 정보들이 담긴 작은 데이터 구조입니다. 예를 들어, 비트코인의 경우 블록 헤더는 다음 정보를 포함합니다.
이전 블록의 해시
머클 루트(Merkle Root) : 블록 안의 모든 거래 정보가 압축된 해시 값
블록 생성 시점의 타임스탬프
난이도 목표(목표 해시 값)
논스(Nonce)
논스(Nonce)의 역할: 논스는 "한 번만 사용되는 숫자(Number Once)"로, 블록 헤더에 포함된 32비트(약 42억 개 정도의 경우의 수) 크기의 수입니다. 채굴자는 처음에 논스를 0으로 설정한 뒤, 블록 헤더 전부(이전 블록 해시, 머클 루트, 타임스탬프, 난이도, 그리고 현재 논스)를 합친 값에 대해 SHA-256 해시를 구합니다. 그 결과 나온 해시값이 네트워크에서 요구하는 목표값(난이도)보다 작아야 합니다.
만약 해시값이 목표값보다 크면, 논스를 1 증가시켜 다시 해시를 해봅니다.
그래도 크면 논스를 2로 늘려 다시 해시, 계속 이런 식으로 시도합니다
오펀 블록
-nonce 찾기는 경쟁적으로 이루어지므로, 여러개의 해가 동시에 존재할 수 있고 이때 일시적으로 체인은 여러개가 된다. 때문에 보통 6개 정도의 블록이 누적되었을 때 최종 컨펌된다. 코인이 메인 블록에 포함되지 않았다면, 채굴자들은 나의 트렌젝션에 포함된 수수료를 보상받지 못한다.
-비트코인 마이너들의 노드들은 메인 블록이 아닌 일시적으로 포크된 블록들도 가지고 있고, 그 블록들에 포함된 수수료도 취하길 원한다. 즉 전송이 지연될 수 있지만 결국 그 트렌젝션은 다음 블록 생성시 포함되어 전송된다. 수수료가 너무 작아서 계속 누락된다면 해당 트렌젝션에 수수료를 추가하는 방법도 있다.
1. 트랜잭션이 ‘취소’되지는 않는다
비트코인 트랜잭션은 불특정 노드들의 ‘mempool(메모리풀)’에 저장되어 있다가, 채굴자가 블록을 만들 때 그 트랜잭션을 골라 블록에 담아 “확정”시킵니다.
만약 포함된 블록이 오펀(Orphan) 판정을 받아 메인 체인에서 제외되면, 그 블록에 담겼던 트랜잭션도 **“확정되지 않은 상태”**로 돌아갑니다.
“취소”가 아니라, **“아직 메인 체인에 반영되지 않았다”**고 보는 것이 맞습니다.
2. 다시 “유효 트랜잭션”으로서 재전파된다
오펀이 된 블록에 포함되었던 트랜잭션은 대부분의 노드의 mempool(또는 재전파 프로세스)에서 계속 보관되거나, 다시 전파(Broadcast)됩니다.
유효성 자체가 파괴된 것이 아니기 때문에, 그 트랜잭션은 이후에 다른 채굴자가 새 블록을 생성할 때 다시 포함될 수 있습니다.
3. 사용자가 별도의 “재송신”을 해야 하나?
일반적으로는 사용자가 별도로 “트랜잭션을 다시 보낸다”고 할 필요는 없습니다.
이미 그 트랜잭션이 유효하고, 전체 노드(채굴자 포함)들이 mempool에 보관하고 있기 때문입니다.
다만, 네트워크 상황에 따라 트랜잭션 수수료(수수료가 너무 적다면 우선순위가 떨어질 수 있음)가 낮은 경우, 여러 번 재전파가 필요할 수 있습니다. 어떤 지갑 소프트웨어는 수수료를 높여서 ‘Replace-By-Fee(RBF)’ 기능을 활용해 다시 전송하기도 합니다.
4. 사용자 입장에서의 체감
오펀 블록에 포함된 트랜잭션은 잠시 “1회 확인(Confirm)이 되었나?” 했다가, 체인이 재구성(Reorg)되며 그 확인이 사라지는 현상을 겪습니다.
일반 사용자는 이를 ‘확정’이라 보기 어렵기에, 보통 6컨펌(6블록 이상 누적) 정도를 기다리는 관행이 생겼습니다.
결국 조금 더 기다려야 하는 불편이 있을 뿐, 트랜잭션 자체가 “소멸”되거나 “취소”되는 것은 아닙니다.
요약
잘못된(오펀이 된) 체인에 포함된 트랜잭션은 그 블록이 메인 체인에서 제외됐을 뿐이고, 트랜잭션 자체가 취소되는 것은 아님.
그 트랜잭션은 여전히 유효하며, 네트워크에서 다시 전파되어 향후 발견되는 새 블록에 포함될 가능성이 큼.
따라서 일반 사용자는 “다시 보내야 하나?” 고민할 필요가 거의 없고, 결국 조금 더 기다리면 해당 트랜잭션이 올바른 블록에 담겨 최종 확정(Confirm)됩니다.
*헤시 레이트
채굴기의 해시레이트(Hash Rate)
최신 채굴기는 초당 수십조에서 수백조 회의 해시 계산을 수행할 수 있습니다. (예: Antminer S19 XP는 약 140 TH/s)
해시레이트는 네트워크의 보안 수준과 활동성을 나타내는 지표로, 코인별로 총 연산량을 추정할 수 있습니다.