카테고리 없음

Blckchain

tp134679 2025. 4. 14. 15:00

<목차>

1. Blockchain 

1-2 Blockchain 의 블럭

2. hash,previousHash 

3. merkRoot 

 

 

1. Blockchain 

Blockchain 이란

‘블록체인(Block Chain)’은 블록에 데이터를 담아 체인 형태로 연결한 뒤, 수많은 컴퓨터에 이를 동시에 복제•저장하는 분산형 데이터 저장기술입니다.

거래 데이터가 담긴 ‘블록’들이 사슬 구조로 연결되어 있는 공공 거래 장부라고 표현!


블록체인 기술과 비트코인은 ‘사토시 나카모토’라는 개발자에 의해 세상에 알려졌는데.

블록체인 기술의 등장은 전세계 가상화폐 시장에 새로운 바람을 불러 일으키게 됩니다. 은행 같은 중앙 기관의 개입 없이도 안전하게 개인간 거래가 가능했기 때문이죠. => 탈 중앙화

 

이는 블록체인이 데이터를 하나의 중앙 컴퓨터에만 저장하는 것이 아니라 무수히 많은 컴퓨터에 동일하게 저장하는 방식이었기에 가능했습니다. 블록체인으로 저장된 화폐를 훔치기 위해서는 짧은 시간에 연결돼 있는 수많은 사용자에 접근해야 하는구조라 해킹이 거의 불가능합니다.

 

 

 

 

1-2 Blockchain 의 블럭

 

블록체인은 문자 그대로 블록들이 체인으로 연결되있는 형태를 나타내는데  체인형태라고 나타낼 수 있는이유가

블럭마다 들어가는 데이터에 그전 과 그이후 상태를 나타낼 수 있는 데이터를 담아놓기에

변조 할 수없는 블록과 블록이 연결된 체인 형태를 띄게 됩니다.

예를 들어 

블럭 1, 2 ,3 이 있고

B라는 데이터를 가진 새로운 블럭2을 생성 했을때  이 블럭안에 들어가는 데이터는 B 뿐만 아니라 그전에 가지고 있는  블럭1의 데이터와 정보를  암호화한 값도 같이 저장되게 됩니다.  이런식으로 블럭마다 그전 블럭이 어떤블럭인지 상태를 가지고 있기에 연결되있는 구조를 나타냅니다.

 

 

블록의 속성 

 

 

번호            필드명                                              설명

1 data 블록에 포함된 거래 정보
2 timestamp 블록이 생성된 시간
3 version 블록의 버전 정보
4 previousHash 이전 블록의 해시값
5 merkleRoot 모든 거래 내역의 요약 해시
6 nonce 작업 증명(PoW)에서 찾는 숫자
7 difficulty 블록 채굴 난이도
8 hash 현재 블록의 고유 해시값
9 height 블록 번호
10 blockSize 블록의 크기 (바이트 단위)

 

 

 

 

 

data (거래 데이터)

 

블록 안에 저장되는 실제 거래 내역누가 누구에게 얼마를 보냈는지 기록됨

예시:

A → B 1 BTC 전송

 

C → D 0.5 BTC 전송

 

여러 개의 거래 내역을 묶어서 블록에 포함개별 거래 데이터는 merkleRoot를 통해 요약

 

timestamp (타임스탬프)

 

이 블록이 생성된 시간 (UTC 기준)블록체인의 시간 순서를 유지하는 데 필수적

 

예시:

2025-04-03 14:30:15 UTC

 

블록이 조작되지 않았음을 증명하는 역할

 

version (버전 정보)

 

블록의 형식을 정의하는 프로토콜 버전비트코인의 경우, 소프트웨어 업데이트 시 버전이 변경됨

 

예시:

 

1 → 초창기 버전  2, 3, 4... → 새로운 기능 추가

 

소프트포크(부분 호환)나 하드포크(완전 변경)가 발생할 때 중요

 

 

previousHash (이전 블록 해시)

이 블록이 연결될 이전 블록의 해시값 블록체인이 체인처럼 연결되는 핵심 요소

 

예시:

 

현재 블록: #100 previousHash = #99 블록의 해시 이 값이 변조되면 블록체인이 깨짐 → 보안 강화

 

merkleRoot (머클 루트)

블록 안의 거래 내역을 빠르게 검증하기 위한 요약 해시트랜잭션들을 해시로 변환 후, 머클 트리 방식으로 압축

 

예시:

 

