[블록체인] 1편 : 블록체인 기본 개념

[블록체인] 1편 : 블록체인 기본 개념

안녕하세요? 정리하는 개발자 워니즈입니다. 최근들어 블록체인의 개념에 푹 빠지게 되어서(?) 그 개념에 대해서 정리를 해보고자 합니다. 사실은 먼저 개념을 알기전에는 코인을 시작하다가… 코인의 베이스 개념인 블록체인의 기술에 대해서 알아보고자 이렇게 정리를 하게 됐습니다.

1. 블록체인 이란 무엇인가요?

  • 기존 거래와 블록체인의 차이점?

블록체인_6

기존 거래 방식은 중간 역할을 해주는 은행이 존재했기 때문에 거래가 진행이 되었습니다. 우측의 블록체인 방식을 뽀게 되면, 각 거래 내역을 여러명이 나눠서 저장을 합니다. 만약 한 네트워크에 10명이 참여하고 있다면 모든 사람에게 A와 B의 거래 내역이 전송, 저장이 됩니다. 나중에 거래 내역을 확인할 때는 블록으로 나눠 저장한 데이터들을 연결해 확인합니다.

  • 블록체인 활용 분야

블록체인은 peer to peer(P2P) 네트워크를 통해서 관리되는 분산 데이터베이스의 한 형태로, 거래 정보를 담은 장부를 중앙 서버 한 곳에 저장하는 것이 아니라 블록체인 네트워크에 연결된 여러 컴퓨터에 저장 및 보관하는 기술로 다양한 분야에 활용이 가능한 기술입니다.

블록체인_2

블록체인은 분산처리와 암호화 기술을 동시에 적용하여 높은 보안성을 확보하는 한편 거래과정의 신속성과 투명성을 특징으로 합니다. 보안성의 강화로 해커의 공격과 데이터의 왜곡 그리고 기존 중앙집중 서버 방식(Central Server)에서 가장 큰 문제인 디도스 공격을 원천적으로 방어할 수 있습니다.

보안성이 높고 위/변조가 어렵다는 특성 때문에 데이터 원본의 무결성 증명이 요구되는 다양한 공공/민간 영역에 적용되고 있으며, 새로운 신뢰사회 구현의 기반 기술로 주목을 받고 있습니다.

분야 기능 및 효과
인증 별도의 공인인증기관 없이 간편하고 안전한 대체 인증수단 제공
결제 및 송금 소액 결제 및 해외 송금서비스의 보안성 제고 및 수수료 비용절감
증권거래 통화, 장외주식, 파생상품 등의 거래에 소요되는 거래시간의 획기적인 단축
스마트계약 조건에 의해 거래가 자동적으로 성립됨에 따라 중간관리자에 의한 사기, 위조 방지
대출, 투자, 무역거래 중개자를 배제한 비대면 P2P 대출 서비스
송장 정보 공유를 통한 송장 사기 방지

2. 블록체인의 원리

블록체인 기술은 거래정보를 기록한 원장 데이터를 중앙 서버가 아닌 네트워크에 참가하는 모든 공동체가 거래를 기록하고 관리하는 P2P거래를 지향하는 탈중앙화를 핵심 개념으로 하는 기술입니다.

블록체인_1

거래 정보는 다음과 같은 흐름으로 이루어집니다.

  • A가 B에게 송금 희망 등의 거래 요청을 합니다.
  • 해당 거래 정보가 담긴 블록이 생성됩니다.
  • 블록이 네트워크상의 모든 참여자에게 전송됩니다.
  • 참여자들은 거래 정보의 유효성을 상호 검증합니다.
  • 참여자 과반수의 데이터와 일치하는 거래내역은 정상 장부로 확인하는 방식으로 검증이 완료된 블록은 이전 블록에 연결되고, 그 사본이 만들어져 각 사용자의 컴퓨터에 분산 저장됩니다.
  • A가 B에게 송금하여 거래가 완료됩니다.

3. 블록체인의 기술적 개념

3-1. 해시 함수

