작업증명(Proof-of-Work) 방식의 합의 알고리즘은 비트코인에서 사용되는 합의 알고리즘으로써 어떤 트랜잭션이 발생했을 경우 해당 트랜잭션이 유효한 트랜잭션인지에 대한 합의 방법 및 새로운 블록이 진짜인지, 가짜인지에 대한 검증을 수행합니다. 작업 증명 방식(PoW)을 이해하기 위해서는 우선 마이닝 과정에 대한 개념정리가 필요합니다.

마이닝(채굴)이란?

마이닝(채굴)이란 임의의 nonce 값을 대입하여 블록 해시 결과 값을 생성하고, 생성된 결과 값이 제시된 Target 보다 작은 블록 해시를 찾는 과정입니다 (자세한 내용은 아래에서 설명). 해시함수의 특징때문에 어떤 nonce 값을 대입해야 제시된 Target 보다 작은 블록해시 정보를 찾을 수 있을지는 알 수 없습니다.

즉 올바른 결과 값을 찾기 위해서는 nonce의 값을 0부터 1씩 증가 시키면서 제시된 Target 보다 작은 결과 값이 나올때까지 무한 반복 작업을 수행해야 합니다. 이러한 수학문제를 풀이하는 과정을 1초에 몇번이나 수행할 수 있는지에 대한 수치 정보를 해시파워라고 표현하며, 해시파워가 높은 마이너일수록 더 많은 문제를 풀어낼 수 있으며 더 많은 문제를 풀어낼 수 있는 채굴자가 새로운 블록을 찾을 확률이 더 높습니다. 해시 파워가 높은 채굴자일수록 더 많은 일을 수행했다는 의미이며, 더 많은 일을 할 경우 확률적으로 더 많은 보상을 받게 됩니다. 그렇기 때문에 PoW를 정의할때 더 많은 일을 한 채굴자에게 더 많은 보상이 주어지는 방식이라고 표현합니다.


블록 데이터 해시 연결을 위해 블록에는 블록 헤더 데이터를 해시 함수로 계산한 블록 해시가 들어가고 이를 통해 해시 연결성을 검증해 블록체인 데이터가 중간에 위변조가 되지 않았음을 확인합니다.

작업증명(PoW)은 왜 필요할까?

이러한 작업증명 알고리즘의 필요성은 네트워크의 모든 노드가 동시에 블록을 만들 수 없게 하는 것 입니다. 작업증명을 통과해야만 블록을 생성할 수 있고, 이를 위해서는 엄청난 에너지가 소모됩니다. 그리고 작업증명 알고리즘은 Difiiculty 조절 알고리즘을 이용하여 10분당 1~2개의 블록이 생성된다는 것을 보장합니다.

네트워크의 노드들은 다음 블록을 생성하기 위해 A와 B 중 하나의 블록을 선택하여 블록을 생성합니다. 다음 블록을 생성하는 노드는 A와 B중 하나의 블록에 연결한 블록을 생성합니다. 또 다시 A를 선택한 노드와 B를 선택한 노드가 동시에 블록을 생성할 확률은 굉장히 낮겠죠. 나카모토 사토시는 확률 증명을 통해 블록 6개가 대립되는 블록이 계속 생성될 확률은 0에 가깝다는 것을 보였습니다.

작업증명 합의 알고리즘은 일시적으로 합의가 깨질 수 있으나 확률적으로 마지막엔 하나의 블록체인을 합의하게 되는 합의의 알고리즘 입니다. 작업증명 알고리즘은 기존 합의 알고리즘이 적은 수의 노드와 대다수는 올바른 행동을 한다는 가정(보통 3f+1 이상이 올바른 일을 해야 정상 운영, f는 잘못된 노드의 수)을 통해 작동하는 알고리즘인 것과 달리 글로벌한 규모의 완전히 오픈된 네트워크에서 운영할 수 있는 알고리즘 입니다.

장점

  • 최소 가격대 형성이 확실하게 정해져 있음
  • 강력한 보안성
  • 서비스 남용을 쉽게 방지

단점

  • 채굴난이도가 높아지면서 연산에 필요한 고사양 장비가 많이 필요하고, 과도한 전력소모로 인한 에너지 낭비가 커짐
  • 채굴난이도가 높아지면서 개인 채굴자는 채굴을 할 수 없는 수준까지 옴
  • 지속적으로 해시파워를 유지해야함
  • 채굴하는 업자끼리의 단합 문제

블록 구하는 방법

위에서는 마이닝(채굴)이 뭔지와 작업증명이 왜 필요한지를 설명했습니다. 지금부터는 블록을 어떻게 구할지와 작업증명의 성공 여부를 확인하는 방법을 설명하겠습니다. 

https://www.blockchain.com/에 들어가면 현재 채굴이 된 블록을 조회할 수 있습니다. 아래의 예시는 125552번째 블록을 채굴한다고 가정하여 125552를 검색해 정보를 확인합니다. (https://www.blockchain.com/btc/block/00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d - 125552를 검색한 결과 URL)



