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


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


Remind


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

작업 증명의 목적은 블록 생성을 계산적으로 어렵게 만들어서 sybile 공격자들이 마음대로 전체 블록체인을 조작하는 것을 방지 하기 위함이며, 네트워크는 평균적으로 10분마다 새로운 블록이 생성될 수 있도록 2016개의 블록마다 목표 값을 변경하게 됩니다.

채굴자는 이러한 연산 작업에 대한 보상으로 BTC를 획득하고, BTC를 획득하기 위하여 선의의 경쟁을 하게됩니다. 네트워크에 참여하는 노드가, 다양하고 많을수록 51% 공격과 같은 악의적인 사용자의 공격을 막아낼 수 있기 때문에 네트워크의 신뢰로가 향상될 수 있습니다.


머클트리


블록 헤더는 200 바이트 정도의 데이터로, 타임 스탬프, 논스(nonce), 이전 블록 해시, 그리고 머클트리(Merkle tree)의 루트 해시 정보가 들어있습니다. 머클 트리는 이진트리(binary tree)의 일종으로 하나의 루트 노드의 집합입니다.

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




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


위의 왼쪽 그림의 최하위 노드의 트랜잭션 정보를 살펴보면, Alice가 Bob에게 20 BTC를 보낸다는 트랜잭션 정보입니다. 그런데 만약 오른쪽의 그림과 같이 Alice가 Eve에게 20 BTC를 전송한다는 내용으로 트랜잭션 정보를 변경할 경우 상위 노드들의 정보가 변경되어 그림과 같은 오류가 발생하게됩니다.

머클트리 프로토콜은 비트코인 네트워크를 지속 가능하게 만드는 기초가됩니다. 비트코인 네트워크의 각 블록의 모든 정보를 처리하는 풀 노드(full noe)는 2014년 4월 기준으로 15GB의 디스크 저장 공간이 필요하며, 매달 1 GB 넘게 데이터가 증가하고 있습니다. 이 수치는 데스크탑 컴퓨터 정도에서는 수용할 수 있지만, 스마트폰에서는 불가능합니다. 아주 먼 미래에는 데이터의 용량문제로 인해 소수의 사업체들이나 풀 노드를 유지할 수 있을 것입니다.

스마트폰과 같이 저장 공간의 한계가 있는 디바이스에서는 단순화된 지불검증(simplified payment verification, SPV) 프로토콜을 활용하여 가벼운 노드(light node)가 운영될 수 있습니다. light node는 블록 헤더를 다운로드하고, 그 블록 헤더 정보를 토대로 작업증명을 검증하게 됩니다. 풀 노드와 달리, "곁가지들(branches)"만을 다운로드 하며, 이는 전체 블록체인의 매우 작은 비율만을 다운로드한 것입니다. 그럼에도 불구하고 강한 안정성을 보장 받을 수 있으며, 임의의 트랜잭션의 상태 및 잔고 상태를 확인할 수 있습니다.


블록체인 기술을 이용한 다른 응용 사례


1998년 "Nick Szabo"는 소유주 권한을 통한 재산권 보장(secure property titles with owner authority) 글을 발표 했습니다. 발표된 내용은 땅의 소유권의 등기 문제를 블록체인 기반 시스템으로 처리할 수 있다는 내용입니다. 하지만 그 당시에는 효과적인 파일 복제 시스템이 없었기때문에 Nick Szabo의 프로토콜은 구현되지 못했습니다. 하지만 2009년 이후 비트코인 분권 합의 시스템이 발전하면서 수 많은 응용 사례가 빠르게 부각되기 시작하였습니다.


  • 네임 코인은 비트코인의 저장기술과, 전송 시스템 기술을 기반으로 만들어진 시스템이며, '탈중앙화된 명칭 등록 데이터베이스(decentralized name registration database)'라고 부르는것이 가장 좋은 표현일것입니다. 네임코인은 기존의 국제 인터넷 주소 관리기구에의해 중앙에서 관리되는 DNS 정보를 블록체인 기술 기반으로 관리할 수 있도록 구현되었습니다. 네임코인 기반의 도메인은 .bit로 끝나며, DNS 주소 등록과, 거래 정보의 익명성을 보장합니다. 이러한 네임코인은 인터넷 주소를 관리하며, 네트워크에 참여한 노드의 컴퓨터 자원을 활용하여 인터넷 주소를 관리하고 보상으로 코인을 지급하고 있습니다.

  • 컬러드 코인의 목적은 누구나 비트코인의 블록체인 위에서 자신만의 고유한 디지털 화폐를 발행허가나, 자신만의 디지털 토큰을 발행할 수 있는 프로토콜 역할을 수행하는것입니다. 컬러드 프로토콜에서, 사용자는 특정 비트코인의 UTXO에 공개적으로 색깔을 부여함으로써 새 화폐를 발행할 수 있습니다.

  • 메타코인이 품고 있는 아이디어는, 비트코인 거래를 메타코인 거래 저장에 이용하되, 상태 이동함수 APPLY를 다르게 가짐으로써, 비트코인 시스템 위에서 운영될 수 있는 프로토콜을 갖는것입니다. 메타코인은 비트코인 블록체인 위의 자산 발행 레이어를 제공하며, 컬러드 코인이 특정 UTXO와 연결된다면, 메타코인은 주소(address)에 입력된 메시지입니다. 컬러드 코인과 같이 메타코인 시스템은 채굴과 네트워킹의 복잡성을 비트코인 프로토콜에 의해 처리함으로써 적은 개발비용으로 쉬운 암호화폐 발행을 가능하게하였습니다.