블체인, 암호화폐 기술에 대한 내용에 매번 등장하는 것 중 하나가 해시함수(Hash Function) 입니다. 해시함수의 해시(Hash)는 어떤 데이터를 고정된 길이의 데이터로 변환 하는 것을 의미합니다.

  1. 해시함수의 유용성

    해시수는 원본 데이터에 아주 작은 변화만 있어도 완전히 다른 해시값이 만들어지게 됩니다. 즉 해시 함수를 이용하게 되면, 원본 데이터의 사소한 변화도 쉽게 확인 할 수 있게 됩니다. 해시함수는 단방향 변환이며, 복원이 불가능 하기 때문에 블록체인 기술 및 전자 서명 등 암호화에 사용 될 수 있습니다.

    만약에 서버가 해킹을 당해 사용자 정보가 유출이 되더라도 해시값으로 암호화된 값이 유출이 되면 원본 값을 복원할 수 없기 때문에 피해를 줄일 수 있습니다.

    블록에 서명하고 이전 블록의 해시값을 다음 블록에 기록함으로써 체인 형태의 연결 리스트(linked list)를 형성하게 됩니다.

    블록체인_3

  2. 해시 함수를 사용하는 이유

  • 공개키의 해시값을 지갑 주소로 활용하여 익명화된 거래를 수행
  • 체인으로 연결된 블록의 무결성 검증에 사용 (머클루트)
  • 합의 알고리즘에서 PoW(Proof of Work)방식을 사용할 경우, 해시값을 활용한 채굴문제에 활용

3-2. 머클 트리

거래내역을 확인하기 위해 전체 자료들을 일일이 비교하며 특정 트랜잭션(거래)가 위/변조 되었는지를 확인하는 방식은 너무 비효율적이며, 특정 트랜잭션의 위/변조 여부를 빠르고 효율적으로 조회할 수 있어야 하는데 이에 따라 등장한 방식이 머클트리 방식입니다.

블록체인_4

블록체인의 구성정보

  • 블록의 정체성을 띠는 데이터를 가진 블록헤더
  • 해당 블록에 거래의 개수를 알려주는 거래 카운터
  • 가장 많은 공간을 차지하는 거래목록

3-2. 거래를 묶어주는 머클트리

머클트리는 이진트리(binary trees)라는 이름으로도 알려져 있습니다. 여기서 이진트리는 쉽게 말해서 거래를 두개씩 묶는다는 말입니다. 이렇게 두 개씩 묶어서 올라가게 되면 거래량이 기하급수적으로 늘어나도 특정 거래를 찾는 경로는 단순합니다.

거래의 건수인 N이 증가할 때마다 특정 거래의 경로를 차즌ㄴ 경우의 수는 log2(N)으로 늘어나기 때문입니다.

블록체인_5

특정 거래 데이터를 쉽게 찾을 수 있고, 거래의 위변조도 쉽고 빠르게 알 수 있게 되어 방지를 할 수 있습니다.

블록체인의 용량은 시간이 지날수록 지속적으로 늘어나기 때문에 이제는 성능이 좋은 컴퓨터만 모든 블록체인을 다운받는 풀노드(full node)가 될 수 있습니다. 하지만 이 머클트리의 이진트리 방식은 블록데이터의 일부만 다운받는 라이트 노드(light node)로 우리가 가지고 다니는 모바일로도 쉽고 빠르게 특정 거래를 찾도로 해줍니다.

4. 간단한 블록체인 만들기

  • 초소형 블록 만들기
    해싱을 이용하는 방법을 이해합니다. 먼저 간단하게 hash 하는 함수를 만들어보겠습니다.