거래1 (Tx1) → 해시1 (H1)

거래2 (Tx2) → 해시2 (H2)

거래3 (Tx3) → 해시3 (H3)

거래4 (Tx4) → 해시4 (H4)

 

→ H1 + H2 → H12→ H3 + H4 → H34→ H12 + H34 → Merkle Root (최종 해시)

이를 통해 거래 내역이 변조되었는지 빠르게 확인 가능

 

nonce (논스)

작업 증명(Proof of Work)에서 정답을 찾기 위해 변경하는 숫자 채굴 과정에서 계속 바뀌면서 해시값을 찾음

 

예시:

 

makefile nonce = 123456

SHA256("이전 해시 + data + nonce") = 0000abcd... 목표값을 맞출 때까지 nonce를 증가시키면서 계산

 

difficulty (난이도)

 

채굴 난이도를 나타내는 값 2주(2016 블록)마다 자동 조정됨

 

예시:

 

difficulty = 2000000000000 (비트코인 기준) 블록 생성 시간이 평균 10분 유지되도록 난이도를 조절함

 

hash (블록 해시)

이 블록을 대표하는 고유한 해시값 블록의 모든 정보를 해싱한 값

 

예시:

 

SHA256(이전 해시 + data + nonce + ... ) = 0000abcd1234...이 값이 변조되면 블록체인 전체가 깨짐

 

height (블록 번호)

해당 블록이 몇 번째 블록인지 나타내는 값 제네시스 블록(최초 블록)은 height = 0

 

 

height = 782,351 (현재 블록 번호)체인의 길이를 확인하는 기준

 

 

 

2. hash,previousHash 

hash 는 블록체인의 핵심 개념으로 해당블록안에 들어간 모든 정보를 해싱한 값입니다. 

블록체인에서는 이블록의 내용이 변조되었는지 빠르게 확인하기 위하여 이 hash값을 비교하는것으로 검증을 진행합니다. 

hash는 SHA-256 을 사용하여 고정된 길이의 16진수 문자열로 변환하여 사용합니다. 

 

SHA-256

SHA-256은 Secure Hash Algorithm 256-bit의 약자로,
미국 국립표준기술연구소(NIST)에서 만든 암호학적 해시 함수입니다.

이 알고리즘은 임의의 입력 데이터를 256비트(32바이트) 길이의 고정된 값으로 변환합니다.
비트코인 블록체인에서도 거래의 무결성을 유지하기 위해서 사용됩니다!

 

1. 고정된 길이 출력

어떤 크기의 입력이든 항상 256비트(64자리 16진수) 해시값을 생성합니다.

 

2. 단방향 함수 

해시값은 원래 데이터로 되돌릴 수 없게 만들어집니다. 

암호화 와는 달리 복호화가 불가능!

1. 순방향 계산은 쉽다
   예: `f(x) = x² mod N` → 계산 가능

또는: `f(x) = x × G` (타원곡선 곱셈) → 계산 가능

2. 역방향 계산은 실질적으로 불가능하다
   `f(x) = y`인데, y를 가지고 **x를 찾는 건 불가능**

해를 찾으려면 **가능한 x를 전부 다 넣어야 구할 수 있기에 사실상 불가능.

 

3. 출동 저항성

 

SHA256 은 값이 조금만 바뀌어도 완전히 다른 헤쉬 값을 주기 떄문에 같은 해시값을 가질 확률이 극히 낮습니다.

 

Hello world = 64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c

Hello world! = c0535e4be2b79ffd93291305436bf889314e4a3faec05ecffcbb7df31ad9e51a

Hello world. = aa3ec16e6acc809d8b2818662276256abfd2f1b441cb51574933f3d4bd115d11

 

값이 조금만 변해도 값이 완전히 달라지기 때문에 충돌이 거의 불가능!

 

4. 빠른 연산 속도

연산이 빠르고 비교적 적은 리소스로도 실행이 가능합니다.

 

 

SHA-256 사용법

js crypto 모듈로 SHA-256 을 사용할 수 있습니다.

const crypto = require("crypto");

 