일반적으로 합의 프로토콜을 개발하기 위한 방법은 두 가지 접근 방법이 있으며, 하나는 독립적인 네트워크를 만들어내는것이며, 또 다른 하나는 비트코인 시스템과 연동되는 새로운 프로토콜을 만들어내는것입니다.

전자의 접근 방법은 네임코인과 같은 응용 사례에서 상당히 성공적이었지만, 실제 개발하기에는 어려움이 있습니다. 상태 변환과 네트워킹 코드를 개발하고, 점검해야 할 뿐만 아니라 독립적인 블록체인을 구동 시켜야 하며, 나아가 분권 합의 기술에 관한 어플리케이션의 집합이 멱함수분포를 따를 것으로 예상됩니다. 즉, 대다수의 어플리케이션은 자기 자신의 블록체인을 보장하기에는 너무 작을 것이고, 서로 교류를 하기 위한 분권화된 자율 기구(DAO)가 생겨날 것이라고 예상됩니다.

후자의 접근 장법은 비트코인에 기반한 접근 방법입니다. 비트코인은 블록체인 깊이(depth)를 검증 대리 수단으로 이용하여 단순 지불 검증(SPV)을 사용할 수 있지만, 후자의 접근 방법은 SPV 특징을 사용하지 못하는 단점이 있습니다. 메타 프로토콜은 무효 거래가 블록체인에 포함되지 않도록 막을 방법이 자기 자신의 프로토콜 자체에는 없습니다. 그렇기 때문에 안전을 보장하기 윟나 단순지불검증 메타-프로토콜이라면, 어떤 거래가 유효한지 아닌지를 결정하기 위해 항상 비트코인 블록체인의 원점까지 돌아가 확인하는 작업이 필요합니다. 현재까지 비트코인을 기반한 메타-프로토콜의 모든 라이트(light) 클라이언트 구현은 믿을만한 서버에 의지하는 형편입니다. 우리가 암호화폐를 만든 가장 중요한 목적이 제 3자의 신용기구의 필요성을 없애는 것이었다는걸 특히 되새겨본다면, 이것은 아주 분명하게도, 차선의 결과가 될 뿐입니다.


마무리


오늘은 이렇게 이더리움 백서 도입부에 기록된, 머클트리와 블록체인 기술을 이용한 다른 응용 사례에 대한 내용을 다뤄봤습니다. 오늘 학습한 이더리움 백서의 내용은 블록체인 기술을 활용한 시스템을 만들기에는 많은 비용이 발생하고, 개발적 난제들이 있다는 사실을 부각한것 같습니다. 그리고 기존의 블록체인 활용방법은 비트코인에 의지하였고, 비트코인에 의지할 경우 라이트 노드를 만들기 어렵다는 문제점을 제기하며, 이더리움에서는 어떻게 이 방법을 해결할것인지에 대한 내용이 나올것으로 예상됩니다.

백서의 내용중 설명이 조금 부족했던, 네임 코인, 컬러드 코인, 메타코인에 대한 자세한 정보를 원하시는 분들을 위해 자료를 모아봤습니다. 네임코인은 @jruit님께서 작성해주셨고, 컬러드 코인은 @coolzero님께서 작성해주셨습니다. 메타코인의 자료는 피넥터 보고서, 블록체인 기술의 발전과정과 이해 자료의 자산 발행기술 챕터(25 Page)에 명시되어 있습니다. (추후 시간이 허락된다면 네임 코인, 컬러드 코인, 메타 코인에 대한 자료를 모두 취합하여 하나의 포스팅으로 만들보도록하겠습니다.)



다음 포스팅에서는 비트코인의 스크립트 부분에 대한 포스팅을 할 계획이며, 그 다음 포스팅인 이더리움 백서 5편에서는 본격적인 이더리움에 대한 설명으로 이어질것 같습니다. 혹시나 이더리움 백서를 먼저 읽고 싶으신분은 아래의 링크를 통해 백서를 먼저 확인해보셔도 좋을것 같습니다.



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


[참고문헌]


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
이더리움 백서(2편)  (0) 2018.04.06
이더리움 백서(1편)  (0) 2018.04.06
이더리움 개요  (0) 2018.04.05


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



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

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



'머클트리(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/

+ Recent posts