[ETH] 블록체인 용어 정리

기훈·2025년 10월 11일

UTF-8

문자를 컴퓨터가 이해할 수 있는 숫자(바이트) 로 바꾸는 규칙.
사람이 말하는 언어(문자)를 컴퓨터 언어(숫자)로 번역하는 사전 역할을 한다.

  • 영어, 숫자: 1바이트
  • 한글: 3바이트
  • 이모지: 4바이트

진법 (Number Base)

숫자를 표현하는 방법.
진법이 커질수록 같은 값을 더 짧게 표현할 수 있다.

진법사용 기호예시
2진수0, 11010
10진수0–910
16진수0–9, A–FA (=10진수 10)

16진수 (HEX)

숫자(바이트)를 사람이 읽기 쉽게 0~9, A~F 로 표현하는 방법.

  • 1개의 16진수 = 4비트
  • 2개의 16진수 = 1바이트

예시

  • 10진수 255 → 16진수 FF
  • 문자열 "A" → UTF-8 바이트 41 (16진수 표현)

인코딩 (Encoding)

데이터를 다른 표현 방식으로 변환하는 것.

예시

"A" → [0x41] (UTF-8 인코딩)
[0x41] → "41" (HEX 인코딩)

디코딩 (Decoding)

인코딩된 데이터를 원래 형태로 복원하는 것.

예시

"41" (HEX 문자열) → [0x41] (바이트 배열)

해시 (Hash)

임의의 데이터를 ‘고정된 길이의 숫자(바이트)’로 요약하는 함수.

  • 해시는 바이트 단위로 연산된다.
  • 문자열은 먼저 UTF-8 인코딩으로 바이트 배열로 변환된 후 해시된다.
  • 해시 결과는 사람이 보기 좋게 16진수(HEX) 로 표시된다.

블록체인에서 자주 사용하는 형태

32바이트 = 256비트 = 64자리 16진수
예: 0x4717...cb01fad

개인키 (Private Key)

이더리움에서 개인키는 32바이트(256비트) 크기의 무작위 정수 하나이다.
블록체인에서 "계정의 소유권"을 증명하는 근본적인 값이다.

특징

  • 범위:
    1 ≤ d < n
    (n은 secp256k1 곡선의 order)
  • 단순한 “숫자”일 뿐, 해시가 아님.
  • 1바이트 = 8비트 → 256비트 = 32바이트 = 64자리 16진수(hex).
  • 예시:
    0x5e9f1a1b3c2d4e5f67890abcdeffedcba9876543210fedcba09876543210abcd

생성 방식

  • 무작위로 32바이트(256비트) 크기의 정수를 선택한다.
  • 보안 난수 생성기를 사용해 충돌 및 예측을 방지한다.

타원곡선 상에서 키 생성의 개념적 과정

개인키와 공개키는 타원곡선(secp256k1) 위에서 수학적으로 연결되어 있다.

개념 단계

1️⃣ 타원곡선 위에는 무수히 많은 점들이 존재한다.
2️⃣ 그중 기준점 G (Generator Point) 를 하나 고정한다.
3️⃣ 내가 무작위 정수 d (개인키) 를 선택한다.
4️⃣ 수학적으로 G를 자기 자신과 d번 더한다 → P = d × G.
5️⃣ 이렇게 계산된 P는 곡선 위의 하나의 점이 되며,
이 점 P가 바로 공개키(Public Key) 이다.


공개키 (Public Key)

개인키로부터 타원곡선의 기준점 G를 스칼라 곱 연산하여 얻은 곡선 위의 점 (x, y).

수식

PublicKey = PrivateKey × G

  • ×는 일반 곱셈이 아니라, 점 덧셈(point addition) 을 반복하는 스칼라 곱(scalar multiplication).
  • G는 secp256k1 표준에서 고정된 Generator Point.

공개키의 구조

구분내용크기설명
x좌표32바이트곡선 위 점의 x값
y좌표32바이트곡선 위 점의 y값
전체64바이트 (x + y)이더리움은 0x04 접두사(비압축 표시)를 제외하고 사용
  • 비압축 공개키 형식:
    0x04 + x(32B) + y(32B) → 총 65바이트
  • 이더리움 내부에서는 0x04를 제외한 64바이트(128자리 hex) 사용.

주소 (Address)

공개키에서 파생된 식별자(20바이트) 로,
이더리움 계정의 실제 식별자로 사용된다.

생성 과정

  1. 공개키(64B)를 Keccak256 해시한다. (32B)
  2. 해시 결과의 마지막 20바이트(40 hex) 를 추출한다.
  3. 앞에 "0x" 접두사를 붙인다.

