Front-end Developer

0%

블록체인 무엇인가? 3장 블록체인은 어떻게 작동하는가? 08 ~ 11단계

3. 블록체인은 어떻게 작동하는가?

8. 블록체인의 청사진 그리기

목표: 소유권을 관리하는 블록체인의 개발. 완전히 개방된 환경에서 작동하는 원장의 순수 분산 P2P 시스템에서 소유권을 관리하는 소프트웨어 디자인.

출발점: 개발 환경 공유하기

  • 시스템은 순수 분산 P2P 시스템이고, 각 사용자가 기여한 계산 자원으로 이루어진다.
  • 인터넷을 사용해 개별 노드의 네트워크를 연결한다.
  • 노드의 개수는 물론 노드의 안정성과 신뢰성도 전혀 알 수 없다.
  • 목표는 디지털 재화의 소유권을 관리하는 것.

진행경로: 7가지 과제 해결하기

  1. 소유권 기술
    1. 블록체인으로 무엇을 하고 싶은지, 소유권을 어떻게 기술할 것인지를 결정한다.
    2. 트랜잭션은 소유권의 이전을 설명하는 좋은 방법이며, 트랜잭션 전체 이력은 현 소유자를 확인할 수 있는 핵심이 된다.
  2. 소유권 보호
    1. 타인이 다른 사람의 자산에 함부로 접근하지 못하도록 보호해줄 장치
    2. 암호화 기술을 통해 개별적 트랜잭션을 보호한다.
    3. 소유권을 보호하는 과정: 소유주 식별 -> 소유주 인증 -> 소유주 본인에게만 자산 접근 허가
  3. 트랜잭션 데이터 저장
    1. 트랜잭션 데이터는 소유권을 명확히 하는 핵심 요소이므로 안전한 방법으로 저장
  4. 신뢰할 수 없는 환경에 배분할 원장 준비
    1. 신뢰할 수 없는 환경에서 작동하는 원장의 분산 P2P 시스템을 디자인한다.
    2. 이 말은 신뢰를 알 수 없는 환경에 있는 각 노드가 신뢰할 수 있는 행동을 할 때 인센티브가 더 돌아가도록 설계해서 전체 환경을 확률적으로 신뢰할 수 있도록 만든다는 것.
    3. 신뢰할 수 없는 환경에서 원장의 복사본들이 신뢰할 수 없는 노드들 사이에 흩어져 있고, 원장을 통제하거나 조정하는 중앙 통제 노드가 존재하지 않아서 각 노드에게 원장의 제어를 맡긴다.
    4. 이 상황에서 트랜잭션을 바꾸지 못하도록 막아두는 것으로 원장의 위조나 조작을 막을 수 있다.
    5. 원장과 트랜잭션 이력은 한번 기록되면 바꿀 수 없게 하는 것이다.
    6. 단 블록체인-데이터-구조에서 변경을 못하게 하면서 새로운 트랜잭션을 추가할 수 없으니 추가 전용 블록체인-데이터-구조로 만들어서 새 트랜잭션을 추가할 수 있도록 승인해야 한다.
  5. 원장 배분
    1. 원장을 추가 전용으로 만들고 요청하는 누구에게나 복사본을 만들어주면 원장의 분산 P2P 시스템을 구성할 수 있다.
  6. 원장에 새 트랜잭션 추가
    1. 분산 P2P 시스템은 개별적으로 추가 전용 블록체인-데이터-구조를 유지하는 구성원들로 구성된다.
    2. 오직 유효하고 승인된 트랜잭션만 추가될 수 있도록 보장해야 한다. 이를 위해 P2P 시스템의 구성원 모두에게 새로운 데이터를 추가할 수 있도록 허용하고, 각 구성원이 P2P 시스템의 각 피어를 감독하게 한다.
  7. 어느 원장이 진실인지 판단
    1. P2P 시스템에서 개별 원장에 새로운 트랜잭션을 추가할 수 있도록 허용하면 모든 분산 P2P 시스템에서 발생하는 각 피어들이 서로 다른 트랜잭션 데이터를 받을 가능성이 생긴다.
    2. 트랜잭션 이력은 합법적 소유자를 찾기 위한 기초가 되므로 시스템 내 서로 다른 이력이 충돌해서는 안되고, 따라서 진실을 담고 있는 트랜잭션을 가려낼 기준이 필요하다.
    3. 순수 분산 P2P 시스템에는 어떤 트랜잭션 이력을 선택해야 할지 결정해 줄 중앙 통제 장치가 없기 때문에 모든 노드가 독립적인 다수 의견을 따라 진실된 트랜잭션 이력을 개별적으로 결정해서 문제를 해결하도록 한다.
    4. 블록체인이 새 트랜잭션을 추가 전용 블록체인-데이터-구조에 추가하도록 허용하여 문제를 해결할 수 있다.

