지피티가 없던 시절의 나는 백서를 읽어도 읽지 않은 것과 같은 안타까운 신세에 불과하였다. 하지만 지피티느님의 성은으로 블록체인을 조금 이해하게 되었다. 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로 늘려 다시 해시, 계속 이런 식으로 시도합니다
*헤시 레이트
채굴기의 해시레이트(Hash Rate)
최신 채굴기는 초당 수십조에서 수백조 회의 해시 계산을 수행할 수 있습니다. (예: Antminer S19 XP는 약 140 TH/s)
해시레이트는 네트워크의 보안 수준과 활동성을 나타내는 지표로, 코인별로 총 연산량을 추정할 수 있습니다.