결과적으로 20바이트(40자리 hex)의 주소가 생성된다.

전체 흐름 요약

무작위 정수(32B)
   ↓ (Private Key)
P = d × G
   ↓ (Public Key)
Keccak256(P)
   ↓
마지막 20바이트
   ↓ (Address)
0x + 40 hex chars

한 줄 요약

  • 개인키는 32바이트짜리 무작위 정수이다.
  • 공개키는 개인키로부터 곡선 연산(P = d×G)으로 얻은 점(x, y) 이다.
  • 주소는 공개키의 Keccak256 해시 결과 중 마지막 20바이트를 16진수로 표현한 값이다.
  • 모든 값은 사람이 보기 쉽게 16진수(hex) 로 표현하며, 0x 접두사를 붙인다.

트랜잭션(Transaction)

트랜잭션은 이더리움 네트워크의 상태를 변경하는 명령서이다.
예를 들어 “이 주소에서 저 주소로 1 ETH를 보낸다” 또는 “컨트랙트를 실행한다” 같은 요청을 의미한다.

1. 구조

트랜잭션은 다음 필드들로 구성된다(타입에 따라 일부 상이).

필드설명
nonce송신자 계정의 트랜잭션 순번(0부터 시작, 1씩 증가). 재생 공격/중복 방지.
to수신자 주소. 비어 있으면 컨트랙트 생성.
value전송 금액(wei).
gasLimit이 트랜잭션이 사용 가능한 가스 상한.
gasPrice / maxPriorityFeePerGas / maxFeePerGas수수료 관련 필드. Legacy는 gasPrice, EIP-1559는 두 필드 사용.
data컨트랙트 호출 데이터(ABI 인코딩) 또는 배포 코드(bytecode).
chainId체인 구분(리플레이 공격 방지).
v, r, s개인키로 생성한 ECDSA 서명 값. 검증·발신자 복구에 사용.
accessList(EIP-2930/1559) 미리 접근할 주소/스토리지 키 목록. 없으면 빈 리스트.

2. 생성 과정

트랜잭션은 다음 단계로 생성된다.

  1. 트랜잭션 데이터 구성

    • nonce, to, value, gas, data, chainId 등 기본 필드를 준비한다.
    • 예:
      nonce: 1
      to: 0xABC...
      value: 1 ETH
      gasLimit: 21000
      gasPrice: 30 gwei
      data: 0x
  2. 직렬화 (RLP 인코딩)

    • 위 데이터를 RLP 규칙에 따라 바이트 배열(byte array) 로 변환한다.
    • 이 바이트 배열은 사람이 보기 쉽게 16진수(HEX) 로 표현된다.
    • 이 과정을 “직렬화(serialization)”라고 한다.
      [nonce, gasPrice, gasLimit, to, value, data, chainId, 0, 0]
      → RLP 인코딩 → 0xf86c01850...
  3. 해시화 (Hashing)

    • 직렬화된 바이트 전체를 Keccak-256 해시 함수로 해시한다.
    • 결과는 32바이트(256비트) 고정 길이 값이다.
    • 이 값이 서명 대상인 messageHash 가 된다.
      messageHash = keccak256(serializedPayload)
  4. 서명 (Signing)

    • messageHash개인키(private key) 로 연산한다.
    • 이 연산을 “서명(Signature)”이라고 한다.
    • 서명 결과로 3개의 값이 생성된다:
      • r: 서명 점의 x좌표
      • s: 개인키와 해시로 계산된 결과값
      • v: 복구 파라미터 (공개키 복원용, 27 또는 28)
  5. 서명 값 추가

    • 생성된 r, s, v를 원래 트랜잭션 데이터에 추가한다.
    • 즉, 원래의 트랜잭션 페이로드 뒤에 (v, r, s)를 붙인다.
      [nonce, gasPrice, gasLimit, to, value, data, v, r, s]
  6. 최종 직렬화 및 전송

    • (v, r, s)가 포함된 완성된 트랜잭션을 다시 RLP 인코딩한다.
    • 최종 바이트 배열(rawTransaction)을 Keccak-256으로 해시하면
      트랜잭션 고유 해시(txHash) 가 된다.
    • eth_sendRawTransaction RPC를 통해 네트워크로 전송한다.

3. 해시 구분

해시 종류시점입력 데이터설명
messageHash서명 전RLP 인코딩된 트랜잭션 페이로드개인키로 서명할 대상
txHash서명 후v, r, s가 포함된 최종 트랜잭션블록체인에서 식별에 사용

