안녕하세요. 어미새입니다.



이번 포스팅에서는 지난 시간에 이어서 블록헤더 정보인 '머클 루트'에 대해 알아보도록하겠습니다. 머클 루트의 값은 어떻게 생성되는지, 예제를 통해서 검증하는 시간을 갖도록 하겠습니다.

이번 포스팅을 이해하기 위해서는 반드시 해시 함수에 대한 개념이 필요하며, 해시 함수에 대해서 잘 모르시는 분은 아래의 링크를 통해 먼저 해시 함수에 관한 내용을 읽어보시길 바랍니다.



'머클트리(Merkle Tree)' 와 '머클루트(Merkle Root)'


'머클트리(Merkle Tree)' 혹은 '해시트리(Hash Tree)'라는 데이터 구조는 Ralph Merkle이라는 사람이 1979년에 특허를 낸 개념입니다. 머클 트리의 목적은 어떤 블록의 데이터가 분리돼서 전달 될 수 있도록 하는것이며, 블록의 용량을 효율적으로 활용하수 있는 데이터 구조를 가지고 있습니다. 해시 함수의 특징으로 머클 트리 하위 노드들의 해시 값은 상위 노드에 영향을 주며, 어떤 악의적인 유저가 머클 트리 최하위에 있는 트랜잭션 정보를 가짜로 바꿔치기 하면 상위 부모들의 해시 값이 변경되고, 머클 루트 값 또한 변경됩니다. 머클 루트 정보가 변경될 경우 블록 해시 정보 또한 변경되어 해당 블록은 기존의 블록과 전혀 다른 블록으로 인식됩니다.


즉, 머클트리의 목적은 데이터의 간편하고 확실한 인증을 위해 사용합니다.


'머클루트(Merkle Root)'란 블록체인의 원소역할을 수행하는 블록의 바디부분에 저장된 트랜잭션들을 머클 트리한 최종 결과 값입니다.



블록의 구조는 크게 블록 헤더와, 블록 바디 정보로 구성되며, 블록의 바디 정보는 트랜잭션, 즉 거래 정보로 구성된다고 설명해드렸습니다. 블록의 바디 정보에 저장된 트랜잭션의 정보들이 유효한지 머클 트리를 통해 검사할 수 있습니다. 그럼 머클 트리는 어떻게 구성되고 최종적으로 머클 루트는 어떻게 만들어질까요?


머클 루트 연산 원리.


  1. 최초 데이터를 SHA256 형태의 해시값으로 변환한다.

  2. 가장 가까운 노드 2개를 한쌍으로 묶어 합친 후 해시값으로 변환한다.

  3. 계속해서 해시값으로 변환하여 마지막 하나가 남을때까지 이 과정을 반복한다.


<br/>

위의 그림처럼 각 해시된 결과값 TXID의 노드를 2개씩 짝지어 합친 후 다시 SHA256 함수를 통해 해시 값으로 변환하고 최종적으로 하나의 결과 값이 나올때 까지 이 과정을 계속해서 반복합니다. 최종적으로 남은 하나의 노드 값이 '머클루트' 결과 값이 되는겁니다!


다시 한번 정리해보면 아래와 같습니다.


  1. 블록헤더의 머클루트 값은 블록바디의 거래내역 정보인 TXID의 해시트리 결과 값이다.

  2. 머클루트의 역할은 각 거래 정보의(TXID)의 정보들이 변경되었는지에 대한 유효성을 검사하는 역할을 수행한다.

  3. 머클루트의 결과 값을 통해 블록 해시의 정보가 구성됨으로 그 블록의 유효성 또한 검사할 수 있다.

<

머클 루트 연산 과정