9. 소유권 기록에서 모든 것이 시작된다

목표: 누가 보더라도 명확히 알 수 있게 소유권 기록하기

  • 해결해야 할 과제: 소유권에 대한 주장을 기록하고, 소유권에 대한 증거까지 제공하여 소유권 자체를 증명하는 기록 방법을 찾아낸다.
  • 아이디어: 소유권의 현 상태를 재산 목록 데이터 형태로 단순 기술하지 않고, 소유권이 이전된 이력까지 원장에 빠짐없이 기록 보관한다.

목록과 트랜잭션 데이터는 어떻게 다른가?

소유권을 기술한다는 점에서는 같고, 아래와 같은 차이점이 있다.

소유권 목록 트랜잭션 데이터
소유권 목록을 작성 트랜잭션 데이터를 작성
소유권의 현 상태를 기술 소유권의 이전 이력을 기술
e.g. 잔고증명서(은행 계좌의 현 잔고 표시) e.g. 거래내역조회서(출금, 입금 등의 내역을 모두 표시하여 보여줌)
단순하게 소유권을 주장 소유권을 설명하고 증명

작동 원리

블록체인 소유권 기록에 필요한 두 가지

  1. 소유권 이전을 기술
  2. 트랜잭션 이력을 유지

1. 소유권 이전을 기술

현 소유자의 소유권을 다른 사람에게 이전하는 행위를 트랜잭션이라 한다. 이때 데이터에 의도한 이전을 데이터에 기록하고, 이 데이터에는 소유권 이전에 필요한 모든 정보가 담긴다. 은행의 계좌이체 시 계좌이체 서식과 비슷하다. 단, 중앙 통제된 은행에서 동일한 수수료 체계를 사용하는 것과 달리 블록체인은 중앙 통제가 없는 분산 시스템이므로 통일된 수수료 체계가 없다. 블록체인은 트랜잭션을 기술하기 위해 다음의 정보를 이용한다.

  1. 다른 계정으로 소유권을 이전하려는 계정의 식별자
  2. 소유권을 이전받으려는 계정의 식별자
  3. 이전하려는 재화의 총액
  4. 이전이 완료되는 시각
  5. 이전하기 위해 시스템에 지불해야 하는 수수료
  6. 이전에 동의한다는 원소유자의 증명

2. 트랜잭션 이력의 유지

트랜잭션의 수행은 트랜잭션 데이터에 기록된 대로 소유권의 이전이 일어난다는 것이며 원장에 트랜잭션 데이터를 추가한다는 의미이다. 블록체인은 모든 트랜잭션을 일어난 순서대로(기록된 순서대로) 블록체인-데이터-구조에 저장하여 전체 이력을 유지한다.

  • 작동하는 이유: 트랜잭션 데이터는 소유권을 이전하려는 계정에 대한 모든 정보를 가지고 있어서 트랜잭션 전체 이력만 존재하면 소유권 관련 정보를 재구성할 수 있다.
  • 트랜잭션 순서가 중요하다: 트랜잭션 데이터를 합치는 이유는 소유권 이전 내역을 재구성해 현 소유권자를 찾아내고 소유권을 명확화하려는 목적에서다. 따라서 데이터를 합칠 때마다 트랜잭션이 발생했던 순서 그대로 동일하게 재현되는 것이 매우 중요하다. 트랜잭션 순서가 달라지면 데이터가 합쳐진 결과도 달라지기 때문이다.
  • 트랜잭션 이력의 무결성을 유지하기 위해 필요한 3요소
    • 트랜잭션 데이터의 이력이야말로 소유권을 관리하는 블록체인의 심장이다. 전체 시스템의 무결성을 지키려면 이력 데이터를 안전하고 완전하며 정확하고 일관되게 유지해야 한다. 따라서 블록체인은 오직 유효한 트랜잭션 데이터만 블록체인-데이터-구조에 추가되도록 보장하는 보안 수단을 제공해야 한다.
    • 트랜잭션 데이터 유효성 검사를 위한 3가지 요소
      • 형식적 정확성: 트랜잭션 데이터가 필요한 모든 정보를 정확한 형식으로 기술한다.
      • 의미상 정확성: 트랜잭션 데이터의 의미와 의도한 결과, 즉 의미상 정확성을 검증하기 위해 해당 사업 영역에 대한 지식이 필요하다. 트랜잭션 데이터의 의미상 정확성을 조사하기 위해서는 대개 업계 관행에 따른다.
      • 승인: 소유권을 이전하는 소유권자 본인만 자신을 대신해 트랜잭션을 실행해달라고 블록체인에 요청할 수 있어야 한다. 스마트 컨트랙션으로 대변되는 블록체인 트랜잭션의 특징은 단순 기록이 아닌 계약의 실행에 있고, 계좌 소유자가 정말로 소유권 이전에 동의하는지 증명할 수 있는 정보를 반드시 가지고 있어야 한다.