public static String getHash(String input) {
  StringBuffer result = new StringBuffer();

  try {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(input.getBytes());
    byte bytes[] = md.digest();
    for(int i=0;i

그리고 nonce에대한 이해를 하기 위해서 다음의 코드를 작성했습니다. nonce란 유일하게 채굴자가 변경이 가능한 값으로써, 블록체인에 블록을 추가하기 위해서 제기된 문제에 대한 해답을 찾기 위해서 매칭되는 해시값을 찾게 해주는 값입니다.

int nonce = 0;
while(true) {
  if(Util.getHash(String.valueOf(nonce)).substring(0, 6).equals("000000")) {
    System.out.println("정답 : " + nonce);
    break;
  }
  nonce++;
}

해시와 nonce를 이해하였으면, 간단한 초소형 블록을 만들어보겠습니다. 블록의 구조를 만들어주기 위해서 object를 다음과 같이 작성합니다.

public class Block {

    private int blockID;
    private int nonce;
    //private String data;
    private ArrayList transactionList;


    //이전 해시값. 
    private String previousBlockHash;

    public String getPreviousBlockHash() {
        return previousBlockHash;
    }
    public void setPreviousBlockHash(String previousBlockHash) {
        this.previousBlockHash = previousBlockHash;
    }
    public int getBlockID() {
        return blockID;
    }
    public void setBlockID(int blockID) {
        this.blockID = blockID;
    }
    public int getNonce() {
        return nonce;
    }
    public void setNonce(int nonce) {
        this.nonce = nonce;
    }

        //트랜잭션 관련 변경 
        public String getTransaction() {
            String transactionInformations = "";

            for(int i=0;i
  • transsaction 만들기

트랜잭션은 블록의 데이터에 쌓이는 데이터 입니다. 이는 한개이상의 값들이 적재 되기 때문에 다음과 같이 arraylist의 형태로 object를 작성합니다.

public class Transaction {

    String sender;
    String receiver;
    double amount;

    public String getSender() {
        return sender;
    }
    public void setSender(String sender) {
        this.sender = sender;
    }
    public String getReceiver() {
        return receiver;
    }
    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }
    public double getAmount() {
        return amount;
    }
    public void setAmount(double amount) {
        this.amount = amount;
    }

    public Transaction(String sender, String receiver, double amount) {
        this.sender = sender;
        this.receiver = receiver;
        this.amount = amount;
    }



    public String getInformation() {
        return "[" + Util.getDate() + "] " + sender + "이(가) " + receiver + "에게 " + amount + "개의 코인을 보냈습니다.";
    }
}
  • 실행

실제 상위에 만들어진 객체들을 활용하여 블록을 생성하고 체인을 연결하는 구조를 살펴봅니다.

public class BlockChainStarter {
    public static void main(String[] args) {
        //Transaction transaction = new Transaction("A", "B", 10.5);

        //System.out.println(transaction.getInformation());


        Block block1 = new Block(1, null, 0, new ArrayList());
        block1.mine();
        block1.showInformation();

        Block block2 = new Block(2, block1.getBlockHash(), 0, new ArrayList());
        block2.addTransaction(new Transaction("A", "B", 1.5));
        block2.addTransaction(new Transaction("C", "B", 0.7));
        block2.mine();
        block2.showInformation();

        Block block3 = new Block(3, block2.getBlockHash(), 0, new ArrayList());
        block3.addTransaction(new Transaction("D", "E", 8.2));
        block3.addTransaction(new Transaction("B", "A", 0.4));
        block3.mine();
        block3.showInformation();

        Block block4 = new Block(4, block3.getBlockHash(), 0, new ArrayList());
        block4.addTransaction(new Transaction("E", "D", 0.1));
        block4.mine();
        block4.showInformation();


    }
}
  • 결과
1번째 블록의 채굴에 성공했습니다.
---------------------------
블록 번호: 1
이전 해시: null
채굴 변수 값: 34201
블록 데이터: 데이터
블록 해시: 000084397e5fff903eb9a48ed02faf69b974137df73914858261c3e0f2de0ae5
---------------------------
2번째 블록의 채굴에 성공했습니다.
---------------------------
블록 번호: 2
이전 해시: 000084397e5fff903eb9a48ed02faf69b974137df73914858261c3e0f2de0ae5
채굴 변수 값: 37413
블록 데이터: 데이터
블록 해시: 00009b25ea57c0a8ba1ace67cb5f05cc7c23321f66599735f5de9065dd89e5fe
---------------------------
3번째 블록의 채굴에 성공했습니다.
---------------------------
블록 번호: 3
이전 해시: 00009b25ea57c0a8ba1ace67cb5f05cc7c23321f66599735f5de9065dd89e5fe
채굴 변수 값: 51963
블록 데이터: 데이터
블록 해시: 000094aec5931e311b7241eb1ad136241ddb1f58f41a47d772640b53dec0cba5
---------------------------
4번째 블록의 채굴에 성공했습니다.
---------------------------
블록 번호: 4
이전 해시: 000094aec5931e311b7241eb1ad136241ddb1f58f41a47d772640b53dec0cba5
채굴 변수 값: 71429
블록 데이터: 데이터
블록 해시: 000008f6b0e91c5129c998eba8cfd6117cd0a30628918f90a8af4514a0e70375
---------------------------

아래 내용은 아직 미비된 부분으로, 추후 포스팅에서 작성하겠습니다.

  • 공개키/암호키 만들기
  • Wallet 만들기

5. 마치며...

이번 스터디를 진행하면서, 블록체인의 간단한 개념과 아키텍처 그리고 소스로 구현을 해보면서 이해를 하게 되었습니다. 실생활에서 어떤 방식으로 사용되는지는 좀더 학습을 진행해야겠다는 생각이 들었고, 가장 기억에 남는 키워드는 역시 보안성, 투명성, 신속성이라는 키워드가 기억에 남습니다. 확실히 유망한 기술이기에 앞으로 계속해서 학습을 해야겠다는 생각도 들었습니다.

6. 참조

자바로 블록체인 만들기
블록체인 이란? 블록체인 개념 이해하기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다