비트코인의 블록정보를 쉽게 볼 수 있도록 제공해주는 사이트인 '블록체인 인포' (https://blockchain.info/ko) 라는 사이트를 통해 블록 정보를 확인해보겠습니다. 제가 보고 있는 현 시점에서 블록체인 인포 사이트의 최신블록의 정보는 아래의 그림과 같이 #508186 입니다.



최신 블록인 #508186을 선택(클릭)하여 해당 블록의 정보를 자세히 살펴보겠습니다.



비트코인의 블록 정보를 확인해 볼 수 가 있습니다. 각 해당 요소들에 대한 설명에 대해서는 추후 계속적인 포스팅에 대해서 설명해 드리겠습니다. 이번 시간은 머클 루트 값을 구하는 과정을 테스트할 예정이기 때문에 다수의 거래정보가 있는 거래 리스트를 확인해 보겠습니다.



최신 블록은 위의 그림과 같이 정말 많은 거래 내역이 있기때문에, 테스트에 적합하지 않습니다. 거래 내역이 2건 내지 4건인 블록이 적당한 수치인것 같습니다. 마침 #99997번째 블록의 거래내역이 2건이기 때문에 해당 블록으로 테스트를 진행해보겠습니다. 해당 블록의 머클 루트와 거래정보는 아래의 그림과 같습니다.




블록#99997의 머클 루트는 5140e5972f672bf8e81bc189894c55a410723b095716eaeec845490aed785f0e 이며, 거래 내역은 아래의 그림과 같습니다.



그럼 이제 거래 내역의 TXID 정보를 합산한 후 SHA256으로 변환하는 코드를 짜고 그 결과 값을 확인해 보겠습니다.




결과는 위의 그림처럼.. 이상한 결과가 나오고 있습니다... 여러분은 알고 계셨나요?? 머클루트는 이렇게 구하는게 아니라는걸요??


머클루트의 결과 값을 정확하게 구하기 위해서는 엔디안이라는 개념이 필요합니다, 컴퓨터에서 어떤 크기의 데이터를 메모리에 저장할 때 바이트 단위로 나누어 저장하며, CPU 아키텍처에 따라 바이트 저장 순서가 달라질 수 있기 때문에 리틀-엔디안빅-엔디안 방식으로 나누어 질 수 있습니다.


쉽게 생각해서 앞선 TXID를 컴퓨터가 이해하기 쉬운 형태로 변환한 후, 합산해야합니다. 우선 정확하게 머클 루트를 구하는 예제 코드를 보여드리겠습니다.



위의 예제 코드의 1번의 과정처럼 문자열을 스왑해주고, 2번의 과정으로 스왑된 데이터를 바이너리로 형태로 변경해야합니다. 그리고 이렇게 만들어진 데이터 TXID 1번과, TXID 2번의 문자열을 합산하는것이 아니라 이어 붙여준 후 해시 함수를 2번 연산해 주어야합니다. 이렇게 해시 함수를 통해 얻은 결과 값을 4번과정과 같이 다시 역으로 꺼내주면 정확한 머클 루트 값을 구할 수 있습니다.


위의 예제 소스의 결과는 아래와 같습니다.



이렇게 해서 블록의 바디 정보인 TXID 정보를 토대로 머클 루트 결과 값을 만드는 과정을 확인해볼 수 있었습니다. 다음 포스팅에서는 비트코인의 블록헤더 정보는 무엇이고, 어떻게 값을 구하는지에 대해 알아보도록 하겠습니다.


추가로 머클 루트 구하는 방법을 테스트해보고 싶으신분은 아래의 링크를 통해 풀 코드를 확인해보시면 좋겠습니다. 해당 코드는 TXID의 양이 많더라도, 루프 문을 통하여 값을 구할 수 있도록 짜여진 코드입니다.


지금까지 긴 글 읽어주셔서 감사합니다!


[참고자료]


https://steemit.com/kr/@jayground8/hashmerkleroothttps://steemit.com/kr/@jsralph/merkle-treeshttps://steemit.com/kr/@twinbraid/5uzvbu-02http://twinbraid.blogspot.kr/2017/11/blog-post.htmlhttps://blockchain.info/ko/block/

안녕하세요. 어미새입니다.



비트코인의 블록체인 구조를 이해하기 위해서는 해시 함수에 대한 개념정리가 먼저 필요합니다.


해시함수

  1. 해시함수는 임이의 길이를 갖는 메시지를 입력받아 고정된 길이의 해시값을 출력하는 함수이다.

  2. 해시 함수를 사용하는 목적은 메시지의 오류나 변조를 탐기 위해, 즉 데이터의 무결성을 제공하기 위해 사용한다.


해시함수의 특징

  1. 어떤 입력 값에도 항상 고정된 길이의 해시 값을 출력한다.

  2. 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.(눈사태 효과)

  3. 출력된 결과 값을 토대로 입력 값을 유추할 수 없다.

  4. 입력 값은 항상 동일한 해시 값을 출력한다.


해시 함수에 대한 보다 자세한 내용을 원하시는 분은 이전에 작선 포스팅을 참조하시면 좋을것 같습니다. (http://withbabybird.tistory.com/6)


본 포스팅에서는 비트코인의 블록체인 구성 요서에 대한 간략한 개요정도만 설명할 예정이며, 추후 각 구성요서에 대한 개별 포스팅을 진해하여 자세한 내용을 다루도록하겠습니다.


블록체인(Block-chain)


블록체인 기술은 블록과 블록을 체인형태(링크드 리스트)로 연결한 자료구조를 사용합니다. 블록체인 기술은 분산 컴퓨팅 기반의 데이터 위변조 방지 기술로써, 데이터를 '블록' 단위로 관리합니다. 블록체인 기술은 분산되고, 독립적인 데이터 관리를 가능하도록 도와주며, 네트워크에 연결된 모든 사용자들이 블록체인 데이터의 변경 결과를 열람할 수 있으며, 합이 알고리즘에 의해 새롭게 추가되는 블록의 검증이 이루어지고, 검증된 블록만들 기존의 블록체인에 연결하여 데이터 위변조를 방지할 수 있게됩니다. 즉 블록체인 기술은 분산되고 독립적인 공통 장부(원장, Ledger) 관리 기술이라고 할 수 있습니다.


비트코인 시스템은 블록체인 기술을 통해 순수하게 사용자들로만 이루어진, 그리고 조작이나 통제가 불가능한 금융 시스템을 만들 수 있게 되었습니다.


'블록(Block)'


블록은 블록체인의 원소 개념으로, 다수의 트랜잭션(거래 정보)를 가지고 있으며, 데이터 베이스(블록 체인)에 저장하기 위한 데이터 묶음(트랜잭션 묶음)이라고 생각하시면 좋을것 같습니다. 블록의 이름은 Height(높이)라는 용어로 불리며, 블록체인을 길게 이어진 수평선으로 보는 것이 아니라 한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height(높이)라는 말을 쓴다고 합니다. 하지만 이 이름은 정확한 블록의 이름이 아니며, 블록의 정확한 이름은 블록의 식별자 역할을 수행하는 블록의 해시 값입니다.

비트코인 시스템에 적용된 블록체인의 '블록'은 평균 10분에 한번식 생성될 수 있도록 설게되었으며, 블록의 크기는 1MB로 약 1800 - 4200건의 거래내역을 담을 수 있습니다. 비트코인의 블록체인에 저장되는 '블록'은 크게 블록 헤더정보와, 블록 바디정보로 구분할수있습니다.

블록 헤더 : 블록 헤더는 전반적인 블록의 상태 정보를 나타내며, 버전(Version), 이전 블록 해시(Previous block hash), 머클 루트(Merkle Root), 타임(Time), 난이도 목표(bits), 논스(Nonce) 정보로 구성됩니다.

블록 바디 : 블록 바디에는 다수의 거래 정보(트랜잭션)로 구성됩니다.



'블록 해시(Hash of the block)'


블록 해시는 블록의 식별자 역할을 수행하며, 블록 헤더 정보인 버전, 이전 블록 해시, 머클 루트, 타임, bits, 논스정보를 각 표현식에 맞게 변경한 후 합산하여 SHA256 해시함수를 통해 출력된 결과 값입니다,



'버전'


비트코인 네트워크의 버전 정보를 의미합니다. 해당 블록이 생성되는 시점에서 네트워크에서 사용되었던 버전 정보를 기록합니다.


'이전 블록 해시(Previousblockhash)'


블록체인의 자료구조는 링크트 리스트 형태로 구성됩니다. 블록이 생성되는 시점에서 이전 블록의 정보를 참조하여 블록이 체인 형태로 연결될 수 있도록 도와주는 역할을 수행합니다.



위의 그림처럼 각 블록의 헤더 정보에는 이전 블록의 해시정보를 가지고 있습니다. 각 블록이 이전 블록의 해시 정보를 가지고 있기 때문에 각 블록이 서로 서로 연결되어 있는 구조가 될 수 있습니다.


'머클 루트(Merkle Root)'


'머클 루트'는 블록의 바디 부분에 저장된 트랜잭션(거래 정보) 들의 해시 트리라고 생각하시면 되겠습니다. 각 트랜잭션과 가까운 노드 끼리 쌍을 지어 해시 값을 구하여 최종적으로 구해진 해시 값이 머클루트 해시 값이 되겠습니다.

머클루트의 역할은 아래와 같습니다.

  1. '머클루트'(머클해시)값을 통해 단일 블록 내에 존재하는 트랜잭션의 무결성을 검증할 수 있다.

  2. '머클루트'(머클해시)값을 이용하여 블록의 해시 값을 생성하였기 때문에 블록의 해시의 무결성도 함께 검증할 수 있다.

쉽게 말해 해당 블록이 유효한지에 대한 무결성을 검증하기 위한 요소가 머클루트 혹은 머클해시라는 구성요소입니다.


'타임(Time)'


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


'bits'


bits는 난이도 해시 목표 값을 의미하는 지표입니다. 이 부분에 대해서는 마이닝 즉 채굴이 어떻게 이루어지는지에 대한 포스팅에서 자세히 다루도록 하겠습니다.


'Nonce'


난스는 블록을 만드는 과정에서 해시 값을 구할 때 필요한 재료 역할을 수행합니다. 이 부분에 대해서도 채굴과 관련된 포스팅에서 자세히 다루도록 하겠습니다.


이것으로 비트코인의 블록체인 기술 및 구성요소에 대한 시간을 마치도록 하겠습니다. 각 구성요소에 대한 자세한 내용은 추후 개별 포스팅을 통해 심도있게 다루겠습니다.

긴글 읽어주셔서 정말 감사합니다!


[참고 사이트]


https://steemit.com/kr/@jsralph/merkle-trees

https://steemit.com/kr/@feyee95/1-1

https://commons.wikimedia.org/wiki/File:Bitcoin_block_structure.svghttp://hanaloum.blogspot.kr/2014/06/block-1_9584.htmlhttps://www.slideshare.net/YechanAn/blockchain-77203988http://blog.naver.com/PostView.nhn?blogId=renucs&logNo=220958282185&parentCategoryNo=&categoryNo=36&viewDate=&isShowPopularPosts=false&from=postViewhttps://homoefficio.github.io/2016/01/23/BlockChain-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90/http://privacy.jiransoft.co.kr/%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8%EA%B3%BC-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8%EA%B8%B0%EC%88%A0/https://brunch.co.kr/@ppineapple17/1


안녕하세요. 어미새입니다.


이전 블록체인 포스팅에서 합의 문제, 합의 알고리즘에 대해서 알아봤습니다. 블록체인에서 합의 알고리즘이란 어떤 방식으로 블록을 생성해 낼 것이며, 어떤 블록이 '진짜'인지 판별하기 위한 알고리즘이라고 설명해드렸습니다. 좀 더 구체적으로 설명을 해드리자면 블록체인을 조작할 수 없어야 하고어떤 블록이 유효한지 확인할 수 있는 메커니즘이 필요합니다. 이러한 과정을 검증하는 메커니즘이 합의 프로토콜, 합의 알고리즘이라고 생각하시면 됩니다. 또한 합의 알고리즘은두 개의 유효한 블록체인이 생성됐을 때 하나를 선택하는 방법도 필요합니다.


이번 포스팅에서는 '해시함수'란 무엇이고 블록체인에서 '해시함수'는 어떤 역할을 수행하는지에 대해 알아보도록 하겠습니다.('해시함수'의 특징 및 역할은 추후 블록 구성요소에 대해 학습하기 위해서 반드시 개념을 알고 넘어가야합니다.)


해시 함수란 무엇인가?


해시함수는 메시지의 오류나 변조를 쉽고 빠르게 탐지할 수 있습니다. 또한, 데이터의 무결성을 제공하기 위해 사용되며, 매우 빠른 데이터 검색을 위한 소프트웨어에서도 널리 사용됩니다. 비트코인에서는 SHA-256 방식의 해시 함수를 사용하고 있습니다. 해시함수는 아래와 같은 특징을 가지고 있습니다.


해시 함수의 특징


  1. 어떤 입력 값에도 항상 고정된 길이의 해시 값을 출력한다.

  2. 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.(눈사태 효과)

  3. 출력된 결과 값을 토대로 입력 값을 유추할 수 없다.

  4. 입력 값은 항상 동일한 해시 값을 출력한다.


SHA(Secure Hash Algorithm)


해시(Hash)의 종류에는 MD 알고리즘 및 SHA 알고리즘이 있습니다. 이번 포스팅에서는 비트코인에서 사용되는 알고리즘인 SHA256 함수에 대해서 알아보도록 하겠습니다. SHA(Secure Hash Algorithm)알고리즘은 미국 NSA에 의해 만들어졌습니다. 160비트의 값을 생성하는 해시 함수로, MD4가 발전한 형태입니다. MD5보다 조금 느리지만 좀 더 안전한 것으로 알려져 있으며, SHA에 입력하는 데이터는 512비트 크기의 블록이며 알고리즘의 동작원리는 아래 그림과 같습니다.



SHA 알고리즘은 크게 SHA-1과 SHA-2로 나눌 수 있으며 종류에 따른 성능은 아래의 표와 같습니다.



간다한 실습을 통해 해시 함수의 특징을 이해 해보도록 하겠습니다. 먼저 아래의 사이트는 입력 값을 SHA256 방식으로 변환해주는 사이트입니다.


사이트에 접속하시면 아래의 그림과 같은 화면이 있습니다, 상단의 입력박스에 해시하고자하는 입력 값을 누른 후 파란색 버튼인 'SHA256 해시를 생성!' 버튼을 누르면 입력값을 해시 값으로 변경하여 결과 값이 출력됩니다.



위의 사이트를 활용하여 앞서 설명한 해시 함수의 특징을 살펴보겠습니다.


  1. 어떤 입력 값에도 항상 고정된 길이의 해시값을 출력한다.

위의 특징은 다시 말해서 입력 값의 길이와 상관 없이, 즉 책 한권의 분량의 데이터를 넣어도, 몇 글자 되지 않은 작을 글자를 넣어도 같은 결과가 나온다는 의미입니다. 먼저 어미새라는 짧은 문자열을 입력한 후 결과 값을 확인해 보겠습니다.



위의 그림과 같이 결과 값은 256비트(32바이트) 데이터의 길이로 결과 값이 출력되는 것을 확인 할 수 있었습니다. 그럼 이번에는 아주 긴 문자열을 넣어보도록 하겠습니다.



위의 그림과 같이 입력 값의 길이가 길어도 고정된 길이인 256비트의 길이로 결과 값이 출력되는 것을 확인할 수 있습니다. 즉 입력 길이에 상관없이 항상 고정된 문자열의 길이를 반환하는 특징을 확인할 수 있습니다. 그렇다면 이러한 특징을 어떻게 활용할 수 있을까요? 이 부분에 대한 설명을 하기 위해서는 먼저 해시 함수의 두 번째 특징인 눈사태 효과에 대한 설명이 필요합니다.


2.눈사태 효과 : 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다.


눈 사태 효과는, 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력하는 특징입니다. 먼저 Hello word라는 단어를 입력하고 결과 값을 출력해보겠습니다.



Hello word의 결과 값은 위의 그림과 같이 256비트의 고정된 길이의 결과 값 AEA1D1146A00E1C55E49C7837C224ECFB76CA0337FD4BB6DC09E892CA0190119이 출력되는것을 확인할 수 있었습니다. 이번에는 마지막에 s를 추가하여 Hello words를 입력하고 결과 값을 출력해보겠습니다.



Hello wordHello words는 단어 한글자 차이지만 아래처럼 전혀 다른 결과 값이 출력되는것을 확인할 수 있었습니다.

1번 결과 : AEA1D1146A00E1C55E49C7837C224ECFB76CA0337FD4BB6DC09E892CA0190119

2번 결과 : 1FCBB61355A529153565A480CA98017D9FD97DD38B0C2CBE3EA56E68F3BC8745


입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값이 출력됩니다, 입력 값의 일부만 변경되었을 뿐인데 이렇게 전혀 다른 값으로 출력 된다면 출력된 결과 값을 토대로 입력값을 유추하는건 불가능할겁니다.


그럼 아주 방대한 데이터의 내용이 변경되었는지 확인하는 과정이 있다고 생각해봅시다. 데이터가 변경되었는지 한 글자 한 글자식 비교한다면 아주 오랜 시간이 소요될겁니다. 하지만 해시함수를 이용한다면 어떤 길이의 입력값이라도 256비트의 고정된 결과값을 출력할 것이고 입력값의 아주 일부만 변경되어도 전혀 다른 값이 출력되는 특징 때문에 데이터가 변경되었는지 쉽게 확인할 수 있습니다.


추가적으로 해시함수는 입력된 값이 같을 경우 항상 같은 결과 값을 출력해야합니다. 입력된 값은 같으나 다른 결과가 나온다면 데이터의 무결성을 검증할 수 없겠죠?

입력된 결과 값은 다르지만 같은 결과 값이 출력될 경우가 있습니다. (이련 경우는 아주~ 아주~~~ 희박하다고 합니다.) 입력 값이 다르지만 같은 결과 값이 출력되는 경우를 충돌이라고 표현하며, 충돌이 적은 해시함수가 좋은 해시함수가 되겠습니다.


이상으로 간단한 해시 함수의 정의와, 해시함수의 특징에 대해 알아봤습니다. 긴 글 읽어주셔서 감사합니다!



[참고 사이트]

https://blog.iwanhae.ga/introduction_of_bitcoin/

https://steemit.com/kr/@twinbraid/2b3hcu

http://www.convertstring.com/ko/Hash/SHA256

https://seed.kisa.or.kr/iwt/ko/intro/EgovHashFunction.do


탈중앙화 Application(DApp)


  1. 백엔드가 탈중앙화된 피어 투 피어(Peer-to-Peer) 네트워크에서 동작.

  2. 소스가 오픈 소스인 일종의 인터넷 애플리케이션.

  3. 어떠한 단일 노드도 탈중앙화 애플리케이션(DApp)에 대한 제어권을 가질 수 없음.


DApp은 기본적으로 피어 투 피어 네트워크에서 동작하기 때문에 인터넷에 연결된 어떤 컴퓨터라도 피어가 될 수있으므로 애플리케이션 데이터를 잘못된 값으로 변경하거나 다른 피어들과 올바르지 않은 정보를 공유하는 피어를 찾아내고 방지하는 것이 큰 도전 과제입니다.

피어가 발행한 정보가 올바른지 검증하기 위한 방법이 일종의 합의 프로토콜, 합의 알고리즘 입니다. 여기서 이야기하는 합의 프로토콜, 합의 알고리즘은 P2P 네트워크(분산시스템)의 신뢰도를 보장하기 위해서 나온 알고리즘이며, 합의 문제는 블록체인 나오기 전부터 존재하던 개념입니다. 그럼 가장먼저 합의 문제에 대해 간략하게 알아보도록 하겠습니다.


합의 문제(Consensus Problem)


P2P 네트워크와 같이 정보 도달에 시간차가 있는 네트워크에서 참가자가 하나의 결과에 대한 합의를 얻기 위한 알고리즘입니다.

예를 들어 분산 컴퓨팅으로 이루어진 비행기 예매 시스템에 합의 알고리즘이 없다고 가정해봅시다. 손님 A와 손님 B가 같은 자리 a를 동시에 예매했을 경우 합의 알고리즘이 없다면 들어온 시스템에 따라 자리 a를 예매한 사람이 달라지게 됩니다. 이런 시스템 오류와 무결성을 보장하기 위하여 합의 문제를 해결하는 합의 알고리즘이 생겨났습니다.



블록체인 합의 문제


전 재산 1,000원을 가지고 있는 A가 B와 C에게 동시에 1,000원을 송금한다는 메시지를 보냈을 경우 블록체인 시스템에서 합의를 하지 못하면 큰 문제가 생길 수 있습니다. 블록체인에서 합의 알고리즘이란 쉽게 말해 블록체인 상에서 의사결정 방식을 의미합니다.

예를 들어 A, B 채굴자가 동시에 블록을 생성했다면, 어느 블록이 진짜 블록이라고 부를 수 있을까? 만약 중앙집권적인 기관이었다면 전부 통제가 가능하기 때문에 두 개의 블록이 생성되지 않았을 뿐만 아니라 설사 생성된다 하더라도, 블록체인을 운영하는 중앙기구에서 어떤 블록이 진짜인지 선택하면 문제는 해결됩니다.

하지만 탈 중앙화된 블록체인에서는 해당 의사결정을 해 줄 사람이 없기 때문에 이를 결정할 어떤 과정이 필요한 것입니다. 이때 등장한 것이 바로 합의 알고리즘이라고 생각하시면 되겠습니다.

블록체인 기술에서 대표적으로 사용하는 합의 알고리즘에는 비트코엔이서 사용되는 PoW(Proof of Work), 이더리움이 지향하려고 하는 PoS(Proof of Stake), EOS에서 사용되는 DPoS(Delegated Proof of Stake)등이 있습니다.


긴글 읽어주셔서 감사합니다!



[자료 출처]https://blog.theloop.co.kr/category/%ED%95%A9%EC%9D%98/https://blog.naver.com/zeigal/221189671484https://bismart.com/en/best-text-analytics-systems/아이리포 - 블록체인 합의 알고리즘 편




 


안녕하세요. 어미새입니다.


이더리움 백서를 쉽게 이해할 수 있도록 풀어서 설명하는 연재물을 작성하고 있습니다. 지난 포스팅을 읽지 못하셨던분은 먼저 아래의 포스팅을 읽어보시는것을 추천드립니다.



Remind


비트코인 시스템은 이세상에 없던 기술들을 총 집합하여 탄생한것이 아니라 아주 오래전부터 그와 관련된 이론들과 논의들이 있었다는 내용과, 비트코인이 어떤 의미에서 혁신적이었는지에 대한 내용을 다뤘으며, 작업 증명 방식, 지분 증명 방식의 두가지 합의 알고리즘을 언급함으로써 이더리움에 시작은 작업 증명 방식으로 이루어지나 추후 지분 증명 방식으로 변화할것을 암시하였습니다.

또한, 기존의 비트코인 시스템에서 사용되는 '상태(State)'와 '상태 변환 함수(state transition function)'에 대한 개념에 대하여 먼저 설명한 후 이더리움에서는 이 부분을 어떻게 수정할지에 대한 내용을 다루게됩니다.


채굴


[출처 : 이더리움 백서(링크)]


앞서 언급한 내용들을 중앙 집권화된 서비스 방식으로 구현하자면 매우 간단한 일입니다. 그 이유는 중앙 서버에 상태 변화과정을 저장하고 관리하면 어렵지 않게 구현할 수 있습니다.

하지만 탈 중앙화된 통화 시스템을 구축하기 위해서는 분산 합의 과정이 필요하고, 네트워크가 정상적으로 유지될 수 있도록 도와주는 노드들이 필요합니다. 또한, 이 노드들은 "블록(blocks)"이라 불리는 트랜잭션 패키지를 계속적으로 생성하고 합의하는 역할을 수행해야합니다.

비트코인 네트워크는 약 10분에 한번식 하나의 블록을 생성하도록 계획되었고, 각 블록은 타임스탬프, 논스(nonce), 이전 블록에 대한 참조(이전 블록의 해시), 그리고 이전 블록 이후에 발생한 모든 트랜잭션의 목록을 포함합니다. 이 과정을 통해서 지속적으로 성장하는 블록체인이 생성되며, 비트코인 장부의 최신상태(state)를 나타내기 위해 지속적인 업데이트가 이루어져야합니다.


생성된 블록이 유효한지 아닌지를 확인하기 위한 알고리즘은 아래와 같습니다.


  1. 생성된 블록에 참조되는 이전 블록이 실제 존재하는 블록인지, 유효한지 확인한다.

  2. 타임 스탬프 값이 이전 블록의 타임스탬프 값보다 큰 값인지 확인한다, 만약 크다면 2시간 이내인지 확인한다.

  3. 작업증명(proof of work)이 유효한지 확인한다. (새로운 블록을 찾는 과정이 유효했는지에 대한 검증)

  4. S[0]를 이전 블록의 마지막 상태(state)가 되도록 설정한다.

  5. TXn개의 트랜잭션을 가지는, 블록의 트랜잭션 목록으로 가정한다. 폐구간 0...n-1의 모든 i에 대해, S[i+1] = APPLY(S[i], TX[i])집합 중 어느 하나라도 에러를 리턴하면 거짓(false)을 리턴하며 종료한다.

  6. 참(true)을 리턴하고, S[n]를 이 블록의 마지막 상태로 등록한다.


1 ~ 3번 과정은 새로운 블록에 대한 유효성 검증이며, 4 ~ 6번 과정은 지난 이더리움 백서 1편에서 언급한 비트코인의 상태 변화 시스템에 대한 내용입니다.

가장 최근의 블록의 상태 정보를 가져오고, 현재 블록에 있는 트랜잭션 목록들에 대한 유효성을 점검한 후 상태 정보를 업데이트한다고 생각하시면 쉬울것 같습니다. 이 과정이 이해가 되지 않으시다면 1편에서 설명한 상태 변화 시스템에 대한 내용을 다시 읽어보시면 좋을것 같습니다.


기본적으로 블록의 트랜잭션들은 유효한 상태변환을 진행해야합니다. 여기서 유심있게 살펴봐야하는점은 블록내에 어떠한 방법으로도 상태정보가 기록되지 않았다는 점을 주목해야합니다. 상태는 유효성을 검증하는 노드가 매번 계산해서 기억해야 하는 추상적(abstaction)인 개념이며, 이것은 원시 상태(genesis state), 즉 제네시스 블록으로 부터 현재 블록까지의 모든 트랜잭션을 순차적으로 적용함으로 계산할 수 있습니다.

채굴자(마이너)가 블록에 포함시키는 트랜잭션의 순서를 주목해보겠습니다. 만약 어떤 블록에 A와 B라는 트랜잭션이 있다고 가정해보겠습니다. 그리고 B의 트랜잭션은 A의 UTXO를 소비한다고 가정했을 경우 B는 A의 UTXO 정보가 필요하기 때문에 반드시 A의 트랜잭션이 먼저 블록에 담겨 있어야합니다. 만약 트랜잭션 A가 먼저 블록에 담겨 있지 않을 경우 B는 존재하지 않은 트랜잭션 A의 UTXO 정보를 사용하게됨으로 해당 블록의 유효성이 보장되지 않습니다. (즉 블록의 트랜잭션을 어떤순서로 담느냐에 따라 블록이 유효할수도, 유효하지 않을수도 있다는 의미입니다.)



 


블록 유효성 검증 알고리즘에서 "작업증명(proof of work)"의 조건은 256비트 숫자로 표현되는 블록의 이중-SHA256 해시 값이 동적으로 조정되는 목표값 보다 반드시 작아야 된다는 조건입니다. (비트코인 마이닝편 참조)

작업 증명의 목적은 블록 생성을 계산적으로 어렵게 만들어서 sybil 공격자들이 마음대로 전체 블록체인을 조작하는 것을 방지하기 위함입니다. SHA256 함수는 예측 불가능한 유사난수 함수(pseudorandom function)로 설계되어 있기 때문에 유효 블록을 생성하기 위한 유일한 방법은 블록 헤더의 논스(nonce) 값을 계속 증가시키면 블록 해시 값이 목표값 보다 작은지에 대한 검증을 반복하는 방법밖에 없습니다.

현재 목표 값인 2187(이더리움 백서 작성 시간 기준)에서 하나의 유효블록을 발견하기 위해서는 평균적으로 264번의 시도를 해야합니다. 네트워크는 평균적으로 10분마다 새로운 블록이 생성될 수 있도록 2016개의 블록마다 목표 값을 변경하게됩니다.

채굴자들은 이러한 연산 작업에 대한 보상으로 25 BTC(이더리움 백서 작성 시간 기준)를 획득할 자격을 가지게 되며, 출력 금액보다 입력 금액이 큰 트랜잭션이 있다면 그 차액을 "트랜잭션 수수료(transaction fee)"로 얻게 됩니다. 이러한 과정이 비트코인이 발행되는 유일한 방법이며, 원시 상태(genesis state)에는 아무런 코인이 포함되어 있지 않습니다.

채굴 목적에 대한 이해를 위해 악의적인 공격자가 있을 떄 어떤 일이 발생하는지 생각해보겠습니다. 일반적으로 비트코인의 뼈대를 이루는 암호기법은 안전한 것으로 알려져 있습니다. 그렇기 때문에 공격자는 비트코인 시스템에서 암호 기법에 의해 직접적으로 보호되지 않는 부분인 '트랜잭션 순서'를 공격 목표로 잡을것입니다.


  1. 어떤 상품(가급적이면 바로 전달되는 디지털 상품)을 구매하기 위해 판매자에게 100 BTC를 지불한다.

  2. 상품이 전송되기를 기다린다.

  3. 판매자에게 지불한 것과 같은 100 BTC를 공격자 자신에게 보내는 트랜잭션을 생성한다.(이중지불 시도)

  4. 비트코인 네트워크가, 공격자 자신에게 보내는 트랜잭션이 판매자에게 지불하는 트랜잭션보다 먼저 수행된 것으로 인식하도록 한다.


1번 과정이 발생하고 몇 분 후에 몇몇 채굴자들이 해당 트랜잭션을 블록에 포함하게됩니다. 그리고 이 블록 번호를 270000 이라고 가정해보겠습니다. 블록은 10분에 한번식 생성되기 때문에 대략 1시간 후에는 이 블록 다음의 체인에 5개의 블록들이 추가될 것입니다. 트랜잭션이 포함된 블록 이후 5개의 블록들이 연결되었기 때문에 컨펌(confriming)되었다고 생각할 수 있으며, 이 시점에서 판매자는 BTC 지불이 완료된 것으로 판단하고 상품을 전송하게됩니다. (상품은 디지털 상품으로 가정하에 전송하는 순간 상품을 받았다고 가정합니다.)

이제 공격자는 판매자에게 보낸 것과 동일한 100 BTC를 공격자 자신에게 보내는 트랜잭션을 생성합니다. 이때 만약 공격자가 그냥 단순하게 트랜잭션을 시도한다면, 채굴자들이 채굴자들이 APPLY(S,TX)를 실행하여 해당 트랜잭션(TX)은 더이상 존재하지 않는 UTXO를 소비하는 행위인것을 알게되고, 해당 트랜잭션은 진행되지 않습니다.

그렇기 때문에, 공격자는 판매자에게 보낸 시점의 이전 블록인 269999 블록으로 되돌아가 공격자 자신에게 보내는 트랜잭션을 포함한 270000 블록을 생성하여, 블록체인 "분기점(fork)"을 생성합니다.

비트코인 네트워크는 가장 긴 블록체인을 참으로 인식하기 때문에 메인 블록체인에 이미 연결된 270005번 블록까지 조작해야합니다. 그렇기 때문에 공격자는 자신의 체인을 가장 길게 만들기 위해서 네트워크에 연결된 다른 노드들의 계산능력 조합보다 더 큰 계산 능력을 가져야합니다. (이를 51% attack이라 한다.)


Think


오늘 이더리움 백서 번역본에서는 비트코인의 채굴 방식과, 공격 방식에 대한 설명 부분에 대해서 다뤘으며, 백서 후반부에서 이더리움에서는 어떠한 방식의 채굴 방식을 선택할 것이고 공격자의 공격을 어떻게 막을것인지에 대한 이야기가 진행됩니다.

지난 포스팅에서도 잠간 언급되었지만, 탈 중앙화된 암호화폐는 어느 한순간에 나온 개념이 아니며, 아주 오래전부터 연구되어왔던 내용들을 비트코인에서 처음으로 구현하게된것입니다. 그렇기 때문에 블록체인의 개념을 한단어로 정의하기 어렵고, 내용이 방대하여 학습에 어려움이 있는것 같습니다.

하지만 하나식 천천히 반복적으로 뜯어서 학습을 진행하게되면 이해하는데 어려움이 없을것이라고 생각합니다. 이더리움에 대한 명확한 이해를 하기 위해서는 필수적으로 비트코인에 대한 이해가 선행되어야한다고 생각합니다. 오늘 포스팅에서 언급된 내용들에 대한 내용들은 비트코인 포스팅에서 설명한 내용들과 상당히 겹치는 부분들이 많습니다. 혹시 오늘 포스팅이 이해가 되지 않으셨던분들은 비트코인 마이닝 과정, UTXO, 51% acttact에 대한 내용들을 읽어보시면 좋을것 같아서 링크를 남겨두도록 하겠습니다.




오늘은 이더리움 백서부분에 대한 해석을 여기까지만 하도록 하겠습니다, 본격적인 이더리움에 대한 설명은 머클트리, 블록체인 기술을 이용한 사례, 스크립팅에 대한 챕터 이후 설명이 시작됩니다.

조금은 이전 비트코인 포스팅과 겹치는 부분이 있어서 이더리움을 공부하기 위해 들어오신분들에겐 답답한 마음이 생길 수 있을것 같으나, 비트코인을 변형하여 만들어진 플랫폼이다보니 그 만큼 비트코인에 대한 설명이 중요하다고 생각합니다. (백서의 흐름대로 학습해야지 나중에 더욱더 이해하기 쉽다고 생각합니다.)

혹시 이더리움 백서를 먼저 읽어보고 싶은 분을 위해 이더리움 백서 링크를 첨부해 드립니다.



 

이상 긴 글 읽어주셔서 감사합니다!



[참고문헌]

https://github.com/ethereum/wiki/wiki/%5BKorean%5D-White-Paper#%EC%83%81%ED%83%9C%EB%B3%80%ED%99%98%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9C%BC%EB%A1%9C%EC%84%9C%EC%9D%98-%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8bitcoin-as-a-state-transition-system

https://github.com/ethereum/wiki/wiki/White-Paper

'이더리움 > 이더리움(백서)' 카테고리의 다른 글

이더리움 백서(6편)  (0) 2018.04.12
이더리움 백서(5편)  (0) 2018.04.11
이더리움 백서(3편)  (0) 2018.04.10
이더리움 백서(1편)  (0) 2018.04.06
이더리움 개요  (0) 2018.04.05





안녕하세요. 어미새입니다.


지난 이더리움 포스팅에서는 비탈릭 부테린에 대한 인물 소개와 이더리움에 대한 간략한 개요를 살펴봤습니다. 혹시 못보셨던분들은 아래의 링크를 통해 지난 포스팅을 먼저 읽어보시는것을 추천드립니다.



이번 포스팅에서는 지난시간에 예고해 드린것처럼 이더리움의 백서 도입부인 역사파트의 내용을 재해석 하는 시간을 가지도록 하겠습니다. 원문 내용을 축약하여 쉽게 풀어서 설명하고, 이해를 돕기 위해 보충해야되는 부분을 채워가는 형식으로 진행하도록하겠습니다. 만약 이더리움 백서의 원본을 읽고 싶으신분들은 아래의 링크를 통해 원문을 읽어보시길 추천드립니다.


이더리움의 백서의 시작은 비트코인에 대한 이야기로 시작됩니다.


A Next-Generation Smart Contract and Decentralized Application Platform


사토시 나카모토가 2008년~2009년에 개발한 비트코인은 중앙화된 발행기관이나 통제기관 없이 상용화된 디지털 자산의 첫번째 사례였기 때문에 화폐와 통화분야에 매우 근본적인 혁신으로 묘사되어왔다. 하지만 더 중요한 요소는 분산합의 수단으로서의 블록체인 기술이며, 이에 대한 관심이 급격하게 늘어나고있다.

이더리움은 완벽한 튜링완전(turing-complete) 프로그래밍 언어가 심어진 블록체인이며, 이 프로그래밍 언어는 코딩된 규칙에 따라 '어떤 상태'를 다르게 변환시키는 기능이 포함된 계약(contracts)을 유저들이 작성할 수 있게 함으로써 우리가 아직 상상하지 못한 다른 많은 어플리케이션도 매우 쉽게 만들 수 있도록 도와주는것이다.


Introduction to Bitcoin and Existing Concepts


History

분산화된 디지털 통화의 개념은 이미 오래전부터 우리 주변에 있었습니다. 1980~1990년대에 암호 알고리즘(cyptographic primitve)을 기반한 e-cash 프로토콜은 개인정보를 강력하게 보호하는 화폐를 제공하였으나 중앙집권적인 중개인 방식에 의존했기 때문에 주목받지 못했습니다.

1998년 'Wei Dai'의 b-money는 작업 증명 방식의 방식으로, 분산 합의와 계산 퍼즐을 풀게하는 방식을 통해서 화폐를 발행하게 하는 아이디어를 최초로 제안하였지만 분산 합의를 실제로 어떻게 구현할지에 대한 자세한 방법을 제시하지 못했습니다.

2005년 'Hall Finney'는 b-money의 아이디어에 Adam Back의 계산 난이도 해시캐시 퍼즐을 조합하여 재사용 가능한 작업증명 개념을 소개하였습니다만, 이 방법도 외부의 신뢰를 필요로 하는 컴퓨팅(trsuted computing)을 기반에 둠으로써 또 다시 구현하는데에 실패하였습니다.

2009년 나가모토 사토시에 의해 비트코인이 개발되었으며, 비트코인은 공개키 암호방식을 통한 소유권 관리를 위해 사용되었던 기존의 알고리즘과 '작업 증명(proof of wokr)' 합의 알고리즘을 결합함으로써 실제적으로 탈 중앙화된 화폐를 처음 구현하게되었습니다.

작업 증명 방식은 네트워크 상에 있는 모든 노드들이 비트코인 장부 상태에 일어난 업데이트를 공동으로 관리할 수 있게 하였으며, 누구나 합의 프로세스에 참여할 수 있도록 허용함으로써 합의 결정권에 대한 정치적 문제를 해결할 수 있었습니다. 또한 시빌 공격(sybile attacks)을 방어할 수 있는 메커니즘을 제공하였으며 각 노드의 결정권의 크기를 그 노드의 계산 능력에 직접적으로 비례시키는 방식으로 어떤 형식적 장벽대신, 경제적 장벽으로 대처함으로써 매우 혁식적인 알고리즘을 제안하였습니다.

작업 증명 방식 이후, 지분 증명(proof of stake)라는 새로운 방식의 합의 알고리즘이 등장하였고, 이는 각 노드가 가진 계산 능력이 아니라 화폐의 보유량에 따라 각 노드의 결정권 정도를 계산한다는 개념입니다.

이 두 방식의 상대적인 장점들에 대한 논의는 이 백서에서는 다루지 않겠지만, 두 방법 모두 암호화화폐의 기반으로서 사용될 수 있다는 점은 지적해두고자 한다.


상태변환시스템으로서의 비트코인(Bitcoin As A State Transition System)


비트코인의 장부는 하나의 상태변환 시스템(state transation system)으로 생각해볼 수 있습니다. 이 시스템은 현재 모든 비트코인의 소유권 현황을 관리하기 위한 "상태(state)"와 트랜잭션(거래 기록)을 처리하고 새로운 "상태(state)"정보를 만들어주기 위한 "상태변환함수(state transition function)"로 구성되어있습니다.

예를 들어 표준 은행 시스템이 비유하자면 상태는 모든 계좌 잔고표(balance sheet)와 같고, 트랜잭션은 거래 내역으로 A에서 B로 X(금액)를 송금하라는 요청입니다. 상태 변환 함수에 의해 A의 계좌의 잔고는 송금한 X만큼 감소하고, B의 계좌의 잔고는 송금 받은 X만큼 증가하게되는것입니다. 만약 A의 계좌에 있는 잔고가 송금하고자 했던 금액 보다 작을 경우 상태 변환 함수는 에러를 리턴하게됩니다.

백서에 있는 그림을 조금더 보기 쉽게 변경한 그림은 1번과 같으며, 백서 본문에 기록된 원본 이미지는 2번과 같습니다.


1. 백서 변경 그림


2. 백서 원본 그림

[출처 : 이더리움 백서(링크)]


이러한 상태변환을 비트코인 장부에서는 아래와 같이 정의할 수 있습니다.

APPLY(S,TX) -> S' or ERROR


만약 은행 시스템에서 사용한다면 아래와 같습니다.

APPLY({ Alice: $50, Bob: $50 },"send $20 from Alice to Bob") = { Alice: $30, Bob: $70 }

APPLY({ Alice: $50, Bob: $50 },"send $70 from Alice to Bob") = ERROR


UTXO집합에는 각자의 코인 금액이 표시되어 있고, 이 UTXO의 소유자(20byte의 주소로 정의되는 암호화된 공개키)의 정보가 들어있습니다. 트랜잭션에는 하나 이상의 입력(inputs) 및 출력(outputs)이 포함되며, 입력에는 보내는 사람의 UTXO에 대한 참조 정보와, 개인 키로 암호화된 서명을 포함하고있습니다. 또한, 출력에는 새롭게 추가될 UTXO 정보가 포함됩니다.


위에서 언급된 상태 변환 함수APPLY(S,TX) -> S를 풀어서 설명하면 아래와 같습니다.

  1. TX(트랜잭션)의 입력 값 검증

    • 만약 S에 참조된 UTXO 정보가 없다면, 에러를 리턴

    • 만약 서명 정보가 UTXO 의 소유자와 같지 않으면, 에러를 리턴(다른 사용자의 예치금)

  2. 만약 입력에 사용된 UTXO 들의 총합이, 출력 UTXO 의 합보다 작으면, 에러를 리턴.(잔고 부족)

  3. 위의 모든 정보가 정상적이라면, 입력에 사용된 UTXO 정보를 더이상 사용하지 못하도록 삭제하고, 출력 UTXO 정보를 추가하여 새로운 "상태(state)"인 S'를 리턴.


1번의 첫번째 과정은 존재하지 않은 비트 코인이 트랜잭션에 사용되는 것을 막기 위한것이며, 1번의 두번째 과정은 다른 사람의 코인이 트랜잭션에 사용되는 것을 막기 위한 방법입니다.

만약 Alice가 Bob에게 11.7 BTC를 보내고 싶을 경우 먼저 Alice 지갑주소에 표시된 금액의 합이 최소 11.7 BTC 이상인 UTXO의 집합 정보가 필요합니다. 거의 대부분의 경우 11.7 BTC를 가지고 있는 UTXO 정보를 바로 선택하는 경우는 드물며, 6.0 BTC, 4.0 BTC, 2.0 BTC 처럼 금액이 분산된 여러가지 UTXO 정보를 참조하게됩니다.

보내고자 하는 금액은 11.7 BTC이지만, 실제 참조하게되는 UTXO 총합은 12.0 BTC이기 때문에 다음과 같이 12(6+4+2) - 11.7 = 0.3 BTC 잔돈이 발생하게됩니다.

트랜잭션에는 위의 3가지 UTXO 정보가 input으로 설정되며, output에는 송금하고자 하는 금액 11.7 BTC의 새로운 UTXO 정보와, 소유자 Bob이 잔돈을 받게되는 UTXO 정보 2가지 정보로 구성됩니다.



Think

본 포스팅 문서는 이더리움 백서를 보다 이해하기 쉽도록 재 해석하였으며, 너무 많은 양을 한번에 포스팅할 경우 읽는 사람도 지치고, 작성하는 사람도 지칠것 같아서 조금씩 꾸준히 포스팅하기로 결정하였습니다.

모든 백서의 도입부는 기존의 시스템이 무엇인지에 대한 설명과, 부족한 부분이 무엇인지를 지적하고 새로운 방식을 어떻게 구현할것인지에 대한 내용으로 채워지게됩니다.

오늘 포스팅한 백서에서는 비트코인이 이세상에 없던 기술들을 총집합하여 탄생한것이 아니라 아주 오래전부터 그와 관련된 이론들과 논의들이 있었다는 내용과, 비트코인이 어떤 의미에서 혁신적이었는지에 대한 내용으로 시작하였으며, 작업 증명 방식, 지분 증명 방식의 두가지 합의 알고리즘을 언급함으로써 이더리움에 시작은 작업 증명 방식으로 이루어지나 추후 지분 증명 방식으로 변화할것을 예고한 느낌입니다.

또한, 기존의 비트코인 시스템에서 사용되는 '상태(State)'와 '상태 변환 함수(state transition function)'에 대한 개념에 대하여 먼저 설명한 후 이더리움에서는 이 부분을 어떻게 수정할지에 대한 내용을 다루게됩니다.

오늘은 이더리움 백서의 도입부에 대한 내용을 해석하였으며, 다음 포스팅에서 이어서 계속해서 백서를 이해하기 쉽게 풀어서 정리해보도록 하겠습니다.


이상 긴 글 읽어주셔서 감사합니다!


[참고문헌]


https://github.com/ethereum/wiki/wiki/%5BKorean%5D-White-Paper#%EC%83%81%ED%83%9C%EB%B3%80%ED%99%98%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9C%BC%EB%A1%9C%EC%84%9C%EC%9D%98-%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8bitcoin-as-a-state-transition-system

'이더리움 > 이더리움(백서)' 카테고리의 다른 글

이더리움 백서(6편)  (0) 2018.04.12
이더리움 백서(5편)  (0) 2018.04.11
이더리움 백서(3편)  (0) 2018.04.10
이더리움 백서(2편)  (0) 2018.04.06
이더리움 개요  (0) 2018.04.05

안녕하세요. 어미새입니다.


이더리움에 대한 설명을 어디서부터 어떻게 시작할지 참 많은 고민이 있었습니다. 우선은 백서에 대한 내용을 이해하는것이 가장 먼저인것같았습니다, 그래서 이더리움의 백서 내용을 조금더 쉽게 이해할 수 있도록 풀어서 설명하는 포스팅을 진행할 예정이며, 깊히 있게 다뤄야하는 부분은 추후 따로 개별 포스팅을 진행하도록 하겠습니다.

오늘은 첫시간이니만큼 간략한 개요 정도로 가볍게 포스팅을 시작하도록 하겠습니다, 부족한 부분이나 오류가 있는 부분은 코멘트 주시면 감사하겠습니다!


비탈릭 부테린


이더리움의 창시자인 비탈릭 부테린은 어렸을떄부터 프로그래밍에 소질이 있었고, 비트코인으로부터 큰 영향을 받은 인물중 한명입니다. 2011년 비트코인 매거진을 만들었을 정도로 비트코인에 대한 열정이 가득한 청년이었습니다. 비탈릭은 비트코인 기술을 응용하면 단순한 지급 결제뿐 아니라, 주식 발행, 부동산 계약, 보험 상품 설계, 법인 등록, 전자 투표등 다양한 분야에서 블록체인 기술이 활용될수 있다고 생각했습니다. 그럼 비탈릭은 어떤 부분에서 이런 생각을하게 되었을까요?


스크립트(Script)

비트코인 내부에는 간단한 프로그래밍인 스크립트(Script)가 있습니다. UTXO를 관리하기 위한 잠금 스크립트와, 서명이 담겨있는 해제 스크립트가 있었죠 그리고 이 스크립트들이 실행되면서 소비 조건이 맞는지 확인하고 암호해제와 거래 이전을 보장하는 역할을 수행했습니다, 하지만 비트코인의 스크립트는 간단한 연산과 판단만을 할 수 있었으며 이것을 튜링 불완전성이라고합니다. 비탈릭은 이러한 비트코인의 스크립트의 튜링 불완전성을 수정 보안하여, 튜링 완전성을 확복하고 나아가 단순한 암호화폐 교환의 역할만 수행하는 블록체인 기술을 해방시키고자 하였습니다.


비트코인 커뮤니티

비탈릭은 이러한 내용으로 비트코인을 개선하고자 하였으나, 기존의 채굴자들은 이러한 변화를 환영하지 않았죠.. 자신들에게 더 많은 수익이 창출될거라는 생각보다는 기존의 프로그램을 변경해야하며, 악의적인 사용자가 스크립트에 무한루프(반복문)를 통하여 악성 코드를 심었을 경우 네트워크는 마비될 것이라는 비관적인 시선이었습니다. 이러한 문제로 인하여 비탈릭은 새로운 코인을 만들 수 밖에 없었습니다.





이더리움


이더리움과 비트코인의 가장큰 차이점은 사용 범위에 있습니다. 비트코인은 단순한 결제, 거래 관련 시스템이입니다. 즉 화폐로서의 기능에 집중되어 있죠, 하지만 이더리움은 블록체인을 기반으로 거래나 결제뿐만 아니라, 계약서, SNS, 이메일, 전자투표 등 다양한 애플리케이션을 투명하게 운영할 수 있도록 확작성을 제공하였습니다.

이더리움의 등장으로 기존의 암호화폐는 단순한 화폐의 기능을 제공하였다면, 블록체인을 활용한 다양한 응용분야의 확장성을 제안함으로써 2세대 코인의 대표주자로 자리매김하게되었습니다.

이더리움의 가장큰 목표는 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는것이었습니다, 즉 블록체인을 활용한 모든 것을 프로그래밍할 수 있도록 도와주는 플랫폼을 만들고 싶었던것이죠. 우리는 앞으로 이더리움이 무엇인지에 대한 보다 더 자세한 내용을 살펴보기 위하여 백서를 참고하여 내용을 간략하게 이해한 후 중요한 요소들은 개별적인 포스팅을 통해 심도있게 학습을 진행하도록 하겠습니다. 백서의 내용이 궁금하신분들 위해 한글, 영문 백서의 링크를 아래와 같이 첨부하였습니다. 미리 읽어보시는것도 좋을것 같습니다.


이더리움 백서 목차

  • 역사

    • 상태변환시스템으로서의 비트코인

    • 채굴

    • 머클트리

    • 블록체인 사용한 다른 사용사례

    • 스크립팅

  • 이더리움

    • 이더리움 어카운트

    • 메시지와 트랜잭션

    • 이더리움 상태변환함수

    • 코드 실행

    • 블럭체인과 채굴

  • 어플리케이션들

    • 토큰 시스템

    • 금융 파생상품

    • 신원조회와 평판시스템

    • 탈중앙화된 파일 저장공간

    • 탈중앙화된 자율 조직

    • 추가적인 어플리케이션들

  • 기타 이슈들

    • 수정된 GHOST 도입]

    • 수수료

    • 연산과 튜링완전성

    • 통화와 발행

    • 채굴 중앙집중화

    • 확장성

  • 결론

  • 주석과 추가 자료



더하기

2014년 '월드테크놀로지어워드' 올해의 정보기술(IT) 소프트웨어 부문 수상은 모두가 페이스북의 마크 저커버그가 차기할 것이라고 예상하였지만, 이더리움의 아버지인 비탈릭 부테린이 수상하게 되었죠, 그 당시 비탈릭의 나이는 20살에 불과하였습니다. 이때 우리나라에서는 이더리움의 표기를 이시리움이라고 표기하고 있었던것 같네요.. 보다 자세한 내용이 궁금하신분은 아래의 링크를 통해 그 당시 뉴스 기사를 읽어보셔도 재미있을것 같습니다.


이로써 이더리움에 대한 아주 간략한 개요에 대한 포스팅을 마치도록 하겠으며, 다음 포스팅에서는 이더리움 백서에 나와있는 '역사'파트에 대한 내용을 찾아뵙도록 하겠습니다. (역사 파트이다보니, 비트코인에 대한 이야기로 내용이 구성되어있습니다.)


이상 긴 글 읽어주셔서 감사합니다!



[참고문헌]

https://brunch.co.kr/@blockchainstory/5

https://brunch.co.kr/@ashhan/10

http://news.hankyung.com/article/2014121540821

https://namu.wiki/w/Ethereum

'이더리움 > 이더리움(백서)' 카테고리의 다른 글

이더리움 백서(6편)  (0) 2018.04.12
이더리움 백서(5편)  (0) 2018.04.11
이더리움 백서(3편)  (0) 2018.04.10
이더리움 백서(2편)  (0) 2018.04.06
이더리움 백서(1편)  (0) 2018.04.06

아래의 자료는 Keepit 저널에서 게시된 콘텐츠이며, 제가 저자로 참여하여 작성된 콘텐츠입니다. 
비트코인의 전반적인 내용을 담을 예정이기에 게시물을 따로 분류하여 블로거 여러분들에게 공유하기 위한 목적으로 옮겨왔습니다. 

[ 원본 게시글 ]

KEEP!T Column

안녕하세요! KEEP!T입니다. 최초의 암호화폐인 비트코인을 누구나 쉽게 이해할 수 있도록 '비트코인 뽀개기'라는 주제로 새로운 콘텐츠를 제작하게 되었습니다. 다소 부족한 부분이 있다면 지금까지 그래왔던 것처럼 독자분들께서 적극적인 코멘트 해주셨으면 좋겠습니다, 앞으로 많은 관심 부탁드립니다.

탈 중앙화된 금융 시스템의 필요성

서브프라임 모기지 사태 : 2000년대 초반 IT 버블이 붕괴되고 911 테러, 아프간/이라크 전쟁 등으로, 미국 경기가 악화되자 미국 정부는 경기부양책으로 저금리 정책을 펼쳤습니다. 주택융자 금리가 인하되자, 많은 사람들은 대출을 받아 주택을 구매하였고, 부동산 가격은 상승하기 시작했습니다.
경기가 좋아지자 미국 정부는 2004년 저금리 정책을 종료하였고, 주택융자 금리 또한 인상되었습니다. 금리가 인상되자 저 소득층 대출자들은 원리금을 갚지 못하는 상황이 발생하였고 담보로 잡혀있던 주택 가격들은 하락 하기 시작하였습니다. 서브 프라임 모기지론을 구매한 금융기관들은 대출금을 회수할 수 없는 상태에 빠졌고, 이 과정에서 여러 기업들이 부실화되면서 미국의 대형 금융사 및 증권회사들의 파산으로 이어졌으며, 결국 2008년 세계 금융 위기까지 이어지게 됩니다.
세계 금융위기가 발생하자 주요 국가의 중앙은행에서는 양적 완화를 통해 위기를 극복하고자 하였고, 무분별한 화폐의 발행으로 화폐의 가치가 하락하자 모든 경제 구성원들에게 피해가 이어졌습니다. 일부 기업의 실패로 시작된 금융위기를 양적 완화를 통해 극복하는 모습에 많은 사람들이 글로벌 금융 시스템에 대한 불신이 생겼으며 누구나 신뢰할 수 있는 탈 중앙화된 금융 시스템의 필요성이 부각되기 시작하였습니다.
양적 완화 :  중앙은행이 발권력을 동원해 화폐를 발행한 후, 그 화폐로 국채나 민간이 가지고 있는 일정 신용등급 이상의 채권을 매입하여 통화량을 늘리는 정책입니다.


탈 중앙화된 금융 시스템 도입의 어려움
전자화폐

전자화폐는 전자적으로만 교환되는 돈이나 증서를 뜻하며, 컴퓨터 네트워크, 인터넷, 디지털 선불 카드시스템에서 통용되어 사용되고 있습니다. 페이팔(PayPal), 웹머니 등과 같은 중앙 집권적 체계의 전자화폐 시스템은 오래전부터 개발되어 상용화되었지만, 개인과 개인이 거래를 할 수 있는 탈 집권적 체계의 전자 화폐 상용화에는 기술적, 제도적 문제점들이 있었습니다.

'기술적' 문제

디지털 데이터는 무한대로 복제 가능하고, 원본과 복사본의 구별이 어렵기 때문에 이중 지불이라는 문제를 내적으로 안고 있었으며, 분산 컴퓨팅 분야의 오래된 난제 중 하나인 비잔틴 장군 문제와 같은 기술적 어려움이 있었습니다.
이중 지불(Double Spent): 단일 통화 단위가 두번 결제되어 발생하는 문제다. 디지털 데이터는 무한대로 복제가 가능하고 원본과 복사본의 구별이 어렵기 때문에, 디지털 화폐는 이중 지불이란 문제를 내재적으로 안고 있다. 디지털 데이터가 검증받지 못한다면, 그 데이터를 복사해서 동시에 여러 곳에 사용할 수 있는 것이다.
비잔틴 장군 문제(Byzantine General's Problem): 1984년 레슬리 램포트와 쇼스탁, 피스가 공저한 논문 에서 처음 언급된 문제이며, 분산 컴퓨팅 분야에서 오랫동안 풀지 못했던 난제다. 서로를 신뢰할 수 없는 사람들이 참여하는 분산 P2P 네트워크에서 어떻게 합의를 이뤄낼 것인가에 관한 문제이다.

'보상'의 필요성

탈 중앙화된 금융 시스템이 유지되기 위해서는 개인의 '희생'이 필요합니다. 예를 들어 P2P 네트워크 중 하나인 토렌트 프로그램을 생각해보겠습니다. 토렌트에 접속하는 대다수의 구성원들은 자신이 원하는 파일을 다운로드 받기 위해 접속하며, 다운로드가 완료될 경우 해당 프로그램을 종료합니다. 다른 구성원들을 위해 업로드 기능을 활성화하여 자신의 컴퓨터 자원을 '희생'하는 구성원은 극히 소수일 수밖에 없습니다.
탈 중앙화된 금융 시스템이 정상적으로 동작하기 위해서는 시스템을 유지시켜야 하는 '이유'와 '목적'을 구성원들에게 제공해야 합니다.

비트코인

비트코인은 블록체인 기술을 기반으로 만들어진 암호 화폐이며, 중앙은행 없이 P2P 네트워크를 통해 개인들 간에 자유로운 금융 거래를 할 수 있도록 설계된 암호 화폐입니다. 2008년 10월 사토시 나가모토라는 가명을 사용한 프로그래머가 "Bitcoin : A Peer-to-Peer Electronic Cash System"이라는 제목의 9쪽짜리 논문을 공개했고, 3개월 만인 2009년 1월 프로그램 소스를 배포함으로써 세상에 알려지기 시작하였습니다.


비트코인의 화폐 단위는 BTC로 표기하며, 1 BTC 미만의 단위는 비트코인의 창시자 사토시 나가모토의 이름에서 따온 사토시(satoshi)라 부릅니다. 비트코인의 총 발행량은 2140년까지 총 2100만 개로 정해져있으며, 무분별하게 발행될 수 있는 종이화폐와 달리 제한된 양의 화폐를 발행함으로써 더 큰 가치를 얻을 수 있었습니다.
기존의 탈 중앙화 시스템의 기술적 문제점인 이중 지불 및 비잔티움 장군 문제를 합의 알고리즘인 작업 증명(Proof-of-Work)알고리즘을 통해 해결하였으며, 네트워크에 더욱더 많은 기여를한 구성원에게 더 큰 '보상'을 줌으로써 선의의 경쟁을 통해 더 많은 사용자들이 네트워크에 기여하고 일할 수 있는 환경을 제공하였습니다.

비트코인의 등장 이후 이더리움, 스팀과 같은 다양한 암호 화폐와 플랫폼들이 개발되기 시작하였고, 현재에는 많은 기업들이 블록체인 기술을 활용한 서비스 개발에 집중하고 있습니다. 비트코인은 단순히 암호 화폐의 기능만을 제공하는 것이 아니라 새로운 패러다임의 시작을 알린 암호 화폐라고 생각합니다.


yahweh87


[참고자료]


'비트코인(keepit)' 카테고리의 다른 글

KEEP!T Column 비트코인 뽀개기(2편)  (0) 2018.04.12

+ Recent posts