10. 데이터 해싱하기

해시값: 블록체인의 가장 중요한 기반 기술, 지문의 디지털 버전, 암호화 해시값, 블록체인에서 광범위하게 사용하기 때문에 암호화 해싱에 대해 알아여 블록체인에 대해 이해할 수 있다.

목표: 암호화 해싱으로 데이터 식별하기

분산 P2P 시스템에서는 엄청난 양의 트랜잭션 데이터를 다루기 때문에 고유한 트랜잭션을 식별해서 최대한 빨리 비교해야 한다. 목표는 디지털 지문(암호화 해시값)으로 트랜잭션을 식별하고, 모든 종류의 데이터를 식별할 수 있도록 하는 것이다.

작동원리

  • 해시함수: 어떤 형태의 데이터든 입력 데이터의 길이와 상관없이 고정된 길이의 숫자로 변환하는 함수
    • 한 번에 하나의 데이터만 입력받아 그 데이터를 구성하는 비트와 바이트를 이용해서 해시값 생성
    • 함수의 종류에 따라 서로 다른 길이로 생성되고, 길이를 채우기 위해 앞자리 수를 0으로 채울 때도 있다.
  • 암호화 해시 함수: 중요한 해시 함수 그룹으로 어떤 데이터라도 고유의 디지털 지문을 생성해주는 해시 함수

암호화 해시 함수의 특징

  1. 어떤 종류의 데이터든 즉시 해시값 제공
  2. 확정적
  3. 의사 난수
  4. 일방 함수
  5. 충돌 회피

1. 어떤 종류의 데이터든 즉시 해시값 제공

  1. 어떤 종류의 데이터든 해시값을 생성할 수 있다.
  2. 해시값 계산을 빠르게 할 수 있다.

이 두가지 성질을 조합하여 해시 함수가 오류 메시지 같은 쓸모없는 것을 생성하거나 결과를 반환하기 위해 긴 시간을 소비하지 않도록 해준다. 매우 중요한 특징이다.

2. 확정적

동일하게 입력했을 때 동일하게 출력해야 한다. 만약 해시값이 다르다면 입력 값이 다른 것이지 해시 함수 내부 작동에 의한 것이 아니다.

3. 의사 난수

입력 데이터가 변하면 해시값이 예측 불가하게 변해야 한다. 적은 비트만 바꿔서 입력해도 해시값이 크게 변하여 입력 데이터를 보고 해시값을 예측할 수 없어야 한다.

4. 일방 함수(비가역 함수)

출력으로 입력을 알 수 있는 방법이 존재하지 않는 함수. 해시값을 이용해 원래 입력 값을 복원하는 것이 불가능하다.

5. 충돌 회피