위의 주소로 들어가 정보를 살펴보면 타임 스탬프, Bits, 해시 난수, 이전 차단, Merkle Root 정보를 확인할 수 있습니다. 앞서 설명한 블록 해시를 구하는 공식에는 6가지 요소가 필요하나 여기에는 버전 정보가 누락되어 있습니다. 그리고 타임 스탬프 정보 또한 우리가 보기 편한 형식으로 변형되어 있습니다. 실제로 블록해시를 구하기 위해 JSON 형태로 데이터를 획득해야 합니다. (https://blockchain.info/block-height/125552?format=json)

위 URL처럼 정보를 구성하여 요청하면 125552번째 블록 정보를 JSON 형태로 제공받을 수 있습니다. 참고로 위의 URL의 /125552? 이 부분에 숫자 부분이 블록 높이 정보입니다. 다른 블록을 확인하고자 할때는 원하는 블록 높이 값을 입력하여 호출하면 됩니다.


여기서 필요한 값은 ver, prev_block, mrkl_root, time, bits, nonce 입니다. 위 정보로 확인하면 nonce가 2504433986 일 때, 해시함수의 결과값이 00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d으로 작업증명이 성공한 것을 알 수 있습니다.

블록해시 구하는법

아래에서는 파이썬 3.+ 버전으로 작성하여 연습을 해봅니다.

import hashlib
import struct


little_endian = lambda value: struct.pack('<L', value).hex()
reverse_order_pair = lambda value: ''.join([value[i - 2:i] for i in range(len(value), 0, -2)])

# 125552번째 블록 정보
# 아래의 정보로 결과가 00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d 나오면 성공
block_info = {
    'hash': '00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d',
    'ver': 1,
    'prev_block': '00000000000008a3a41b85b8b29ad444def299fee21793cd8b9e567eab02cd81',
    'mrkl_root': '2b12fcf1b09288fcaff797d71e950e71ae42b91e8bdb2304758dfcffc2b620e3',
    'time': 1305998791,
    'bits': 440711666,
    'fee': 1000000,
    'nonce': 2504433986,
    }

convert_block_info = {}

# 1. 버전, 타임, bits, nonce 정보를 리틀 엔디안 형태로 변형.
convert_block_info['ver'] = little_endian(block_info['ver'])
convert_block_info['time'] = little_endian(block_info['time'])
convert_block_info['bits'] = little_endian(block_info['bits'])
convert_block_info['nonce'] = little_endian(block_info['nonce'])

# 2. 이전 블록 해시, 머클루트 결과 값을 모두 반대 순서로 변형
convert_block_info['prev_block'] = reverse_order_pair(block_info['prev_block'])
convert_block_info['mrkl_root'] = reverse_order_pair(block_info['mrkl_root'])

# 3. 블록 헤더 정보를 모두 합산(순서가 꼭 맞아야합니다.)
header_hex = convert_block_info['ver'] + convert_block_info['prev_block'] + convert_block_info['mrkl_root'] + convert_block_info['time'] + convert_block_info['bits'] + convert_block_info['nonce']

# 4. 바이너리 형태로 변형
header_bin = bytes.fromhex(header_hex)

# 5. SHA 256으로 변환한 결과를 다시 SHA 256 으로 변환(2번진행)
hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()

# 6. hash 결과를 뒤집은 다음  16진수로 변경
result_header_hex = hash[::-1].hex()

# result : 00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d
# 성공

위의 코드를 실행하면 현재 블록의 해시 값이 나온 것을 확인할 수 있습니다. 

실제로의 채굴은 nonce를 0부터 1씩 증가시키면서 Target 값과 비교하여 작거나 같을 때까지 반복실행합니다. 

(왜 값을 Little Endian으로 변형하고 16진수 값을 뒤집고 하는지 이유는...)

정리

  1. ver, time, bits, nonce는 Little Endian 형태로 변형
  2. prev_hash, mrkl_root는 결과 값을 모두 반대 순서로 변경 (16진수 이므로 2개씩 묶어서 반대로 변경)
  3. 헤더 정보들을 모두 합산(문자열 값을 이어붙임. 이때 순서가 변경되면 안됨)
  4. 합산한 헤더 정보를 바이너리 형태로 변경
  5. SHA256 형태로 변경한 결과를 다시 SHA256으로 변형
  6. 5번에서 나온 결과를 전부 뒤집은 다음 16진수로 변경

작업증명 성공 여부의 기준은 어떻게?

작업증명의 성공 여부 뿐만 아니라 작업난이도도 bits로 결정이 됩니다. 

작업증명 값 도출 방법

nonce로 작업증명을 성공하기 위해선 bits가 제시하는 숫자와 같거나 적으면 성공입니다. 그런데 bits에서는 지수와 가수를 이용하여 표현되고 있어 조금 복잡합니다. 예를 들어, 수학에서 큰 수나 작은 수를 표현할 때, 0.1234*10^5이나 0.1234*10^(-5)과 같이 표현합니다. 이를 더 친숙하게 표현하자면 처음 예를 든 수는 12,340이고 마지막 수는 0.000001234 입니다. 이때, 0.1234를 가수, 5나 -5를 지수라 표현합니다. 위에서 Little Endian으로 구한 bits는 ffff001d지만 Big Endian으로 바꿔서 1d00ffff로 계산해야합니다. Endian으로 계산한 수는 16진수 이므로 2자리씩 끊어서 이해해야 하므로 1d, 00, ff, ff로 파악해야 합니다. 여기서 bits는 첫 수인 1d를 지수로 보고 00ffff는 가수로 봐야 합니다. 즉, 1d는 진수, 00ffff는 가수로 봅니다. (가수의 경우, 앞에 소수점 0. 이 생략되어 있으므로 0.00ffff 라는 의미입니다.)

여기서 bits가 제시하는 숫자의 계산법은 00.00ffff*256^1d 입니다. 만약 지수가 01이였다면 256^1로 소수점이 우측으로 한칸 움직인 00.ffff가 됩니다. (* 여기서 주의할 점은 16진수이므로 16당 1칸이라 생각하면됩니다.)


다시 위 구하고자 하는 bits로 돌아오면 [00].[00][ff][ff]*256^1d 즉 [00].[00][ff][ff]*256^29 이므로 (1d를 https://ko.calcuworld.com/%EC%88%98%ED%95%99/16%EC%A7%84%EB%B2%95-%EA%B3%84%EC%82%B0%EA%B8%B0/ 에 넣어 10진수로 변환하면 29의 값이 나옵니다.) 우측으로 소수점을 29칸 옮기라는 소리입니다. 다시말해서 [ff][ff] 뒤에 [00]을 26번 작성하면 됩니다. 여기서 끝을 내면 28개로 이루어지기 때문에 도출한 28개의 값 앞에 [00]을 4개 더 붙인 [00][00][00][00][ff][ff][00][00]…[00] (32bytes) - (글자 수로는 64자)가 나오게 됩니다. 

결과적으로 bits가 제시한 숫자는 000000ff0000...00 (32bytes) - (글자 수로는 64자)입니다. nonce를 변경해가며 위 에서 나온 해시결과값이 이 값보다 작거나 같아야 작업증명이 성공하게 됩니다.

작업 난이도

블록 해쉬가 특정 숫자보다 낮게 나올 때의 nonce값을 찾아내는 것이 작업 증명이라고 위에서 설명을 했습니다. 앞에서 블록 해쉬는 32바이트의 숫자라고 했는데, 이를 가지고 설명하려면 너무 복잡하기 때문에 부호가 없는 1바이트로 가정합니다. 그러면 해시함수의 결과값은 0~255 사이의 결과가 나오게 됩니다. 만약 블록해시가 128보다 작아야 된다고 하면 128보다 작은 블록해시 결과값이 나올 확률은 128/256 이므로 50%의 확률입니다.

다시 블록해시 결과값이 64보다 작아야 한다고 하면 64/256이므로 25%의 확률로 nonce를 구할 수 있습니다. 여기서 예시를 든 128, 64라는 값이 bits입니다. 

보상은?

보상은 새로 발행되는 비트코인과 해당 블록에 포함되는 거래의 거래 수수료의 합입니다. 비트코인의 새로운 발행은, 채굴자가 블록을 처음 구성할 때 채굴자의 지갑으로 일정량의 비트코인이 입금되는 거래를 그 블록의 첫 거래(generation transaction)로 추가하는 방식으로 이루어집니다. 새로 발행되는 비트코인은 최초에 50BTC에서 시작해서 블록 체인에 21만개의 블록이 추가될 때마다 절반으로 줄어듭니다. 거래 수수료는 각 거래 당사자끼리 자율적으로 정할 수 있고, 거래가 블록에 추가되는 우선 순위를 결정하는데 거래 수수료가 입력값으로 사용되기도 합니다. 즉 보상은 nonce값을 찾아내고, 그 결과 새로운 블록을 블록 체인에 추가해서, 해당 블록에 포함된 모든 거래를 유효한 거래로 확정시켜준 대가라고 할 수 있습니다.

요약

  • PoW는 비트코인의 합의 알고리즘이 대표 케이스
  • 데이터의 위변조 방지


머클트리란?

머클트리(Merkle Tree) 혹은 '해시트리(Hash Tree)'라는 구조는 Ralph Merkle이라는 사람이 1979년에 만들어 낸 개념입니다. 다른 트리 알고리즘과는 다르게 머클트리의 목적은 빠른 검색이 아니라 데이터의 간편하고 확실한 인증을 위해 사용합니다. 머클트리의 최상위 부모노드(혹은 루트)는 머클루트라 부르며 블록체인의 원소역할을 수행하는 블록에서 저장된 트랜잭션들의 해시트리라 볼 수 있습니다.

머클트리는 데이터의 간편하고 확실한 인증을 위해서 SHA-256 암호화 기술(해시함수)를 사용하고 있습니다. 자세한 내용은 아래 머클트리 그림과 같이 설명하겠습니다.

SHA-256 암호화 (해시함수)란?

SHA-256은 암호화 기술로서 복호화가 되지 않는 단방향 암호화 기술입니다. 암호화된 결과는 16진수로 어떠한 수를 암호화 하더라고 결과의 크기는 64자입니다. 

http://www.convertstring.com/ko/Hash/SHA256 해당 사이트에 들어가 abcd 라는 값을 SHA256 암호화 하면 88D4266FD4E6338D13B845FCF289579D209C897823B9217DA3E161936F031589 라는 값이 나오게 됩니다.


만약 abcd가 아닌 aacd라는 값을 SHA256으로 암호화 하면 전혀 다른 값이 나오게 됩니다. 



이와 같이 입력된 값이 1개라도 다를 경우, 결과는 전혀 유추할 수 없습니다. 또한 입력할 글자의 수에 상관없이 결과의 크기는 64자입니다.

머클트리 구조


위 그림에서는 해시함수 64자를 전부 입력하기 힘들어 길이가 4인 값으로 대체했습니다. (원래는 4자가 아닌 64자입니다.)


블록체인에서는 먼저 각 트랜잭션(이하 TX1, TX2, ..., TXn)들을 SHA-256으로 암호화해 64자의 해시결과를 만들어 냅니다. 다음 각 인접한 노드들을 합한 다음, 다시 SHA-256으로 암호화해 해시결과를 만들어 냅니다. 이러한 과정을 단 1개의 해시가 나올때까지 반복합니다.

한마디로 수많은 거래내용들을 해시함수를 통해 압축하고 인접한 노드끼리 더한다음 다시 압축 과 같은 과정을 반복해 나갑니다. 모든 결과 값은 이전 출력들을 해시함수를 거쳤기 때문에 입력이 하나라도 달라지면 최종결과인 머클루트가 달라지게 됩니다.

이러한 특성으로 블록에서 거래변조가 일어났는지를 확인할 수 있으며, 거래내용이 아무리 길어도 해시함수를 거친 결과는 64자이므로 블록의 용량을 획기적으로 줄일 수 있게 됩니다.

머클트리를 사용한 검증법

지금부터 비트코인을 예를 들어 검증하는 방법을 설명하겠습니다. 머클트리 검증에 앞서 풀 노드와 라이트 노드라는 개념이 나오는데 풀노드는 제네시스 블록부터 지금까지의 블록 즉, 블록체인 전체를 가지고 유지하는 노드입니다. 라이트 노드는 블록체인 전체가 아닌 몇몇 블록만 가지고 있으며 풀노드에게서 필요한 정보를 받아서 유지하는 노드입니다.

만약 아래의 그림과 같이 라이트 노드에서 가장 마지막 값인 1e3a 해시값과 머클루트인 af3d 해시값만 가지고 있다고 가정하고 1e3a라는 거래내역이 진짜인지 확인을 어떻게 할까요?



방법은 풀노드로 부터 검은 네모박스인 43bc, 143c, 89fe의 정보를 받아 해시 함수에 차례대로 넣어 계산을 진행합니다. 아래의 그림과 같이 검은 네모박스를 알게되면 인접한 노드끼리 더한 뒤 해쉬를 통해 상대값을 알게되어 머클트리를 진행해 나갈 수 있게 됩니다. 이와 같은 경로를 머클경로라 합니다.

만약 검은 네모박스가 아닌 파란 네모박스를 알게 된다면 해시경로를 진행해 나갈 수 없어 머클루트가 진짜인지 알 수 없게 됩니다. 이러한 과정을 통해 도출된 결과가 머클루트인 af3d의 값과 동일하지 않다면 1e3a 해시값은 거짓거래로 판명이 납니다.



요약

  • 머클트리는 SHA-256 암호화 (해시함수)를 사용
  • 머클트리를 이용하면 빠르게 데이터 검증을 할 수 있고 트리 저장 용량도 줄일 수 있음
  • 머클트리는 라이트 노드에서 거래를 검증하기 위해 사용됨


블록체인(Blockchain)

블록체인은 최초의 블록(Genesis Block)부터 시작해서 바로 앞의 블록에 대한 링크를 가지고 있는 링크드 리스트인 자료구조입니다. 다시말해 블록과 블록을 체인으로 이어준 형태입니다. 블록체인에서 사용되는 블록은 일정 시간마다 생성이 됩니다. (비트코인의 경우 10분에 한 번씩 생성)

즉 여러 건의 거래내역을 하나의 블록으로 묶어 기존에 생성된 블록에 체인처럼 계속적으로 연결한 구조를 의미합니다. 블록의 집합체인 블록체인은 여러 노드에 걸쳐 분산되어 저장 및 관리되며 모든 거래 정보를 포함하는 거대한 분산 장부 또는 공통장부(원장: Ledger)관리 기술이라 할 수 있습니다.

블록(Block)

블록이란 블록체인의 원소 개념으로 다수의 거래정보의 묶음을 의미합니다. 블록은 Height라고 불리고 있습니다. 블록체인을 길게 이어진 수평선으로 보는 것이 아니라 한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height라는 말을 쓴다고 합니다. 하지만 이 Height는 정확한 블록의 이름이 아닙니다. 블록의 정확한 이름은 TXID라 불리는 블록의 해시값입니다. 이 블록의 해시값은 블록의 헤더 정보를 모두 합산한 후 SHA256으로 변환된 값입니다.

블록 구성요소

블록은 블록 헤더와 거래 정보, 기타 정보로 구성됩니다. 여기서 거래 정보와 기타 정보는 블록 바디라 볼 수 있습니다. 거래 정보는 입출금과 관련한 여러가지 정보를 가지고 있고 기타 정보는 블록 내에 있는 정보 중에서 블록 헤더와 거래 정보에 해당하지 않는 정보를 말하며, 블록 해쉬 계산에 사용되지 않습니다.

블록 구조

블록해시 (Block Hash)

블록 해시는 블록의 식별자 역할을 합니다. 블록 해시는 블록의 헤더 정보인 버전, 이전 블록 해시, 머클 루트, 타임, bits, 논스 정보를 모두 더한 후 SHA256으로 2번 변환한 결과 값입니다. 블록해시여서 블록 전체의 해시값으로 생각될 수 있지만, 블록 헤더를 해시한 값입니다.

블록 헤더 (block header)

블록 헤더는 versionpreviousblockhashmerklehashtimebitsnonce 6개의 정보로 구성되어 있습니다.

  • version: 소프트웨어/프로토콜 버전

  • previousblockhash: 블록 체인에서 바로 앞에 위치하는 블록의 블록 해쉬

  • merklehash: 개별 거래 정보의 거래 해쉬를 2진 트리 형태로 구성할 때, 트리 루트에 위치하는 해쉬값

  • time: 블록이 생성된 시간

  • bits: 난이도 조절용 수치

  • nonce: 최초 0에서 시작하여 조건을 만족하는 해쉬값을 찾아낼때까지의 1씩 증가하는 계산 회수

버전 (version)

해당 블록의 버전입니다. 현재 이 블록 헤더를 만든 비트코인 프로그램의 버전 정보입니다.

이전블록해시 (previousblockhash)

이전 블록 해시 정보는 이전 블록의 주소 값을 가리키는 요소입니다. 각 블록의 헤더 정보에는 이전 블록의 해시값을 갖고 있기 때문에 아래의 그림과 같이 블록끼리 연결될 수 있습니다.


머클해시 (merkle root)

머클해시는 블록의 바디 부분에 저장된 트랜잭션(거래 정보)들의 해시 트리입니다. 각 트랜잭션과 가까운 노드끼리 쌍을 지어 해시 값을 구하고 최종적으로 구해진 해시 값이 머클해시 값입니다. 머클해시 값을 통해 단일 블록 내에 존재하는 트랜잭션의 무결성을 검증할 수 있으며 머클해시 값을 이용하여 블록의 해시 값을 생성하였기 때문에 블록해시의 무결성도 함께 검증할 수 있습니다. 쉽게 말해 해당 블록이 유효한지에 대한 무결성을 검증하기 위한 요소가 머클해시입니다.

아래의 그림은 머클해시와 블록해시를 구하는 과정을 나타낸 그림입니다.


완료된 거래정보의 변경이 사실상 불가능한 이유

거래 정보의 해시값은 해당 거래가 포함된 블록의 머클해시 계산에 입력값으로 사용되고, 머클해시는 블록 해쉬의 계산에 입력값으로 사용됩니다. 블록 해시는 다음 블록(A라 하면)의 previousblockhash 값으로 저장되며, previousblockhash은 A 블록의 블록 헤더 정보로서, A 블록의 블록 해쉬를 계산하는데 입력값으로 사용됩니다. 따라서, 거래 정보가 변경되면 merklehash가 변경되고, merklehash가 변경되면 블록 해쉬가 변경되고, 블록 해쉬의 변경은 다음 블록의 블록 해쉬 변경으로 연쇄적으로 이어지게 됩니다. 그리고 블록 해쉬는 작업 증명(PoW)의 해답(nonce값)을 찾아내야 구할 수 있으므로, 거래 정보를 변경한 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 합니다.

예를 들어, 블록 하나를 채굴하는데 평균 10분이 소요되고,  현재 총 블록 수가 약 40만 블록이라고 할때, 최초의 원조 블록인 Genesis 블록에 포함된 거래를 변경하면 약 400만 분, 약 7.6년의 시간이 소요됩니다. 만약 거래를 변경한다 해도 새로운 블록들이 평균 10분 마다 하나 씩 계속 생성되므로 예상 소요시간은 계속적으로 늘어나기 때문에 이를 모두 뒤집는 것은 사실 상 불가능합니다. 즉, 완료된 거래 정보를 변경하려면, 변경하려는 거래 정보가 포함된 블록부터 그 이후의 모든 블록을 순서대로 다시 채굴해야 하는데, 이는 많은 시간이 소요되고, 그 동안 다른 노드들에 의해 블록이 계속 추가되므로, 완료된 거래 정보의 변경은 현실적으로 사실상 불가능합니다.

타임 (time)

해당 블록의 대략적인 생성시간을 의미합니다. 타임 스탬프는 유닉스 기준일 자로 표시되며 1970년 1월 1일 자정부터 경과한 시간을 초 단위로 계산한 값입니다.

bits

bits는 난이도 해시 목표 값을 의미하는 지표입니다.

nonce

블록을 만드는 과정에서 해시 값을 구할 때 필요한 재료 역할을 수행합니다. 

요약

  • 블록체인은 블록과 블록을 연결한 구조
  • 블록체인에서 블록은 여러 건의 거래내역을 가지고 있음
  • 블록의 구성요소는 헤더와 바디로 나뉘어져 있음


블록체인의 종류

블록체인은 크게 퍼블릭 블록체인, 프라이빗 블록체인, 컨소시움 블록체인 3가지로 분류할 수 있습니다.

  • 퍼블릭 블록체인(Public Blockchain): 비트코인, 이더리움과 같이 누구나 네트워크에 참여할 수 있는 블록체인
  • 프라이빗 블록체인(Private Blockchain): 하나의 기관에서 독자적으로 사용하는 블록체인
  • 컨소시움 블록체인(Consortium Blockchain): 여러 기관들이 컨소시움을 이뤄 구성하고 허가된 기관만 네트워크에 참여할 수 있는 블록체인.


현재 활발하게 거래되는 대다수의 블록체인은 퍼블릭 블록체인으로 블록체인 네트워크에 참여할 수 있고 트랜잭션 내역을 검증할 수 있습니다.

퍼블릭 블록체인 VS 프라이빗(컨소시움) 블록체인


퍼블릭 블록체인프라이빗(컨소시움) 블록체인
읽기 권한누구나허가된 기관
거래 검증 및 승인네트워크에 참여하면 거래 검증 및 승인승인된 기관 및 감독기관
트랜잭션 생성자누구나법적 책임을 지는 기관
합의 알고리즘부분 분기를 허용하는 작업증명(PoW)이나 지분증명(PoS) 알고리즘부분분기를 허용하지 않는 BFT계열의 합의 알고리즘
속도7~20 TPS1000 TPS 이상
권한 관리누구나통제된 인원
예시비트코인, 이더리움IBM Fabbric, LoopChain


퍼블릭 블록체인은 누구나 참여/운영할 수 있기 때문에 운영주체가 불분명하고 독자적인 화폐를 통해 금융활동을 하기 때문에 법적 구속력에 상대적으로 자유롭지만, 프라이빗(컨소시움) 블록체인은 운영주체가 명확하고 기존에 있던 금융거래를 하는 것이기 때문에 모든 금융 관련 법과 규제사항을 준수해야 합니다.

퍼블릭 블록체인은 읽기, 트랜잭션 생성을 누구나 할 수 있기 때문에 누구든지 모든 데이터를 확인할 수 있습니다. 그러나 기관 간 블록체인의 경우 누구나 트랜잭션을 생성할 수 있다면 금융사고가 일어났을때 책임 주체가 불분명해 질 수 있기 때문에 법적 책임을 가질 수 있는 기관만 트랜잭션을 생성해야 합니다. 또한 어플리케이션에 따라 개인의 금융정보가 담긴 데이터가 네트워크 상으로 오고 갈 수 있어 누구나 데이터를 확인 해선 안됩니다.

트랜잭션 검증 요구사항에도 차이가 있습니다. 퍼블릭 블록체인의 경우 트랜잭션 내역 모두에게 공개 되며 네트워크에 참여한 모든 노드가 트랜잭션을 검증합니다. 그러나 프라이빗(컨소시움) 블록체인에서 이해관계자가 아닌 모든 노드가 트랜잭션의 검증하는 것은 문제가 있을 수 있습니다.

퍼블릭 블록체인의 한계

  1. 퍼블릭 블록체인은 노드 별로 권한을 다르게 하는 것이 불가능하고 감독기관은 모든 데이터를 검증해야 되고 나머지 기관들은 자신에 관련된 데이터를 검증하는 등의 역할을 할 수 없습니다. 또한 엔진 수정이 어렵기 때문에 엔진에서 제공해야만 가능한 기능들을 추가하는게 매우 어렵습니다.
  2. 퍼블릭 블록체인은 참여가 자유롭습니다. 즉 인증 안된 참여자도 악의적인 목적을 가진 해커도 퍼블릭 블록체인에 접근할 수 있습니다. 악의적인 네트워크 참여자의 공격에 방어하면서 세계 각지에 있는 모든 노드들이 같은 데이터를 공유해야합니다. 퍼블릭 블록체인은 이런 요구사항을 만족 시켜야 하기 때문에 성능면에서 많은 것을 포기하였습니다.
  3. 퍼블릭 블록체인은 기본적으로 누구나 블록 후보를 만들어 제출하고 분산합의를 통해 하나의 블록을 선정하여 신뢰할 수 있는 블록으로 인정받는 구조입니다. 따라서 인터넷 상에서 블록을 공유해야하는 시간이 있고 너무 많은 블록이 동시에 만들어 지면 하나의 블록을 선택하기 어렵기 때문에 블록 생성시간에 제한을 두고 있습니다. 비트코인의 경우 약 10분 마다 하나의 블록을 생성하고 이더리움의 경우 약 12초 마다 하나의 블록을 생성합니다. 네트워크에 공유되는 시간을 고려했을때 이더리움에서 내가 보낸 트랜잭션 결과를 확인하려면 약 1~2분 정도 기다려야 합니다. R3에 제출한 이더리움 보고서에 따르면 현 이더리움의 TPS(Transaction Per Second)는 약 10tps이고 비트코인의 경우 약 7tps입니다. 즉각적인 처리가 필요한 금융권 서비스에는 그대로 적용하기에는 불가능한 수준입니다.
  4. 퍼블릭 블록체인에서 채택하고 있는 분산합의 알고리즘으로 작업증명(Proof of Work, PoW)이나 지분증명(Proof of Stake, PoS)을 사용하려면 내부 화폐가 필요합니다. 퍼블릭 블록체인에서의 분산합의 목표는 결국 거래 내역을 검증하여 신뢰할 수 있는 블록을 만들 수 있는 노드를 선택하는 것이고 이러한 수고를 하는 댓가가 필요하기 때문입니다. 이것이 채굴(mining)이라고 알려진 과정이 이러한 과정입니다. 작업 증명의 경우는 쓸모없는 컴퓨팅 파워를 많이 사용하는 친환경이지 않은 문제도 있습니다.
  5. 퍼블릭 블록체인에서 사용하는 알고리즘들은 나중에 블록 생성 후 블록이 확정되기 때문에 허용되는 시간 내에 네트워크 분기가 생길 수 있어 항상 확실한 데이터를 보장해야 하는 금융권에는 올바르지 않습니다. 때문에 프라이빗(컨소시움) 블록체인들은 Byzantine Fault Tolerance(BFT)계열의 분산합의 알고리즘을 사용하여 네트워크 분기를 허용하지 않습니다.

사이드체인

사이드 체인은 기존 비트코인 블록체인을 확장하기 위해서 나온 개념입니다. 기존 비트코인 블록체인은 비트코인만 거래할 수 있을 뿐 다른 용도로 사용하기에는 한계가 있었습니다. 사이드 체인은 블록체인에 저장되는 데이터가 조작 불가능하다는 것에 초점을 맞추고 비트코인 외의 다양한 거래를 수행하고 그 거래에 대한 증거 데이터를 블록체인에 저장하는 방식으로 거래를 수행하였습니다.

사이드체인 구조


가장 유명한 사이드체인인 Colored Coin은 트랜잭션에 구분되는 데이터를 집어넣어 다양한 자산을 거래하게 하였습니다. 나스닥에서는 주식거래를 위해 Colored Coin을 이용하려는 시도를 했지만 좋은 성과는 가지지 못하고 Colored Coin을 개발한 스타트업과 새로운 프라이빗 블록체인을 만드는 것으로 방향을 변경하였습니다.

비트코인은 인센티브 기반으로 운영되는 블록체인입니다. 컴퓨팅 파워를 이용해 해시 퍼즐을 푼 사람에게 인센티브가 주어지면서 해당 블록이 승인되고 복제됩니다. 현재 비트코인이 잘 운영되는 이유는 비트코인 네트워크를 독점하려면 51%이상의 컴퓨팅 파워를 가져야 하는데 51%를 점유한다고 해도 크게 경제적인 이득을 보기 어렵습니다. 그 이유는 특정 거래를 블록에 넣고 빼고 정도만 가능합니다. 또한, 누군가가 51% 이상을 점유했다는 불안감에 비트코인 가격이 내려가면 해당 업체는 마이닝 수익이 줄어듭니다.

그러나 만약 주식이 비트코인 위에서 거래된다면 경제적인 이득을 크게 볼 수 있습니다. 주식은 어떤 거래가 이뤄지는지에 따라 시시각각 가격이 변동합니다. 51%이상의 컴퓨터 파워를 독점해 특정 거래를 통과시키지 않고 자신의 거래만 승인하는 방식으로 시장에 영향을 미칠 수 있습니다. 예전에 특정 마이닝 풀이 70%이상의 컴퓨팅 파워를 가졌던 적이 있던 비트코인 네트워크 위에서 다른 금융 상품을 거래한다는 것은 매우 위험할 수 있습니다.

또한 기존 비트코인 블록체인의 운영 주체가 불분명 하다는 것 또한 문제가 될 수 있습니다. 내가 보낸 트랜잭션을 블록 안에 넣는 것은 블록 생성 노드의 마음이기 때문에 내 거래가 언제 승인될지는 알 수 없습니다. 실제 비트코인 블록체인에서 한 달 넘게 거래가 승인 되지 않는 경우도 있습니다. 그리고 퍼블릭 블록체인 위에서 돌아갈 경우 감사기관 검증을 받기도 힘들고 시스템에 문제가 생길 경우 책임 주체가 불분명 하다는 단점이 있습니다.



튜링 완전이란?

튜링 완전(turing complete)이란 어떤 프로그래밍 언어나 추상 머신이 튜링 머신과 동일한 계산 능력을 가진다는 의미이며 튜링 머신으로 풀 수 있는 문제, 즉 계산적인 문제를 그 프로그래밍 언어나 추상 머신으로 풀 수 있다는 의미입니다.

튜링이란?

수학자 앨런 튜링이 1936년에 제시한 개념으로 계산하는 기계의 일반적인 개념을 설명하기 위한 가상의 기계이며 오토마타의 일종이다. 튜링은 이 개념을 automatic에서 따온 a-machine이라고 불렀는데 튜링 사후에 창시자의 이름을 따 튜링 머신이라고 부르게 되었다.

라고 나무위키에서 정의되어 있습니다.

튜링 머신 장치

테이프(Tape) : 일정한 크기의 셀(Cell)로 나뉘어 있는 종이 테이프. 각 셀에는 기호가 기록되어 있으며 길이는 무한히 늘어날 수 있음

헤드(Head) : 종이 테이프의 특정 한 셀을 읽을 수 있는 헤드. 이동이 가능하다. 또는 헤드는 고정되어 있고 테이프가 이동

상태 기록기(State register) : 현재 튜링 머신의 상태를 기록하고 있는 장치

  • 개시 상태(Start state) : 상태 기록기가 초기화된 상태를 의미

  • 종료 상태(Halt state) : 수행이 종료된 상태

행동표(Action table, transition table of instructions) : 특정 상태에서 특정 기호를 읽었을 때 해야 할 행동을 지시

  • 기호를 지우거나 고쳐 씀

  • 헤드를 오른쪽, 왼쪽으로 한 칸 움직이거나 그 자리에 머뭄

  • 상태를 변경한다. 같은 상태에 머무를 수도 있음



튜링머신에 대해 복잡한 문서가 있는데 컴퓨터는 보편 튜링 머신 이론에 바탕을 두고 있습니다. 간단하게 컴퓨터 = 튜링머신 이라고 이해하는게 빠릅니다(약간의 차이가 존재). 따라서 튜링 머신은 컴퓨터를 흉내낼 수 있습니다. 컴퓨터의 작업을 이론적으로 모델링할 때 튜링 머신을 활용합니다.

물론 약간의 차이점이 있는데 튜링 머신은 아무 위치나 원할 때 접근할 수 없습니다. 이진탐색(binary search)와  같은 알고리즘의 시간복잡도는 임의 접근이 가능하다면 O(logN) 시간이 걸리지만 튜링 머신에서는 O(N)의 시간이 걸립니다.

현실의 모든 컴퓨터 또한 튜링 완전하지 않은데, 그 이유는 기억장치가 유한하기 때문입니다. '만일 기억장치가 무한하다면 이 컴퓨터는 튜링 완전하다'라고 생각할 수도 있는데 이것을 느슨한 튜링 완전성(Loose Turing Completeness)이라고 합니다. 대부분의 컴퓨터는 느슨하게 튜링 완전합니다. 그렇기 때문에 어떤 컴퓨터가 할 수 있는 모든 일은 아주 충분한 시간과 메모리만 주어진다면 다른 어떤 간단한 컴퓨터로도 할 수 있습니다.


요약

  • 튜링은 계산하는 기계를 만든 사람의 이름을 따옴
  • 튜링완전하다는 것은 튜링머신과 동일한 계산능력을 지녔다는 의미
  • 복잡하게 더 이해할 필요성을 못느낌


스마트 컨트랙트란?

스마트 컨트랙트(Smart Contracts)는 중개자없이 P2P로 쉽고 편리하게 계약을 체결하고 수정할 수 있는 기술입니다. 사실 새롭게 정의된 용어는 아닙니다. 예를 들어, 자판기에 1000원을 넣고 마시고 싶은 음료수 버튼을 누르면 자판기가 자동으로 음료수와 잔돈(거스름돈이 존재할 경우)을 뱉어줍니다. 이와 같은 행동을 스마트 컨트랙트라 부릅니다. 여기서 문제는 돈을 넣었는데 자판기가 이를 인식하지 못하거나 돈을 넣지 않고 자판기를 흔드니 돈이 나오는 것과 같은 경우입니다. 이는 자판기의 신뢰성에 금이가는 문제이기 때문에 이를 방지하기 위해 주변에 기술자 또는 주인이 상주하여 확인해야합니다. 즉, 기존의 프로세스들도 스마트 컨트랙트라 부를 수 있는 계약을 하곤 있지만, 신뢰성 유지를 위해 여러 보조장치가 필요하고 이러한 보조장치를 유지하기 위한 비용이 들어갑니다.

블록체인과 스마트 컨트랙트

 블록체인은 디지털 데이터를 신뢰할 수 있게 만들어 주는 기술입니다. (http://brownbears.tistory.com/365?category=281929 - 블록체인이란?) 다수의 노드가 같은 데이터를 공유하고 검증하는 방식을 통해 디지털 상에 신뢰관계를 형성하고 있습니다. 블록체인은 각 블록들을 공유함으로써 데이터의 변조가 거의 불가능합니다. 한 마디로 블록체인은 스마트 컨트랙트를 구현할 수 있는 최상의 환경인 셈입니다. 

예시

스마트 컨트랙트의 예시는 현재 활발히 진행중인 이더리움 기반의 ICO를 생각할 수 있습니다. 

예를 들어, A라는 코인이 ICO를 진행해 '1이더리움을 주면 300A를 드립니다.' 라고 모집을 했다고 가정합니다. 이와 같이 계약서를 작성하고 이더리움을 받고자 하는 주소를 알려줍니다. 이때 계약서는 A코인에서 제공하는 주소입니다. 단순하게 이더리움을 받는 주소가 아닌 컨트랙트 주소로 계약서의 역할까지 수행하게 됩니다. 

https://etherscan.io/address/0x4957295167dfa9aec2ca40c377d0f8cc4732c7af#code 에서 확인해보면, Contract라 붙어있는 주소가 컨트랙트 주소입니다. (일반주소는 Contract가 붙어있지 않습니다!) 위 주소를 들어가보면 아래에 코드가 존재하는데 대개 코드에는 몇몇 특정 사람이 독점하는 것을 막기 위해 일정 수수료를 초과하면 거절되도록 하는 코딩이 되어 있습니다. 

 

한계점

이러한 계약서는 예시처럼 간단한 것도 있지만, 복잡한 계약서도 존재합니다. 어떻게 사용하냐에 따라 현실의 계약서를 대체할 수도 있습니다. 그러나 현실에서 사용할 때는 문제점이 존재합니다. 만약 개인간 거래에 스마트 컨트랙트를 도입했다고 가정합니다. A라는 사람이 '갤럭시 S8을 10만원에 팝니다.' 라는 계약서를 올리고 B라는 사람이 갤럭시S8을 사기위해 10만원을 입금했다면 A는 갤럭시 S8을 배송시켜줘야 합니다. 그러나 A가 갤럭시 S8을 배송시키지 않고 신문지 더미만 들은 상자를 배송한다고 해도 이를 막을 수 없습니다. (이런 문제는 지금도 존재하지만..)

또한 위 예시에서 이더리움 기반의 ico에 많은 사람들이 몰리면 부하가 커져 상당히 느려지게 됩니다. 


리플과 같이 최초 발행 이후 추가발행이 불가능한 암호화폐도 있지만 대부분은 채굴방식을 통해 추가발행이 진행됩니다. 채굴방식은 대표적으로 POW, POS, DPOS가 있습니다. 

한마디로 어떤 방식으로 채굴을 해서 보상을 받을것인지에 대한 약속 이라고 보면 됩니다. 명칭은 채굴 증명방식합의 프로토콜합의 메카니즘 등 여러 용어로 부르기도 합니다.

POW (Proof of Work)

대표코인: 비트코인, 라이트코인, 제트캐시, 모네로 등

작업증명으로 부르기도 하며 해시연산을 처리하는 하드웨어(GPU, ASIC채굴기) 등을 사용해서 증명하는 방식입니다. 간단하게 말해 하드웨어 장비를 사용해 코인을 채굴하는 것입니다. 

자세하게..

IT전공자가 아니라면 아래의 내용은 어려울 수도 있습니다. 위의 간단한 설명으로도 충분하니 넘어가도 상관없습니다.

PoW의 방식은 노가다라고도 볼 수 있습니다. 해시함수에서 나온 출력값을 채굴자들이 하드웨어 장비 (GPU, CPU와 같은 컴퓨팅 파워)를 통해 결과를 도출하는 것입니다. 여기서 해시는 단방향 암호화 기술이므로 결과값을 가지고 역으로 입력값을 찾아낼 수가 없습니다 (한마디로 복호화가 불가능). 따라서 무차별 대입으로 출력값과 똑같은 결과가 나올때까지 실행하는 방법밖에 없습니다. 이렇게 초당 해시를 처리하는 것을 해시레이트(h/s)라 부르기도 합니다.

이러한 방식으로 문제를 해결하면 가장 빨리 채굴된 블록만 인정을 받고 나머지는 버려지게 되기 때문에 이중지불 문제가 해결되게 됩니다.


여기서 의문점은 거대 자본가가 슈퍼컴퓨터를 구입하여 연산을 돌린다면 분산된 장부작성 방식이 아닌 중앙집권적 방식이 되지 않을까 할 수 있습니다.

첫 번째로 과반수의 해시파워를 가진 컴퓨터를 구매하는 건 엄청나게 많은 돈이 들어갑니다. 만약 천문학적인 돈을 투자하여 구매했다 하더라도, 거래가 위조되고 부당한 장부라고 느낀다면 해당 블록체인의 가치가 급락할 것이기 때문에 정당한 방식으로 네트워크를 운영하는 것이 훨씬 큰 이득입니다.

장점

  • 최소 가격대 형성이 확실하게 정해져 있음
  • 강력한 보안성
  • 서비스 남용을 쉽게 방지

단점

  • 채굴난이도가 높아지면서 연산에 필요한 고사양 장비가 많이 필요하고, 과도한 전력소모로 인한 에너지 낭비가 커짐
  • 채굴난이도가 높아지면서 개인 채굴자는 채굴을 할 수 없는 수준까지 옴
  • 지속적으로 해시파워를 유지해야함
  • 채굴하는 업자끼리의 단합 문제

POS (Proof of Stake)

대표코인: 퀀텀, 네오, 스트라티스

지분증명이라 부르기도 하며 채굴기 없이 본인이 소유한 코인의 지분으로 채굴되는 방식입니다. 위 POW의 단점을 극복하기위해 등장하였습니다.

자세하게..

IT전공자가 아니라면 아래의 내용은 어려울 수도 있습니다. 위의 간단한 설명으로도 충분하니 넘어가도 상관없습니다.

validator가 현재 보유하고 있는 자산(stake) 양에 비례하여 블록을 생성할 권한을 더 많이 부여되는 방식입니다. 마치 이자와 같은 방식으로 코인이 지급되며, 일정 수 이상의 코인을 보관하고 있는 지갑을 블록체인 네트워크에 연결시켜놓기만 하면 보상을 받을 수 있습니다. 

블록 생성자와 지분 생성자의 이해관계를 일치시킴으로써 블록을 나쁜 의도로 생성할 동기부여를 없애며, 잘못 생성할 경우 패널티를 부여합니다. 이더리움은 PoW에서 PoS로 컨센서스 알고리즘(코인을 보유한 지분율에 따라 새롭게 생성하는 코인을 분배받는 방식)을 변경하려 하고 있습니다. 

만약 fork가 일어나 체인이 갈라지더라도 더 많은 자산(검증)을 보유하는 체인이 살아남고 나머지는 버려지게 되는 것이 (이건 POW와 동일) PoS 합의 메커니즘의 운영방식입니다.


이러한 설명으로는 컴퓨팅파워 없이 이자를 받게 되니 좋을 것 같지만 코인을 보유하고 있는 사람 누구나가 DB를 업데이트 할 수 있게 되는 방식은 위험하다고 볼 수 있습니다. 해당 코인 지분이 많은 사람이 악의적인 공격을 가하게 된다면 해당 블록체인은 위험할 수 밖에 없기 때문입니다.

예를 들어, 퀀텀의 51% 지분을 갖고 있는 A라는 사람이 데이터 업데이트의 권한을 쥐고 흔들 수 있다고 볼 수 있습니다. 따라서 맘에 안드는 사람 B의 자산을 A가 악의적으로 기록을 삭제하여 0원으로 만들 수도 있기 때문입니다.


기존 PoW 방식은 블록체인의 정당성을 확인할 수 있지만 채굴노드의 경우 하드웨어를 직접적으로 갖춰야 하고 에너지 소모가 굉장히 클뿐더러 대량의 채굴기를 돌리는 경우 지리적으로도 넓은 평지를 가지고 있어야 가능하다 왜냐하면 채굴기 자체에서 발생하는 열과 소음이 상당하기 때문이다. 

  • PoW에서 51%의 해시파워를 가지는 비용 = 약 2500억원
  • PoS에서 전 세계 자산의 51% = 약 25조원

이렇게 100배 가량의 차이가 나기 때문에 PoS방식이 중앙집권화가 더 어렵고 코인을 가진 누구나 네트워크에 허가없이 참여하기 때문에 오히려 분산화가 더 잘된다고 볼 수 있습니다. 

장점

  • 해시파워가 많이 필요하지 않아 경제적이며 친환경적
  • 블록 생산자의 탈중앙화로 안정성 확보
  • 블록을 생성하기 위해서는 지분을 담보로 잡아야 하기 때문에 덤핑 방지

단점

  • 모두 이자를 받으려고 코인을 묶어놓기 때문에 시중 코인의 유통량 감소로 이어질 수 있음
  • 검증이 되지 않았기 때문에 보안성이 강한지 확신할 수 없음
  • 코인을 많이 보유한 사람이 권력을 지게되는 구조 (부익부 빈익빈)

DPOS (Delegated Proof-of-Stake)

대표코인: 스팀, 이오스, 아크, 라이즈

위임지분증명이라 부르기도 하며 말그대로 위임된 POS입니다. POS가 자산을 가진 사람들이 전부 참여할 수 있는 방식이라면 DPOS는 특정 인원에게만 POS를 할 수 있도록 권한을 위임하는 것입니다. 즉 특정인 몇 명만이 블록을 생성하여 증명할 수 있습니다.

자세하게..

IT전공자가 아니라면 아래의 내용은 어려울 수도 있습니다. 위의 간단한 설명으로도 충분하니 넘어가도 상관없습니다.

DPoS 네트워크는 구성하는 모든 노드들의 투표 결과로 정한 상위 노드에게 권한을 위임하여 일종의 대표자가 되는 것입니다. PoS의 경우, 일정 지분을 소유한 모든 노드에게 블록 생성 권한이 주어지기에 오랜 시간이 필요하지만 DPoS의 경우, 투표 결과로 정한 상위 노드 라는 비교적 적은 숫자로 인해 합의 시간과 비용을 줄일 수 있습니다. 합의시간과 비용이 줄어든다는 것은 전송처리가 굉장히 빠르다는 것과 밀접한 관련이 있습니다.

DPoS는 PoS와 달리 소규모 참여자에게는 꿀단지 입니다. PoS는 참여하기 위해 최소 코인을 (말이 최소지 어마어마한 돈) 가지고 있고 블록생성을 위해 24시간 네트워크를 유지하며 하드포크마다 알고리즘 업데이트를 할 필요가 없습니다. 소규모 참여자는 권한을 위임하고 위임한 상위노드로부터 이자를 받거나 송금 수수료를 감면받을 수 있습니다.


상위 노드로서 뽑힌 사용자는 PoS에서와 같이 블록생성을 진행할 수 있습니다. 상위노드로 뽑히는 기준은 본인을 투표한 구성원의 코인 총 합 순위로 매기는 것이 보통의 방법입니다.

장점

  • 소규모 참여자도 이득을 볼 수 있음
  • 송금속도가 빠름

단점

  • 상위 노드만 블록생성에 참여하기 때문에 탈중앙화가 맞는지 애매함
  • 상위 노드만 블록생성에 참여하기 때문에 보안이 취약함
  • 코인 보유량이 적어도 상위 노드로 뽑힐 수 있음

마치며

이외에도 POI, Zero-Knowledge Proof 등등 여러 채굴방식이 존재하긴 하는데 저 3개가 가장 대표라 생각되어 정리했습니다.

블록체인(block chain)이란?

블록체인은 관리 대상 데이터를 블록이라고 하는 소규모 데이터들이 P2P 방식을 기반으로 생성된 체인 형태의 연결고리 기반 분산 데이터 저장환경에 저장되어 누구도 임의로 수정될 수 없고 누구나 변경의 결과를 열람할 수 있는 분산 컴퓨팅 기술 기반의 데이터 위변조 방지 기술입니다. 이는 근본적으로 분산 데이터 저장기술의 한 형태로, 지속적으로 변경되는 데이터를 모든 참여 노드에 기록한 변경 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가능하도록 고안되었습니다. 잘 알려진 블록체인의 응용 사례는 암호화폐의 거래과정을 기록하는 탈중앙화된 전자장부로서 비트코인이 있습니다. 이 거래 기록은 의무적으로 암호화되고 블록체인 소프트웨어를 실행하는 컴퓨터상에서 운영되고 비트코인을 비롯한 대부분의 암호화폐들이 블록체인 기술 형태에 기반하고 있습니다.

출처: 위키백과

다시말해 블록체인은 데이터 분산 처리 기술입니다. 네트워크에 참여하는 모든 사용자가 모든 거래내역 등의 데이터를 분산하여 저장하는 기술을 뜻합니다. 이렇게 저장된 데이터를 블록이라 칭하며 여러 블록들을 시간의 순서대로 묶는 형태를 가져 블록체인이라 불리게 됩니다. 이 모든 사용자가 거래내역을 보유하고 있어 거래 내역을 확인할 때는 모든 사용자가 보유한 장부를 대조하고 확인해야 합니다. 이러한 이유로 블록체인은 공공거래장부, 분산거래장부 로 불리기도 합니다.


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

출처: SW 중심사회

기존의 거래방식은 중앙기관 즉, 은행에서 모든 거래 내역을 저장하고 있습니다. 개인 간 거래사실을 저장하여 증명 해야 하기 때문입니다. 

블록체인은 은행과 다르게 해당 네트워크에 참여한 인원이 거래내역을 나눠서 저장하게 됩니다. 만약 한 네트워크에 100명이 참여하고 있다면 개인간 거래 내역을 100개의 블록을 생성해 100명 모두에게 전송한 뒤 저장을 합니다. 후에 거래내역을 확인할 때는 블록으로 나눠 저장한 데이터들을 연결해 확인합니다.

블록체인 특장점

위에서 말한것 처럼 블록체인은 분산저장을 한다는 점이 특징입니다. 기존 거래방식에서는 데이터를 위,변조 하기 위해선 중앙서버를 공격하면 됐습니다. 그러나 블록체인의 경우 여러 명이 동일한 데이터를 저장하기 때문에 위, 변조가 어렵습니다. 블록체인 네트워크를 위, 변조하기 위해서는 참여자의 거래 데이터를 모두 공격해야 하기 때문에 사실상 해킹이 불가능하다고 여겨집니다. 

블록체인은 중앙 관리자가 필요없습니다. 중앙기관이나 관리자 없어도 다수가 데이터를 저장, 증명할 수 있기 때문에 탈중앙이 가능합니다. 

블록체인 네트워크 구성

블록체인 네트워크 구성요소는 블록체인 노드와 블록체인 클라이언트입니다.


  • 노드 : 트랜잭션 내역 보관, 트랜잭션 승인, 분산합의
  • 클라이언트 : 트랜잭션 생성, 거래 내역 확인 (비트코인의 경우 지갑)

블록체인의 노드는 일반적인 서비스의 백엔드(Backend) 역할을 하고 블록체인 클라이언트는 클라이언트 역할을 합니다. 클라이언트가 새로운 트랜잭션을 발생시키면 노드들은 트랜잭션을 분산합의 과정을 통해 공유하고 트랜잭션을 실행하죠. 클라이언트는 트랜잭션의 결과를 확인할 수 있습니다.

블록체인 노드는 두 가지 종류의 데이터베이스를 가지고 있습니다. 올바른 트랜잭션을 모두 보관하는 블록체인 트랜잭션 보관 데이터베이스와 저장된 트랜잭션을 어플리케이션에 적용한 어플리케이션 데이터베이스를 가지고 있습니다.


블록체인 트랜잭션 내역 DB

노드가 가지고 있는 두 가지 DB 중 트랜잭션 목록을 보관하는 DB는 블록체인(Block-chain)이라는 특이한 구조로 되어 있습니다. 이 DB의 특이한 구조가 이제는 전체를 대표하는 명칭이 되었습니다. 트랜잭션 내역 DB는 블록체인이라는 이름처럼 블록이 연결된 구조로 되어 있습니다. 각 블록은 순서가 정해진 트랜잭션 리스트가 있고 각 블록들은 시간의 순서대로 연결되어 있죠(순서가 기재되어 있습니다). 블록체인 자료구조를 이용하면 모든 트랜잭션의 순서를 확정 지을 수 있습니다.

블록체인, 비트코인

비트코인과 같은 암호화폐가 등장한 것도 위에서 설명한 블록체인의 특장점 덕분입니다. 비트코인을 원하는 사람들이 직접 채굴을 통해 발행할 수 있습니다. 일각에서는 블록체인이 중앙기관과 은행을 대체할 것이라는 전망을 보여주기도 하지만 제 생각은 어려울 것으로 보입니다.


암호화폐에서는 이중지불방지를 위해 아래와 같은 다양한 시간표시 방법들을 사용합니다. 이중지불이란 100만원의 잔고에서 돈을 100만원 출금을 한 뒤, 잔고가 0원으로 갱신되기 전 재빨리 100만원을 또 출금하는 시간차 공격을 말합니다.

  1. 작업증명 (POW : proof-of-work)
  2. 지분증명 (POS : proof-of-stake)
  3. 위임지분증명 (DPOS: delegated proof-of-stake)

대표적으로 위와 같은 방법으로 이중지불 문제를 해결하고 있습니다.


암호화폐 간략한 개발과정

비트코인을 시작으로 성능개선, 익멱성, 저장기능과 스마트 컨트랙트 기능 등 다양한 기능들이 개발되었습니다.

+ Recent posts