[오늘의 공부] 블록체인

young-gue Park·2023년 12월 28일
0

오늘의 일지

목록 보기
9/11
post-thumbnail

⚡ 블록체인


📌 블록체인이란?

🔷 데이터 분산 처리 기술

  • 블록에 데이터를 담아 체인 형태로 연결하여 수많은 컴퓨터에 동시에 이를 복제해 저장하는 기술
  • 누구라도 임의로 수정할 수 없고, 누구나 변경의 결과를 열람할 수 있는 분산 컴퓨팅 기술 기반의 원장 관리 기술

🔷 작동 원리

  • 다수의 온라인 거래 기록을 묶어 하나의 데이터 블록(block)을 구성
  • 해시(hash) 값을 이용하여 이전 블록과 체인(chain)처럼 연결
  • 정보의 전부 또는 일부를 P2P 방식으로 전 세계 여러 컴퓨터에 복사하여 분산 저장&관리

💡 P2P
Peer to Peer의 줄임말로 중앙 서버를 거치지 않고 클라이언트 컴퓨터끼리 직접 통신하는 방식을 통칭한다. 일반적으로 컴퓨터의 쌍방향 파일 전송 시스템을 가리키지만 P2P라고 해서 꼭 파일 전송에 쓰이는 것은 아니다.

🔷 노드(node)

  • 네트워크에서 연결 포인트 혹은 데이터 전송의 종점, 재분배점을 가리킨다.
  • 블록체인은 개개인의 서버, 즉 참여자를 노드라 칭함.
  • 노드에서 각자 블록을 생성하고 경쟁을 하게 되는데 경쟁을 해서 블록으로 채택되는 단 한명을 마이너(miner)라고 칭한다.

💡 코인에서의 채굴이 바로 이 노드에서 블록체인을 채굴하는 것이다. 비트코인의 블록 하나에는 평균 약 1,800개의 거래 정보가 포함될 수 있으며, 블록 하나의 물리적인 크기는 평균 0.98Mbyte이다.


📌 블록체인의 구조

🔷 블록 해시(Hash of the block)

  • 블록의 식별자 역할
  • 블록 헤더 정보를 입력 값으로 SHA256 해시 함수를 적용해서 계산되는 값
  • 32바이트의 숫자 값으로, 블록 전체를 해시한 값이 아니라 블록 헤더를 해시한 값이다.

🔷 블록 헤더(Header)

1. Version

  • 소프트웨어 버전

2. Previous block hash

  • 블록 체인에서 바로 앞에 위치하는 블록의 블록 해쉬, 앞블록이 없어 previous hash 값이 0인 블록을 genesis block이라고 한다.

3. Merkle tree root

  • Merkle hash라고도 부른다.
  • 개별 거래 정보의 거래 해쉬를 2진 트리 형태로 구성할 때, 트리 루트에 위치하는 해쉬값을 의미한다.
  • 두 개씩 거래를 묶어서 해쉬값을 구하고 또 그렇게 묶은 값들을 다시 두 개씩 묶어서 해싱하며 수많은 거래 값들을 트리의 가장 꼭대기에 위치한 하나의 데이터로 만들어주는 데이터 구조를 머클트리(Merkel Tree)라고 하며, 이 트리의 가장 꼭대기가 Merkle tree root이다.

4. Timestamp

  • 블록이 생성된 시간을 의미한다.

5. Difficulty

  • 작업난이도
  • 채굴의 과정 속에 쓰이는 개념
  • 채굴을 위해서는 어떤 특정값보다 블록해시가 작게 나오게 하는 nonce값을 구해야하는데 그 특정값이 작업난이도에 따라 결정된다.

6. Nonce

  • 해시값을 계산하기 위한 임의값
  • 블록헤더의 구성요소 중 5가지는 값이 고정되어 변경할 수 없고 오직 nonce만 값을 바꿀 수 있다.
  • nonce값을 계속 바꿔가면서 블록해시를 계산해서 어떤 특정값보다 작은 해시값을 구해야한다.
  • 그래서 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼때까지의 1씩 증가시키는 임의 값이 Nonce이다.

🔷 Transaction Counter

  • 말 그대로 트랜잭션(거래) 카운터로, Body 내의 트랜잭션 개수를 센다.

🔷 Body

  • 마이너들에게 참이라고 증명받은 거래정보(Transaction)들이 10분동안 모인 것들, 거래 내역.

🔷 블록 체인 구성


📌 블록체인 실습

🌟 geth (Go-ethereum) 를 사용하여 제네시스 블록을 JSON 파일로 만들어 이더리움 사설 테스트 네트워크 노드를 구축해 보자.

🔷 사설 네트워크를 구축하기 위해서 제네시스 블록 파일과 블록 데이터 폴더가 필요하다.

💻 Genesis.json

{
    "config": {
        "chainId": 921,
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "0x10",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "gasLimit": "9999999",
    "alloc": {},
    "extraData": "",
    "nonce": "0xdeadbeefdeadbeef",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp": "0x00"
}
  • 제네시스 블록: 가장 먼저 생성되는 블록
  • geth(Go-ethereum): 이더리움 오픈소스

🔷 제네시스 블록 파일을 Geth를 다운로드 받은 경로에 넣고 cmd창을 연다.

🔷 블록체인 저장 경로를 따로 만들어준다.

mkdir c:\test_blockchain

🔷 블록체인 저장 경로 안에 제네시스 블록 파일을 넣고 명령어를 실행한다.

geth --datadir c:\test_blockchain\ init c:\test_blockchain\Genesis.json

🔷 지정한 폴더 내에 다음과 같은 폴더가 생긴다.

  • geth: 모든 체인에 대한 데이터가 저장된다.
  • keystore: 계정들에 대한 정보를 관리한다.

🔷 계정을 새로 생성하고 비밀번호를 새로 입력해준다. 비밀번호를 두번 동일하게 입력한다.

geth account new --datadir c:\test_blockchain

🔷 명령어를 활용하여 생성된 계정 정보를 볼 수 있다.

geth account list --datadir c:\test_blockchain
profile
Hodie mihi, Cras tibi

0개의 댓글