둘 이상의 데이터가 동일한 해시값을 생성하는 것이 지극히 어려울 때 그 해시 함수를 충돌 회피라 한다. 즉 서로 다른 데이터가 동일한 해시값을 가질 확율이 매우 낮으면 그 해시 함수는 충돌 회피이고, 이런 해시 함수로 생성된 해시값은 고유성을 지녀 데이터를 식별하는 데 사용할 수 있다. 이 말은 반대로 서로 다른 데이터가 동일한 해시값을 얻으면 충돌에 직면한다는 것이다. 이는 일어나서는 안될 일이며, 이를 회피하기 위해서 엄청난 노력이 쏟아부어진다.

해시 함수 직접 적용해 보기

해시값은 해시 수로도 불리는 데 16진수로 나타내고, 아래 예시처럼 Input값이 동일하더라도 해시 함수의 종류에 따라 출력된 해시값이 달라진다.

1
2
3
4
5
6
7
8
9
//INPUT
Hello World!

//OUTPUT
MD5: ED076287532E86365E841E92BFC50D8C
SHA1: 2EF7BDE608CE5404E97D5F042F95F89F1C232871
SHA256: 7F83B1657FF1FC53B92DC18148A1D65DFC2D4B1FA3D677284ADDD200126D9069
SHA512: 861844D6704E8573FEC34D967E20BCFEF3D424CF48BE04E6DC08F2BD58C729
743371015EAD891CC3CF1C9D34B49264B510751B1FF9E537937BC46B5D6FF4ECC8

해싱된 데이터의 5가지 패턴

하나의 데이터가 해시 함수에 입력되면 그 데이터에 해당하는 해시값이 생성되는데, 이는 모든 독립된 데이터는 자신만의 고유한 암호화 해시값을 갖는다는 것을 의미한다. 만약 서로 독립적인 데이터들의 묶음에 대해 하나의 해시값만 생성하고 싶다면 아래의 5가지 패턴을 사용해서 해시 함수를 적용한다.

  1. 독립 해싱
    1. 각 데이터에 대해 독립적으로 해시 함수를 적용한다.
  2. 반복 해싱
    1. 해시 출력값에 해시 함수를 한번 더 적용한다.
    2. 해시값은 그 자제로 하나의 데이터로 간주할 수 있기 때문에 해시값을 다시 해시 함수에 입력해서 그에 해당하는 또 다른 해시값을 계산한다.
  3. 결합 해싱
    1. 하나 이상의 데이터에 해싱을 한 번만 적용하여 단일 해시값을 얻는다.
    2. 독립된 데이터들을 합쳐 하나의 데이터로 만들고 합쳐진 데이터의 해시값을 계산한다. (제공된 모든 데이터를 한꺼번에 결합)
    3. 주어진 시간 안에 가용한 모든 데이터의 집합에 단일 해시값을 부여할 때 유용하다.
    4. 다만 리소스(계산 자원, 시간, 기억 공간 등)가 많이 들기 때문에 개별 데이터가 크지 않을 때만 사용한다.
    5. 결합된 데이터만 해시 함수에 전달되었기 때문에 개별 데이터의 해시값은 알 수 없다는 단점이 있다.
  4. 순차적 해싱
    1. 새로운 데이터가 도착할 때마다 기존의 해시값이 새로운 데이터와 합쳐져서 해시값을 즉시 갱신한다.
    2. 결합 해싱과 반복 해싱을 동시에 사용하는 것이다.
    3. 단일 해시값만 유지하면서 새로운 데이터가 도착하는 즉시 해시값을 갱신하고자 할 때 유용하다.
    4. 특정 시점의 해시값으로 해당 데이터가 도착한 시점을 추적할 수 있다.
    5. old + new => brand new
  5. 계층적 해싱
    1. 두 해시값에 결합 해싱을 적용한다. 그러면 최상위에 단일 해시값을 가지는 작은 계층이 형성된다.
    2. 결합 해싱과 유사하게 데이터 묶음에서 단일 해시값을 얻고자 하는 아이디어를 가지고 있다.
    3. 길이가 매번 변하는 입력이 아니라 늘 일정한 길이의 해시값을 합치기 때문에 효율적이다.
    4. 매 단계에서 오직 2개의 해시값만 결합한다.

11. 해시값은 어디서 어떻게 사용될까?