4. 요약

  1. 트랜잭션 데이터를 RLP 규칙에 따라 바이트 배열로 직렬화한다.
  2. 직렬화된 데이터를 Keccak-256으로 해시화한다.
  3. 해시값에 대해 개인키로 서명 연산을 수행한다.
  4. 서명 결과(r, s, v) 를 추출한다.
  5. 이 3개 값을 기존 트랜잭션 데이터에 추가한다.
  6. 완성된 트랜잭션을 다시 인코딩하여 네트워크로 전송한다.

5. 한 줄 정리

트랜잭션은 RLP로 직렬화된 바이트 데이터
해시화 → 개인키로 서명 → (v, r, s) 추가 → 전송 하는 과정을 통해 완성된다.


니모닉 (Mnemonic)

니모닉은 무작위로 생성된 엔트로피(entropy)
사람이 외우기 쉬운 단어 조합(12~24개) 으로 인코딩한 것이다.
지갑 복구용 단어 목록이며, 직접적으로는 개인키가 아니라
시드(seed) 를 생성하기 위한 입력값이다.

1. 개념

  • 목적: 사람이 기억하기 힘든 16진수 숫자(엔트로피)를 단어로 표현
  • 표준: BIP-39 (Bitcoin Improvement Proposal 39)
  • 구성: 엔트로피 + 체크섬 → 11비트 단위로 쪼개어 2048단어 사전에 매핑
  • 결과: 12, 15, 18, 21, 24 단어 중 하나
엔트로피(bit)체크섬(bit)전체(bit)단어 개수
128413212
160516515
192619818
224723121
256826424

2. 생성 과정

무작위 숫자 뽑음 (128~256비트 엔트로피, 16진수로 표현)
→ SHA-256으로 해시화함 (256비트 출력)
→ 해시의 앞 n/32비트(예: 128비트면 4비트) 떼어옴 (체크섬)
→ 떼어온 비트를 2진수로 바꿔 엔트로피 뒤에 붙임
→ 전체 비트를 11비트씩 나눔
→ 각 11비트를 10진수로 바꿔 단어사전(2048개) 인덱스에 매핑
→ 12~24개의 단어(니모닉) 완성
→ (옵션) 패스프레이즈 추가 (“mnemonic” + passphrase)
→ PBKDF2-HMAC-SHA512를 2048회 반복
→ 64바이트 시드(seed) 생성
→ HMAC-SHA512(key="Bitcoin seed", data=seed)
→ 왼쪽 32바이트 = 마스터 개인키 (m)
→ 오른쪽 32바이트 = 체인코드 (c)
→ (m, c)를 이용해 HMAC-SHA512 반복 (BIP-32 파생)
→ 자식 개인키 = (I_L + parent_priv) mod n
→ 자식 체인코드 = I_R
→ 개인키 × 타원곡선 기준점(G) → 공개키
→ 공개키 해시(keccak256 등) → 주소

3. 주요 개념 요약

개념설명
엔트로피 (Entropy)무작위 바이트 배열. 니모닉의 근원 데이터.
체크섬 (Checksum)엔트로피의 SHA-256 해시 앞부분을 붙여 오류 검출 기능 제공.
니모닉 (Mnemonic)엔트로피+체크섬을 11비트 단어 인덱스로 표현한 단어 목록.
패스프레이즈 (Passphrase)추가적인 2차 비밀번호. 동일 니모닉이라도 패스프레이즈가 다르면 완전히 다른 지갑 생성.
시드 (Seed)니모닉 + 패스프레이즈를 PBKDF2-HMAC-SHA512로 2048회 반복해 얻은 64바이트 값.
마스터 개인키 (Master Private Key)시드에서 파생된 첫 번째 비밀키.
체인코드 (Chain Code)자식 키 파생 시 사용되는 비밀 소금(salt). 키 간 관계를 안전하게 이어줌.
자식 개인키 (Child Private Key)마스터 키로부터 HMAC-SHA512를 통해 결정론적으로 생성된 개별 개인키.

4. 한 줄 요약

니모닉은 “무작위 엔트로피를 단어로 인코딩한 복구 코드”이며,
PBKDF2-HMAC-SHA512(2048회)를 통해 시드(64B) 를 만들고,
HMAC-SHA512로 마스터 개인키(32B)체인코드(32B) 를 생성한 뒤,
이를 반복 파생하여 무한한 개인키·공개키·주소를 만들어낸다.

0개의 댓글