const createHash = (data) => {
  const hash = crypto.createHash("sha256").update(data).digest("hex");
  console.log(hash);
  return hash;
- `crypto.createHash("sha256")` : SHA-256 알고리즘 사용
- `.update(data)` : 입력 데이터를 추가
- `.digest("hex")` : 결과를 16진수 문자열로 변환

 

 

previousHash 

previousHash 은

현재 블록이 연결될 이전 블록의 해시값 블록체인이 체인처럼 연결되는 핵심 요소로서 이전블록의 해시값과 현재 블록의

previousHash 를 비교하여 해시값을  비교하여 신뢰성과 무결성을 보장합니다.

const createHash = (data) => {
    // hex => 16진수
    const hash = crypto.createHash("SHA256").update(data).digest("hex");
    return hash
}

 

const createBlock = (height, timestamp, data, previousHash) => {
    const block = {
        height,
        timestamp,
        data,
        previousHash
    }
    const blockString = `${block.height}${block.timestamp}${block.data}${previousHash}`
    block.hash = createHash(blockString);
    return block
}
const block = createBlock(0, Date.now(), "나 하버드 생임!", "0".repeat(64));
const block2 = createBlock(1, Date.now(), "나도 하버드생임", block.hash);
const block3 = createBlock(2, Date.now(), "나는 세 번째 하버드 생임!", block2.hash)

console.log(block);
console.log(block2);
console.log(block3);

 

log

{
    height: 0,
    timestamp: 1743676783934,
    data: '나 하버드 생임!',
    previousHash: '0000000000000000000000000000000000000000000000000000000000000000',
    hash: 'e595835973e0eef3aa28caf953fe3bbe89a73918c8b53e1ca2e8523f77922782'
  }
  {
    height: 1,
    timestamp: 1743676783934,
    data: '나도 하버드생임',
    previousHash: 'e595835973e0eef3aa28caf953fe3bbe89a73918c8b53e1ca2e8523f77922782',
    hash: 'a3854cb37fe41888b76dbc2f1a7f18e74587e412d75387b8ebe86faa5366dee6'
  }
  {
    height: 2,
    timestamp: 1743676783934,
    data: '나는 세 번째 하버드 생임!',
    previousHash: 'a3854cb37fe41888b76dbc2f1a7f18e74587e412d75387b8ebe86faa5366dee6',
    hash: 'd0372ec1219cc7ec7b6f903b675f507edb1e76697e938c50ead4d3e497409c42'
  }

 

hash 와 다음블럭의 previousHash 를 비교하면 이어지는것을 볼 수 있다.

 

 

3. merkRoot 

블록 안의 거래 내역을 빠르게 검증하기 위한 요약 해시트랜잭션들을 해시로 변환 후, 머클 트리 방식으로 압축해줍니다.

 

블록체인 안의 데이터를 hash 할때 데이터 뿐만아니라 블록에 들어가는 타입 시간 등 모든것을 hash 하기 떄문에 불필요한 정보들이 같이 hash 되기 때문에 데이터만 따로 비교하기 위하여 merkroot 가 나왔습니다.

 

merkRoot 사용

 

merkle 라이브 설치

npm install merkle

 

머클 트리를 쉽게 만들 수 있도록 도와주는 패키지

sync(data) 메서드를 사용하면 트리를 자동으로 구성해줍니다

내부적으로 각 데이터를 SHA-256 해시로 바꾸고, 트리를 구성해서 루트 값을 계산해줍니다.

 

 

임의의 데이터

const txData = ["A", "B", "C", "D", "E"];

 

 

 

1. 각각의 데이터를 해시화

const merkleTree = merkle("sha256").sync(txData);

 

A H1
B H2
C H3
D H4
E H5

 

2. 짝지어서 해시값을 다시 해시

H12 = 해시(H1 + H2)
H34 = 해시(H3 + H4)
H5는 짝이 없으므로 H5 + H5 해시(H5 + H5)
**홀수 개일 경우** → 마지막 값을 **자기 자신과 다시 묶음**

 

3. 위 결과들을 다시 짝지어서 다시 해시

 

H1234 = 해시(H12 + H34)
H55 = 해시(H5 + H5) H5_2

 

4. 루트 해시값 얻기

const Root = merkleTree.root();
console.log(Root);

 

5. 최종 생성된 머클트리 log

 

AE4F3A195A3CBD6A3057C205DEF94520930F03F51F73C5A540D8FDAB05163FEF;

 

 

여기서 데이터 하나면 변경되도

const txData = ["AA", "B", "C", "D", "E"];
F975ABA86C824340CE6840D9C41BA4653B87BE04E97B5D826113DDF51C3B9AE6

 

값이 완전히 달라지기에 머클트리만 비교해서 데이터의 변조를 확인할 수 있게됩니다.  

 

 

머클루트 데이터 해시