1. 데이터 비교

  • 목표: 데이터의 크기나 내용과 상관없이 오직 숫자 두 개만 대조해서 쉽게 비교한다.
  • 아이디어: 데이터 내용 전체를 일일이 비교하는 대신 암호화된 해시값을 비교한다.
  • 작동 원리: 비교하려는 모든 데이터의 암호화 해시값을 계산한 다음 서로 비교한다. 해시값이 다르면 비교 데이터도 다르고, 해시값이 동일하면 입력 데이터가 동일한 것이다.
  • 작동하는 이유: 암호화 해시값을 통해 데이터를 비교할 수 있는 암호화 해시 함수의 충돌 회피 성질 때문.

2. 데이터의 변경 감지

  • 목표: 데이터가 일정 시간이 경과되었거나 타인에게 전송한 후, 또는 데이터베이스에 저장한 후 변경되었는지 확인한다.
  • 아이디어: 과거에 기록해 둔 암호화 해시값과 검사하려는 데이터에서 새로 생성한 암호화 해시값을 서로 비교하여 변경되었는지 알아낸다. 해시값이 동일하면 데이터가 변경되지 않은 것이다.
  • 작동 원리: 변경되면 안되는 데이터의 암호화 해시값을 만들어두고, 데이터가 변경되었는지 확인이 필요해질 때 데이터의 암호화 해시값을 다시 생성한다. 그리고, 새로운 해시값과 이전의 해시값을 비교한다. 데이터 전송 전에 해시값을 생성한 후, 수신한 사람이 새로 해시값을 생성해서 그 두 값을 비교하면 전송 도중에 데이터가 변경되었는지 여부를 확인할 수 있다.
  • 작동하는 이유: 데이터의 변경 감지는 어떤 이벤트 전후의 해시값 비교를 통해 이루어지고, 암호화 해시 함수의 충돌 회피 성질 때문에 가능하다.

3. 변경-감지 방식의 데이터 참조

블록체인은 해시 참조에 크게 의존하기 때문에, 해시 참조를 꼭 이해해야 한다.

  • 목표: 어딘가에 저정된 데이터를 참조하여 데이터가 변경되지 않았다는 것을 보장한다.
  • 아이디어:
    • 데이터와 그 데이터가 저장된 장소 정보를 결합하여 해시값으로 암호화한다. 데이터가 변경되면 데이터와 저장 장소에 대한 정보가 일치하지 않아 유효하지 않은 참조가 된다.
    • 기술적인 오류나 누군가의 고의로 인해 사용자도 모르게 참조 데이터가 변경되었을 때 원본 데이터를 추출하지 못하도록 보호한다.
    • 해시 참조는 한번 생성된 이후 절대 변경되어서는 안되는 데이터에 사용한다.
  • 작동 원리:
    • 컴퓨터 프로그램은 데이터가 저장된 장소를 기억했다가 나중에 추출하기 위해 참조값을 사용하는데, 해시 참조는 참조값으로 암호화 해시값을 활용한다.
    • 해시 참조로 참조 데이터가 만들어진 뒤로 데이터가 변경되었는지 여부를 검증한다. 참조한 데이터가 변경되었다면 원래 있던 참조값으로 더이상 데이터를 추출할 수 없기 때문이다.
  • 작동하는 이유: 암호화 해시값을 활용하는 것이 핵심이다. 해시값은 고유한 지문과 같은 것이므로 서로 다른 데이터 조각들이 동일한 해시값을 가질 가능성은 극히 드물고, 참조가 깨졌다면 데이터가 변경되었다는 증거가 된다.

4. 변경-감지 방식으로 데이터 저장

  • 목표: 변경되어서는 안되는 방대한 데이터, 즉 트랜잭션 데이터를 저장하고, 어떠한 변경도 빠르고 손쉽게 발견할 수 있다.
  • 아이디어:
    • 데이터를 저장할 때 다른 데이터를 가리키는 해시 참조를 함께 저장할 수 있는데, 가리킨 데이터가 또 다른 데이터를 가리키는 해시 참조와 함께 저장하는 방식으로 연속적으로 긴 체인을 형성할 수 있다.
    • 어느 한 데이터라도 해시 참조가 변경이 되면 전체 해시 참조가 손상되고 이것이 데이터가 변경되었다는 증거가 된다.
  • 작동 원리:
      1. 체인 방식
      • 연결 리스트(linked list)라 불리고, 각 데이터가 가른 데이터의 해시 참조를 가지는 구조.
      • 데이터가 순차적으로 나타날 때 유용하다.
      • 가장 최근에 추가된 데이터를 참조하는 해시 참조를 헤드(head)라 부르고, 헤드만 있으면 체인으로 연결되어 있는 전체 데이터에 대해 역순으로 모두 접근할 수 있다.
      1. 트리 방식
      • 머클 트리(merkle tree)라 불리고, 해시 참조와 트랜잭션 데이터가 트리 형태로 연결되어 있다.
      • 같은 시각에 존재하는 모든 데이터를 한데 묶어 단일 해시 참조로 접근하고자 할 때 유용하다.
      • 최초의 트랜잭션 데이터에서 시작하여 각각에 대한 해시 참조를 생성하고, 각각의 해시참조가 둘씩 쌍을 이루게 한 후, 각 해시 참조 쌍을 가리키는 해시 참조를 또 생성하고, 이런 과정을 단일 해시 참조만 남을 때 까지 반복한다.
      • 최종적으로 남은 단일 해시 참조는 머클 트리의 루트라 부른다.
  • 작동하는 이유: 데이터와 해시 참조를 연결하여 결합하므로 변경-감지 방식으로 데이터를 저장할 수 있다. 그러므로 이 구조에서 손상된 참조가 있다면 데이터가 변경되었다는 증거가 된다.

5. 시간-소모적 계산량 유발

  • 목표: 해시값이 컴퓨터끼리 퍼즐 대결을 하는 데 사용될 수 있고, 컴퓨터의 계산 자원을 사용해야만 해결할 수 있는 퍼즐이 필요할 때가 있는데, 이 퍼즐을 푸는 유일한 방법은 오로지 엄청난 양의 컴퓨터 계산 자원에 의존하는 것뿐이어야 한다. 해시값의 이런 용도가 블록체인의 가장 중요한 개념 중 하나이다. (비트코인을 캔다는 의미의 ‘채굴’은 블록을 만드는 행위이고, 직접 새 블록을 만들려면 반드시 해시 퍼즐을 풀어야 한다.)
  • 아이디어: 비밀번호를 정확히 눌러야만 열리는 특수 자물쇠처럼 비밀번호를 알 때까지 가능한 모든 수의 조합을 반복해서 시도하는 방식이다. 해시 퍼즐은 오직 시행착오로만 해결할 수 있다.
  • 작동 원리: 해시 퍼즐의 요소.

    • 변경되면 안 되는 주어진 데이터
    • 자유롭게 변경 가능한 데이터, 난스(nonce)
    • 적용할 해시 함수
    • 결합 해싱의 해시값에 주어진 제약 조건, 난이도(difficulty level)

      데이터와 난스에 결합 해싱을 적용해 도출한 결과 해시값이 주어진 조건을 만족해야 한다.

      • 난스를 추측하고 데이터와 결합해 해시 함수를 사용해 해시값을 계산한 후 주어진 제약조건에 따라 결과 해시값을 평가한다.
      • 해시값이 제약조건을 만족하면 퍼즐이 풀린다. 이렇게 어떤 난스가 데이터와 결합해 생성한 해시값이 제약조건을 만족했을 때 그 난스를 해답이라 부른다.
      • 해시 퍼즐을 해결했다면 항상 그 특정 난스(해답)을 보여줘야 한다.
    • 해시 퍼즐의 난이도
      • 해시값이 특정 제약조건을 만족시키는 것이 해시 퍼즐의 핵심
      • 해시 퍼즐에 사용하는 조건은 임의로 만들어서 안되고 표준화되어 컴퓨터끼리 서로 시합할 수 있어야 한다.
      • 해시 퍼즐에서 제약조건을 난이도라 부른다.
      • 난이도의 숫자는 해시값의 맨 앞 자리부터 최소 하나 이상의 0으로 채워진다. (난이도 10은 해시값의 맨 앞자리부터 연속된 10자리 이상이 0이어야 한다는 뜻이다.)
  • 작동하는 이유: 해시 퍼즐은 해시 함수가 일방향 함수라는 성질에 전적으로 의존해 작동하기 때문에 제약조건을 연구하여 역함수로 해시 퍼즐을 해결하는 것은 불가하다.


References
[블록체인 무엇인가?] 다니엘 드레셔 지음