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


이더리움 백서를 쉽게 이해할 수 있도록 풀어서 설명하는 연재물을 작성하고 있습니다. 5편부터는 본격적인 이더리움에 관한 설명이 시작됩니다. 이전 내용들과 연관되어 설명이 진행되니, 혹시 지난 포스팅을 읽지 못하셨던 분들은 먼저 아래의 포스팅을 읽어보시는것을 추천드립니다.




Remind


이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는것입니다. 튜링 완전 언어를 내장하고 있는 블록체인이라는 필수적이고 기본적인 기반을 제공함으로써, 대규모 어플리케이션에 유용한 개발 기법을 제공하고, 개발 시간 단축, 높은 보안성, 다른 어플리케이션과 상호작용할 수 있는 생태계를 만들고자하였습니다.

이더리움에서 상태(state)는 어카운트(account)라고 하는 오브젝트(object)들로 구성되어 있습니다. 어카운트 오브젝트는 20바이트의 주소와, 값과 정보를 전달해주는 상태변화(state transition)을 가지고 있으며, 논스(nonce), 이더(ether), 계약 코드, 저장 공간, 4가지의 필드 정보로 구성되어있습니다.

이더리움에서 화폐는 이더(ether)로 표기되며, EOA와 CA 두가지 타입의 계정으로 분류됩니다. 튜링 완전성을 보장하기 위해 악의적인 공격자가 네트워크 리소스를 소비하는 만큼 강제로 수수료(gas)를 지불하게함으로써 악의 적인 공격을 방지할 수 있다는 개념을 설명하였습니다.


메시지(Message)


컨트랙트는 또 다른 컨트랙트에게 메시지를 보낼 수 있으며, 메시지는 따로 저장될 필요가 없으며, 이더리움의 실행 환경에서만 존재하는 가상의 오브젝트입니다. 이러한 메시지는 아래의 항목들을 포함하고 있습니다.


  • 메시지 발신처(암묵적)

  • 메시지 수신처

  • 메시지와 함께 전달되는 이더

  • 선택적 데이터 필드

  • STARTGAS 값


메시지는 외부 실행자가 아닌 컨트랙트에 의해 생성된다는 것을 제외하면 트랜잭션과 유사합니다. 현재 코드 수행을 하고 있는 컨트랙트가 메시지를 생성하고 실행하라는 CALL opcode를 만나게 되면 메시지를 생성합니다. 트랜잭션과 마찬가지로, 메시지는 수신자 어카운트에 전달됩니다.

컨트랙트는 외부 실행자가 하는 것과 정확히 같은 방식으로 다른 컨트랙트와 관게를 맺을 수 있으며, 트랜잭션이나 컨트랙트에 의해 할당된 gas 허용치는 그 트랜잭션과 모든 하위의 실행 연산에 적용됩니다.

예를 들어, 외부 실행자 A가 B에게 1000 gas와 함께 트랜잭션을 보내고, B는 600 gas를 소모한뒤 C에게 메시지를 보내고, C의 내부 실행에 300 gas를 소모한 후 반환하면 B는 gas가 모두 소모되기 전에 100 gas를 더 사용할 수 있습니다. (1000 - 600 = 400, 400 -300 = 100)


이더리움 상태 변환 함수(Ethereum State Transition Function)


이더리움 상태 전이 함수 APPLY(S, TX) -> S’ 는 다음처럼 정의될 수 있다.



[그림 - 이더리움 백서]



트랜잭션의 형식이 맞는지(전송하고자 하는 이더의 수량이 맞는지 확인) 체크하고, 서명이 유효한지, 논스가 발신처 어카운트의 논스와 일치하는지를 체크하며, 트랜잭션이 유효하지 않을 경우 오류를 반환합니다.

STARTGAS * GASPRICE의 정보는 트랜잭션 수수료이며, 서명으로 부터 발신처 주소를 결정하게됩니다. 발신처 어카운트에서 수수료를 제외하고 발신자의 논스 정보를 증가 시키며, 발신처 잔고가 충분하지 않을 경우 오류를 반환합니다.

GAS = STARTGAS로 초기화 한후, 트랜잭션에서 사용된 바이트에 대한 값을 지불하기 이해 바이트 양에 비례하여 gas를 차감합니다. 발신처 어카운트 에서 수신처 어카운트로 트랜잭션 값이 전송되며, 수신처 어카운트가 컨트랙트일 경우 컨트랙트의 코드 끝까지 수행 하거나, gas가 모두 소진될 때 까지 수행하게됩니다. (만약 악의적으로 무한 루프를 발생시킬 경우 gas가 다 소모되는 시점에서 종료됩니다.)

만약 발신처의 잔고가 충분하지 않을 경우 트랜잭션 전송이 실패할 수 있으며, 컨트랙트 코드 수행시 gas가 부족할 경우 수수료를 제외한 모든 상태 정보는 원상태로 돌아가며, 해당 수수료는 채굴자의 어카운트에 지급됩니다. 모든 컨트랙트가 정상적으로 수행된 후 남아있는 gas에 대한 수수료는 발신처에 돌려주고, 소모된 gas의 수수료는 채굴자에게 보내지게됩니다.


예를 들어, 아래와 같은 컨트랙트 코드가 있다고 가정해보겠습니다.


if !self.storage[calldataload(0)]:
  self.storage[calldataload(0)] = calldataload(32)


실제 컨트랙트 코드는 로우-레벨 EVM(이더리움 버츄얼 머신) 코드로 작성되지만, 이해를 돕기 위해 이더리움 하이-레벨 언어중 하나인 Serpent로 작성되었습니다(해당 코드는 EVM 코드로 컴파일 될 수 있습니다).

컨트랙트의 스토리지가 비어있다고 가정하고, 트랙잭션 정보는 10tehr, 2000 gas, 0.001 ether gasprice, 63바이트의 데이터(0-31바이트는 숫자 2를, 32-63 바이트는 문자열 CHARLIE)를 보낸다고 가정했을 경우 상태 변환 함수의 프로세스는 아래와 같이 실행됩니다.


  1. 트랜잭션 정보가 유효하고, 형식이 정상적인지 확인 한다.

  2. 트랜잭션을 전송하는 발신 자의 이더 잔고가 최소 수수료 정보 만큼(2000 gas * 0.001 ether = 2 ether) 있는지 확인 한다, 만약 잔고가 충분할 경우 발신 자의 어카운트에서 수수료 금액인 2 ether를 차감한다.

  3. gas = 2000으로 초기화한다. 트랜잭션 총 길이가 170 바이트, 수수료가 5gas라고 가정했을 경우 170 * 5 = 850의 수수료가 소모되며, 초기 가스 정보인 2000에서 850을 제외한 1150 gas가 남게된다.

  4. 발신측 어카운트에서 전송할 ether의 양인 10 ether를 차감하고, 이것을 컨트랙트 어카운트에 더한다.

  5. 컨트랙트 코드를 실행 시키며, 컨트랙트의 index 2에 해당하는 스토리지가 사용되었는지 확인하고 index 2에 해당하는 스토리지 값을 CHARLIE로 설정 한다. 이 작업을 통해 187 gas가 소비되었다고 가정했을 경우 남아 있는 gas의 양은 1150 - 187 = 963 gas가 남게된다.

  6. 남은 수수료인 963 * 0.001 = 0.963 ether를 발신측 어카운트로 되돌려주고, 결과 상태를 반환한다.


트랜잭션의 수신처에 컨트래트가 없을 경우, 트랜잭션의 총 수수료는 제공된 GASPRICE와 트랜잭션의 바이트 수를 곱한 값만이 수수료로 지출되며, 트랜잭션가 함께 보내진 데이터는 관련이 없어지게됩니다. (실행 할 컨트랙트가 없기 때문입니다.)

메시지는 트랜잭션과 마찬가지 방식으로, 상태 정보를 원래 상태로 되돌린다는 것을 주목해야합니다. 메시지 실행시 gas가 부족할 경우, 메시지 실행에 의해 발생된 다른 모든 실행들은 원래대로 되돌려지게 되지만, 메시지를 실행 시켰던 부모의 상태는 되돌려질 필요가 없습니다. 이것은 컨트랙트가 다른 컨트랙트를 호출하는 것은 안전하다는 것을 의미하며, A가 X 만큼의 gas를 가지고 B를 호출할 경우, A의 실행은 최대 X gas만을 잃는다는 것을 보장 받게됩니다.


코드 실행(Code Exceution)


이더리움 컨트랙트 코드는 "이더리움 버추얼 머신 코드" 또는, "EVM 코드"로 불리는 스택 기반의 바이트 코드 언어로 작성됩니다. 컨트랙트 코드는 연속된 바이트로 구성되어 있고, 각각의 바이트는 연산(operation)을 나타냅니다. 이러한 컨트랙트 코드는 반복적으로 연산을 수행도록 구성된 무한 루프, 혹은 코드의 마지막에 도달될 경우 종료되거나, 오류나 STOP, RETURN과 같은 명령어를 마주했을 경우 종료됩니다. 또한, 연산을 수행하기 위해서는 아래와 같이 데이터를 저장하는 세가지 타입의 공간에 접근할 수 있어야 합니다.


  • 스택

  • 메모리

  • 컨트랙트의 영속적인(long-term) 저장소(storage)


컨트랙트 코드는 블록 헤더 데이터 뿐만 아니라, 특정 값이나, 발송자 및 수신되는 메시지의 데이터에 접근 할 수 있으며, 결과 값으로 데이터의 바이트 배열을 반환할 수도 있습니다.


이러한 EVM 코드의 공식 실행 모델은 놀랍도록 단순합니다. 이더리움 버추얼 머신이 실행되는 동안, block_state, transaction, message, code, memory, stack, pc, gas와 같은 모든 계산 상태는 튜플(tuple)로 정의될 수 있으며, block_state는 모든 어카운트를 포함하는 전역 상태(global state)로서 잔고와 저장소(storage)를 포함합니다.

스마트컨트랙트 code의 pc(프로그램 카운터)번째 바이트의 현재 명령이 실행되고, pc가 코드의 길이보다 크면 (pc>=len(code) pc는 0), 각각의 명령은 튜플이 어떻게 변화되는지 알 수 있습니다.

예를 들어 ADD는 스택에서 두개의 아이템을 꺼내(pop), 그 합을 구한 후 다시 스택에 넣고(push) gas를 1만큼 감소 시키고, pc는 1 증가시킵니다. SSTORE는 스택에서 두개의 아이템을 꺼내 이 아이템의 첫번째 값이 가리키는 컨트랙트 저장소 인덱스에 두번째 아이템을 넣습니다.

이더리움 버추얼 머신 환경을 JIT 컴파일을 통해 최적화 하는 많은 방법이 있지만, 기본적인 이더리움은 수백줄의 코드로 구현될 수 있습니다.


마무리


이더리움에서 메시지는 컨트랙트에 의해 생성되며, 컨트랙트가 실행되는 과정에서 수수료가 발생하는 과정이 어떻게 되는지에 대한 설명으로 시작되었습니다. 컨트랙트는 특정 조건이 맞았을때 실행되는 프로그램 코드이며, 해당 코드는 EVM 환경에서 작동됩니다. 지난 시간에서 언급되어듯이 악의적인 프로그램을 막기 위해 코드가 실행되는 바이트의 양에 따라 수수료인 gas가 소모되는 과정, 그리고 gas가 남았을 경우 발신자에게 반환되는 과정에 대한 설명으로 이어졌습니다.

이러한 스마크 컨트랙트 코드는 정상적으로 수행이 완료되던지, gas가 부족하여 종료되던지, 혹은 오류가 발생하는 시점에서 종료가되며, 비트코인의 부족한 상태 변화와 달리 이더리움에서는 다양한 상태 변화를 가질 수 있다는 것을 설명하였습니다. 또한, 컨트랙트 코드는 연산을 위해 스택, 메모리, 저장소에 접근할 수 있어야 하며, 블록 헤더 데이터 뿐만 아니라 특정 값이나, 메시지 발송자 및 수신되는 메시지의 데이터에 접근할 수 있으며, 결과 값으로 데이터의 바이트 배열을 반환 할 수도 있었습니다.


백서의 내용만으로는 이해하기 어려웠던 부분들은 계속해서 취합하고 있으니, 조금 어려운 부분이 있더라고 꾸준히 계속 읽으시면 좋을것 같습니다. (계속 반복적으로 말하고 있지만, 어려웠던 용어들은 개별 포스팅하겠습니다.)


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


혹시나 이더리움 백서를 먼저 읽고 싶으신분은 아래의 링크를 통해 이더리움 백서를 먼저 확인해보시는것도 좋을것 같습니다.



[참고문헌]


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

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

이더리움 백서(7편)  (0) 2018.04.13
이더리움 백서(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입니다. 지난 '비트코인 뽀개기 1편'에 이어서 비트코인에서 데이터를 저장하기 위한 수단으로 왜 블록체인 기술을 활용했는지에 관한 관점으로 포스팅을 진행하도록 하겠습니다. 혹시 비트코인 뽀개기 시리즈 읽지 않으셨다면 아래의 링크를 통해 읽어보시면 좋을것 같습니다.



데이터 베이스


데이터 베이이스는 체계화된 데이터를 저장, 조작 관리하는 방법을 의미하며 사용하는 방법에 따라, 계층형, 관계형, NoSQL 데이터 베이스등이 있습니다. 비트코인에서는 데이터를 저장하기 위한 수단으로 기존에 사용되어왔던 데이터 베이스 기술 방식이 아닌 블록체인 기술을 활용하였습니다.

중앙 집중형 시스템에서 자주 사용되어왔던 데이터베이스는 수정, 삭제하기 매우 쉬웠기 때문에 일부 권한을 가지고 있는 사용자들만이 데이터를 관리해야했습니다. 하지만 탈 중앙화된 금융 시스템을 만들기 위해서는 누구나 네트워크에 참여할 수 있으며, 모든 참여자가 데이터 베이스에 접근할 수 있고 데이터를 기록할 권한을 가지고 있어야 합니다. 그렇기때문에 기존의 중앙 집중형 시스템에서 자주 사용되어왔던 데이터 베이스의 형태가 아닌 새로운 데이터 베이스가 필요했습니다.

관계형 데이터 베이스 : 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 매우 간단한 언칙의 전산 정보 데이터베이스다. 1970년 에드거 F. 커드가 제안한 관계형 모델에 기초하는 디지털 데이터베이스이다.

NoSQL 데이터 베이스 : 전통적인 관계형 데이터베이스 보다 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 메커니즘을 제공하며, 단순 검색 및 추가 작업을 위한 매우 최적화된 키 값 저장 공간으로 높은 성능 이익을 내는 것이 목적이다. NoSQL 데이터베이스는 빅데이터와 실시간 웹 애플리케이션의 상업적 이용에 널리 쓰이고 있다.


블록체인


블록체인 기술은 분산 컴퓨팅 기술 기반의 데이터 위변조 방지 기술로써, 데이터를 '블록' 단위로 관리하며, 시간의 흐름순으로 블록을 체인(링크드 리스트)형태로 연결한 분산되고, 독립적인 공통 장부(원장, Ledger) 관리 기술입니다. 블록체인은 별도의 중앙 서버 없이 P2P 네트워크 환경에서의 비가역적 공유 데이터 베이스 역할을 수행합니다.

블록체인 기술은 분산되고, 독립적인 데이터 관리를 가능하도록 도와주며, 네트워크에 연결된 모든 사용자들이 블록체인 데이터의 변경 결과를 열람할수 있으며, 합의 알고리즘에 의해 새롭게 추가되는 블록의 검증이 이루어지고, 검증된 블록만을 기존의 블록체인에 연결하여 데이터 위변조를 방지할수 있게됩니다. 이러한 블록체인 기술을 통해 중앙권력 없이 순수하게 사용자들로만 이루어진, 그러나 조작이나 통제가 불가능한 금융 시스템을 만들수 있게되었습니다.

비가역성 : 변화를 일으킨 물질이 본디의 상태로 돌아오지 아니하는 성질, 즉 블록체인에서 비가역적 공유 데이터베이스의 의미는 이미 저장된 데이터를 수정하거나, 삭제할 수 없는 상태를 의미함.


비트코인의 블록체인


탈 중앙화된 금융시스템을 꿈꾸던 비트코인은 앞서 언급한 기존의 데이터 베이스 시스템이 아닌 블록체인 기술을 도입하여 탈 중앙화된 금융 시스템을 만들수 있게 되었습니다. 비트코인 시스템에 적용된 블록체인의 '블록'은 평균 10분에 한번식 생성될 수 있도록 설게되었으며, 블록의 크기는 1MB로 약 1800 - 4200건의 거래내역을 담을 수 있습니다. 비트코인의 블록체인에 저장되는 '블록'은 크게 블록 헤더정보와, 블록 바디정보로 구분할수있습니다.

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

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





비트코인에 적용된 블록체인 기술에 대한 이해와, 블록 구성요소의 역할에 대한 명확한 이해를 위해서는 먼저 '해시 함수'에 대한 개념정리가 필요합니다.


해시함수


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


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

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

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

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


1번의 특징인 어떤 입력 값에도 항상 고정된 길이의 해시값을 출력하는 특징에 대해서 먼저 살펴보겠습니다. 어떠한 데이터를 입력하여도 항상 고정된 256bit의 결과 값을 출력한다는 의미이며, 이는 방대한 데이터를 256bit로 축약할 수 있다는 의미가됩니다. 2번의 특징인 입력 값의 아주 일부만 변경되어도 전혀 다른 결과 값을 출력한다는 특징을 활용하여 입력값의 위변조를 쉽고 빠르게 확인할 수 있습니다.

SHA 256 해시 함수는 입력 값의 데이터가 아무리 길어도 항상 고정된 길이의 256bit의 결과 값으로 변환해주며, 입력된 결과 값 중 일부만 변경되어도 전혀 다른 결과 값을 출력하기 때문에 256bit의 데이터 비교만을 통해 데이터의 위변조 사실을 알아낼 수 있습니다. 즉 메시지의 오류나 변조를 아주 빠르게 탐지할 수 있는 무결성을 제공할 수 있다는 의미입니다.

만약 책 한 권의 데이터를 한 글자씩 비교하여 변조되었는지 확인한다면 아주 오랜 시간이 소요될 것입니다, 하지만 해시함수의 2가지 특징으로 인하여 방대한 데이터를 256bit로 축약하고, 축약된 데이터가 서로 같은지 비교할 경우 아주 빠르게 원본 데이터의 변조 사실을 탐지할 수 있게 됩니다.


대다수의 웹사이트에서는 데이터 저장 시 보안의 요소로 해시함수를 많이 사용하고 있습니다. 그 이유는 해시 함수의 3번째 특징인 출력된 결과 값을 토대로 입력 값을 유추할 수 없다는 점, 4번째 특징인 입력 값은 항상 동일한 해시 값을 출력한다는 점을 활용하여 데이터 암호화에 많이 사용되고 있습니다.

예를 들어 우리가 어떤 특정 사이트에 회원 가입을 했다고 가정해보겠습니다. 가입 시 입력한 패스워드가 데이터 베이스에 그대로 저장된다면 관리자들은 사용자의 패스워드 정보를 확인할 수 있고, 해킹을 당했을 경우에는 모든 패스워드 정보를 분실할 수 있습니다. 그렇기 때문에 패스워드는 반드시 암호화되어 데이터 베이스에 저장되어야 합니다. 또한 암호화 방식에 규칙이 있고 관리자가 알 수 있다면 해커 또한 해킹을 통해 암호화 방식을 탈취하여 데이터 베이스에 저장된 암호화된 패스워드를 해독할 수 있다는 의미가 됩니다. 그렇기 때문에 암호화 방식은 그 누구도 알 수 없는 방식으로 데이터 베이스에 저장되어야 합니다.

웹 사이트 가입 시 패스워드를 abc라고 입력했고, 입력 값을 해시함수를 통해 해시 결과 값으로 0xfx...와 같은 256bit의 해시 결과 값을 데이터 베이스의 패스워드로 저장하게된다면, 해시함수의 특징중 하나인 결과 값을 토대로 입력 값을 유추할 수 없다는 특징으로인하여 관리자는 저장된 패스워드 0xfx...을 토대로 사용자가 어떤 입력 값을 넣었는지 알 방법이 없으며, 해커 또한 탈취한 패스워드의 해시 결과 값을 토대로 사용자가 입력한 원본 패스워드를 알 수 없게 됩니다.

또한, 동일한 입력값엔 항상 같은 결과 값을 출력하는 해시 함수의 특징을 활용하여 사용자는 웹사이트 로그인 시 로그인 창에 자신의 패스워드를 입력하고, 로그인을 요청하게됩니다.

사용자가 로그인을 위해 로그인 창에 자신의 원본 패스워드 데이터를 입력하고, 로그인을 요청하게 되면 시스템 내부에서는 입력한 패스워드를 해시 함수를 통해 해시 결과 값으로 변경 후 데이터 베이스에 저장된 패스워드와 해시 결과 값이 같은지 비교하여 같을 경우 로그인을 정상적으로 처리하게 됩니다. (동일한 입력 값엔 항상 같은 해시 결과 값을 출력하는 특징때문에 사용자가 동일한 패스워드를 입력하게되면 항상 같은 해시 결과 값이 출력됩니다.)


요약 정리


탈 중앙화된 금융 시스템을 유지하기 위해서는 모든 네트워크 구성원들에게 분산되고, 독립적인, 데이터 저장 기술이 필요했으며, 비트코인 네트워크는 블록체인 기술을 활용하여 분산되고, 독립적인 데이터 관리가 가능해졌습니다.

해시 함수의 특징을 활용하여 블록의 위변조를 쉽고 빠르게 확인할 수 있었으며, 다양한 암호학 알고리즘, 작업 증명 방식의 합의 알고리즘 등을 통하여 네트워크의 신뢰도를 향상시킬 수 있었습니다. 다음 비트코인 뽀개기 시간에는 이러한 블록체인의 구성요소에 대하여 자세히 알아보도록 하겠습니다.


yahweh87


참고자료


https://ko.wikipedia.org/wiki/NoSQL

https://ko.wikipedia.org/wiki/%EA%B4%80%EA%B3%84%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4




이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.


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

KEEP!T Column 비트코인 뽀개기(1편)  (0) 2018.04.05






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


이더리움 백서를 쉽게 이해할 수 있도록 풀어서 설명하는 연재물을 작성하고 있습니다. 5편부터는 본격적인 이더리움에 관한 설명이 시작됩니다. 이전 내용들과 연관되어 설명이 진행되니, 혹시 지난 포스팅을 읽지 못하셨던 분들은 먼저 아래의 포스팅을 읽어보시는것을 추천드립니다.






Remind


비트코인 프로토콜은 별도의 확장 없이도 낮은 수준의 "스마트 계약"을 구현할 수있지만, 튜링 불완전성, UTXO의 상태표현의 한계점, 블록체인을 해독할 수 없는 문제점이 있습니다.

비트코인은 while이나 for와 같은 순환(loop) 명령 카테고리를 사용할 수 없으며, 순환 명령어를 없앤 이유는 거래 증명시 무한 루프에 빠지는것을 방지하기 위함입니다.

UTXO 스크립트만으로 인출 액수를 세밀하게 통제할 방법이 없으며, UTXO가 표현할 수 있는 상태는 사용되었거나, 안되었거나 두가지 표현방법만 존재하며, 블록체인을 해독할 방법이 없기때문에 여러 다른 부야의 어플리케이션을 만들기 어려운 한계점들이 존재합니다.


그렇다면 이더리움에서는 위의 문제점들 어떻게 해결했을까요? 본격적으로 이더리움 백서에서 말하는 이더리움이 무엇인지 살펴보도록 하겠습니다.


이더리움


이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는것이며, 튜링 완전 언어를 내장하고 있는 블록체인이라는 필수적이고 근본적인 기반을 제공함으로써, 대규모 분산 어플리케이션에 유용한 개발 기법을 제공하고, 개발 시간 단축, 높은 보안성, 다른 어플리케이션과 상호작용할 수 있는 생태계를 만들고자합니다.

누구든지 이 언어를 통해 스마트 컨트랙트, 즉 분산 어플리케이션을 작성하고 소유권에 대한 규칙을 생성할 수 있으며, 트랜잭션 형식(transaction format), 상태변한 함수(state transition function)등을 생성할 수 있습니다.

어떤 값을 저장하고, 특정한 조건들을 만족했을 때만 그 값을 얻을 수 있게 하는 일종의 암호 상자인 스마트 컨트랙트 또한 이 플랫폼위에서 만들 수 있으며, 네임코인과 같은 형태는 두 줄정도의 코드 정도로 작성할 수 있고, 통화나 평판 시스템 관련 프로토콜은 스무 줄 내외의 코드로 만들 수 있습니다.

이러한 방법은 비트코인의 스크립팅(scripting)이 제공하지 못했던 튜링-완전(Turing-completeness), 가치 인지능력(value-awareness), 블록체인 인지능력(blockchain-awareness), 상태(state)개념 등을 포함함으로써 가능해졌습니다.


이더리움 어카운트


이더리움에서 상태(state)는 어카운트(account)라고 하는 오브젝트(object)들로 구성되어있습니다. 각각의 어카운트 오브젝트는 20바이트의 주소와, 값과 정보를 직접 전달해 주는 상태변화(state tansition)을 가지고 있으며, 아래와 같이 4개의 필드 정보로 구성됩니다.


  • 논스(nonce) : 각 트랜잭션이 오직 한번만 처리되게할 수 있는 일종의 카운터 역할 수행

  • 이더(ether) : 어카운트의 현재 잔고

  • 계약 코드 : 계약 코드 (존재할수도, 존재하지 않을수도 있음)

  • 저장 공간 : 초기 설정 값, 즉 default 상에는 비어있는 정보


이더는 이더리움의 기본 암호-연료(cryto-fuel) 이며, 트랜잭션 수수료를 지불하는데 사용됩니다. 이더리움의 어카운트 정보는 프라이빗 키에 의해 통제되는 외부 소유 어카운트(Externally Owned Accounts)와 컨트랙트 코드에 의해 통제되는 컨트랙트 어카운트(Contract Accounts) 두가지 종류로 구성됩니다.

프라이빗 키에 의해 통제되는 외부 소유 어카운트는 아무런 코드 정보도 가지고 있지 않으며, 외부 소유 어카운트에서 메시지를 보내기 위해서는 새로운 트랜잭션을 생성하고, 서명(signing)을 해야합니다. 컨트랙트 코드에 의해 통제되는 컨트랙트 어카운트는 메시지를 받을 떄마다, 메시지를 읽거나, 내부 저장 공간에 기록 하거나 다른 메시지들을 보내는 컨트랙트들을 차례로 생성하게됩니다.

이더리움에서 컨트랙트는 수행되거나 컴파일 되어져야하는 어떤 것이라기 보다는, 이더리움 프레임워크 환경안에 서 살아있는 일종의 자율 에이전트(autonomous agent)로서, 메시지나 트랜잭션이 도착했을 경우 항상 특정한 코드를 실행하고, 자신의 이더 잔고와, 영속적인 변수들을 추적하기 위해서 자신의 키/값 저장소를 직접적으로 통제하는 역할을 수행하게됩니다.


메시지와 트랜잭션


이더리움에서는 외부 소유 어카운트가 보낼 메시지를 가지고 있는 서명된 데이터 패키지를 트랜잭션(transaction) 이라고 하며, 아래와 같은 구성요소를 포함하고 있습니다.


  • 메신지 수신처

  • 발신처를 확인할 수 있는 서명

  • 선택적(optional) 데이터 필드

  • STARTGAS 값, 트랜잭션 실행이 수행되도록 허용된 최대 계산 단계수

  • GASPRICE 값, 매 계산마다 발신처가 지불하는 수수료


메신저 수신처, 발신처를 확인할 수 있는 서명, 선택적(optional) 데이터 필드는 암호 화폐에서 거의 표준처럼 사용되는 값입니다. 여기서 데이터 필드는 초기 값으로 설정된 특별한 기능(function)은 가지고 있지 않습니다. 하지만 버추얼 머신(virtual machine)은 컨트랙트가 이 데이터에 접근할 때 사용할 수행코드(opcode)를 가지고있습니다.

예를 들어, 블록체인 위에 도메인 등록 서비스 기능의 컨트랙트가 있다고 가정할 경우 컨트랙트에 보내지는 데이터 필드는 두개의 필드가 있다고 해석할 수 있습니다. 첫번째 필드는 등록하고자 하는 도메인이며, 두번째 필드는 IP 주소 정보 입니다. 컨트랙트는 메시지 데이터로부터 이 값들을 읽어서 저장소 내 적당한 위치에 저장하게됩니다.

STARGAS 와 GASPRICE 필드는 이더리움의 앤티-서비스거부(anti-DoS) 모델에 있어서 매우 중요한 역할을 수행합니다. 코드내의 우연적이거나 악의적인 무한 루프, 또는 계산 낭비를 방지하기 위해 각각의 트랜잭션은 사용할 수 있는 코드 실행의 계산 단계 수를 제한해야합니다.

계산의 기본 단위는 gas이며, 보통의 연산 과정은 1 gas의 비용이 소요되나, 어떤 연산은 더 비싼 계산 비용이 발생할 수 있고, 특히 상태를 저장하는 데이터의 양이 많을 수록 더 많은 gas 비용이 필요하게 됩니다. 또한 트랜잭션 데이터에 있는 모든 바이트는 바이트당 5 gas의 수수료가 소요됩니다.

시스템에서 이러한 수수료의 정책은 어떤 공격자가 계산, 밴드위스, 저장소 등을 포함해 그들이 소비하는 모든 리소스에 비례하여 강제로 수수료를 지불하게 함으로써 악의적인 공격을 방지하기 위한 정책입니다. 따라서 네트워크 자원을 많이 소모하는 트랜잭션은 대략 증가분에 비례한 gas 수수료를 가지고 있어야합니다.


마무리


이더리움 백서 5편에서는 드디어 본격적인 이더리움에 대한 설명이 시작되었습니다. 이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는 것입니다.


이더리움에서는 튜링-완전(Turing-completeness), 가치 인지능력(value-awareness), 블록체인 인지능력(blockchain-awareness), 상태(state)개념 등을 포함함으로써 분산 어플리케이션 제작을 위한 프로토콜을 만들 수 있다고 설명하고 있습니다. (이더리움 백서 4편에서 비트코인의 한계점으로 지목되었던 부분들을 어떻게 해결한것인지에 대한 내용입니다.)


이더리움 프레임 워크에서 사용할 수 있는 암호화폐의 이름을 흔히 이더리움이라고 알고 있지만, 정확한 암호 화폐의 이름은 이더(ehter)이며, 크게 EOA(Externally Owned Accounts : 외부 소유 계정)와 CA(Contracts Accounts : 컨트랙트 계정) 2가지 타입으로 분류할 수 있습니다.(EOA와, CA가 어떤 역할을 수행하고, 무슨 차이가 있는지에 대한 설명은 하나의 포스팅으로 다뤄야하는 주제이니 만큼 추후 별도의 포스팅으로 다루겠습니다.)


비트코인 스크립트는 거래 증명시 무한 루프에 빠지는것을 방지하고자, while이나 for와 같은 순환(loop) 명령 카테고리를 사용할 수 없지만, 이더리움에서는 이 문제를 gas라는 수수료로 해결할 수 있다고 주장하고 있습니다.

어떤 공격자가 계산, 밴드위스, 저장소 등을 포함해 그들이 소비하는 네트워크의 모든 리소스에 비례하여 강제로 수수료를 지불하게 함으로써 악의적인 공격을 방지할 수 있다는 의미입니다.


최종적으로 조금 정리를 해보자면..


  1. 이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는것이다.

  2. 튜링-완전(Turing-completeness), 가치 인지능력(value-awareness), 블록체인 인지능력(blockchain-awareness), 상태(state)개념 등을 가짐으로써 분산 어플리케이션 제작을 위한 프로토콜을 만들 수 있다.

  3. 이더리움에서 화폐는 이더(ether)로 표기되며, EOA와 CA 두가지 타입의 계정으로 분류된다.

  4. 수수료(gas) 정책이 필요한 이유는 악의적인 공격자가 네트워크 리소스를 소비하는 만큼 강제로 수수료를 지불하게 함으로써 악의적인 공격을 방지할 수 있었다.

  5. 이더리움은 수수료 정책을 통해 튜링-완전(Turing-completeness)을 가능하게 하였다.


백서의 내용과, 부족했던 설명을 최대한 이해하기 쉽게 풀어서 작성했지만, 부족한 부분들이 참 많이 있는것 같습니다. 정리를 하면서 어느 정도 완벽히 이해한 부분도 있고, 아직 이해가 완벽히 되지 않은 부분들도 있습니다만.. 이더리움 백서를 계속해서 정리하도록 하겠습니다.(공부는 계속되어야하니간요!)

부족한 부분들은 이더리움 백서 시리즈가 완료되는 시점에서 다시 정리하여 포스팅하도록 하겠습니다. 다음 이더리움 백서 6편에서는 메시지(Message)에 대한 설명, 여력이된다면 코드 실행 부분까지 정리하여 찾아뵙도록 하겠습니다.


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


혹시나 이더리움 백서를 먼저 읽고 싶으신분은 아래의 링크를 통해 이더리움 백서를 먼저 확인해보시는것도 좋을것 같습니다.



[참고문헌]


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

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

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





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


이더리움 백서를 쉽게 이해할 수 있도록 풀어서 설명하는 연재물을 작성하고 있습니다. 오늘 포스팅 내용은 비트코인의 스크립팅과 관련된 내용이며, 이번편을 마지막으로 비트코인에 대한 설명이 끝나고, 다음편 부터는 본격적인 이더리움에 대한 설명으로 넘어가게됩니다. 혹시 지난 포스팅을 읽지 못하셨던분은 먼저 아래의 포스팅을 읽어보시는것을 추천드립니다.



Remind


머클 트리는 이진트리의 일종으로 하나의 루트 노드의 집합이며, 블록의 용량을 효율적으로 활용할 수 있는 데이터 구조를 가지고 있습니다. 블록체인 기술을 이용한 응용 사례로는 네임 코드, 컬러드 코인, 메타코인 등 다양한 응용 사례가 있었습니다.

일반적으로 합의 프로토콜을 개발하기 위해서는 독립적인 네트워크를 구현하는 방식, 기존의 시스템인 비트코인과 연동되는 새로운 프로토콜을 만드는 방식으로 나누어볼수 있으며, 전자는 네임 코인과 같은 응용사례에서 상당히 성공적이었지만, 상태 변환과 네트워킹 코드를 직접 개발하고, 독립적인 블록체인을 구동 시켜야 하는 기술적인 어려움이 있으며, 후자의 방식 메타 프로토콜 방식으로, 자체 프로토콜을 지원하지 못하기 때문에 SPV 특징을 사용하지 못한다는 단점이 있으며 비트코인을 기반한 메타-프로토콜의 라이이트(light) 클라이언트 구현은 믿을만한 서버에 의지하는 형편입니다. 우리가 암호화폐를 만든 가장 중요한 목적은 제 3자의 신용기구의 필요성을 없애는것이었다는걸 되새겨본다면, 이것은 아주 분명하게도, 차선의 결과가 될뿐입니다.


스크립팅


비트코인 프로토콜은 별도의 확장 없이도 낮은 수준의 "스마트 계약"을 구현할 수 있습니다. 비트코인의 UTXO는 공개키로 획득할 수 있지만, 추가적으로 단순 스택-기반 프로그래밍 언어로 표현되는 더 복잡한 스크립트로도 획득할 수 있습니다. 공개키 소유권 메커니즘도 스크립트를 통해 실행되며, 스크립트는 타원곡선서명을 '입력'으로 받아 그 거래와 UTXO를 가진 주소에 대한 검증을 하게되며, 검증에 성공했을 경우 1을, 실패했을 경우 0을 출력하게됩니다. 즉 다양한 사용 사례에 대해 좀 더 복잡한 스크립트들을 만들 수 있다는 의미입니다.

예를들어, 주어진 세개의 개인 키 가운데 두 개로부터 서명을 받아야만 승인이 되도록 스크립트를 구성할 수 있으며, 이런 스크립트는 회사 계정, 보안 저축 계정, 상업 공탁 상황등에 유용하게 쓰일 수 있습니다. 또한 스크립트를 통해 어떤 조건, 즉 특정 계산 문제의 답에 대한 포상금을 지불하는 방식으로 쓰일 수 있습니다.

만약 비트코인에 상응하는 도기 코인을 나에게 보냈다는 SPV 증명을 제공한다면, 해당 비트코인의 UTXO를 보낸 사람의것으로 만들 수 있는 스크립트를 구현할 수 있습니다. 즉 근본적인 탈중앙화된 상호-암호화폐 교환을 가능하게할 수 있다는 의미입니다.


비트코인의 스크립트 언어는 한계점이 있다.


비트코인 스크립트의 한계점


튜링불완전성

비트코인 스크립트 언어로 할 수 있는 작업은 많지만, 모든 경우의 프로그래밍을 지원할 수 없습니다. 특히나 while이나 for와 같은 순환(loop) 명령 카테고리를 사용할 수 없으며, 순환 명령어를 없앤 이유는 거래 증명시 무한 루프에 빠지는것을 방지하기 위함입니다.

이론적으로 튜링 불완전성은 프로그래머가 극복할 수 있는 장애물이기는합니다. 그 이유는 어떤 순환 명령이든 여러 차례 if 구문을 사용함으로써 구현이 가능하기 때문입니다. 하지만 이러한 방법은 공간 비효율적인 프로그램이 되며, 타원곡선 서명 알고리즘을 실행할 경우 코드 안에 있는 곱셈을 모두 개별적으로 256번 반복하는 작업이 필요함으로 아주 비효율적인 프로그램이됩니다.


Value-blindness

UTXO 스크립트만으로 인출 액수를 세밀하게 통제할 방법이 없습니다. 신탁 계약의 강력한 실용 사례라 할 수 있는 헷지 계약으로 예를 들어보겠습니다. 만약 A와 B가 $1000의 금액만큼의 BTC를 공동 계좌에 입금하고, 30일 후 BTC의 가격이 상승하게될 경우 자동으로 A에게는 원금인 $1000의 금액에 해당하는 BTC를 돌려 받고, B에게는 이익금인 공동계좌의 나머지 잔금을 입금 받을 수 있는 그런 계약을 맺고 싶다고 가정해보겠습니다.

이러한 계약에는 1 BTC가 미국 달러로 얼마인지 정해줄 제 3자가 필요합니다. 하지만 이런 계약이 실현 가능하다면 지금 현존 하는 중앙 집권적인 금융 시스템 아래에서도 고도로 발전된 계약 형태라고 볼 수 있을 것입니다. 현재 비트코인의 UTXO는 인출액 전부가 송금되거나, 말거나 밖에 선택할 수 없으며, 즉 세부 작은 단위로 나눠질 가능성을 포함할 수 없다는 의미입니다.

앞선 헷지 계약의 거래를 실행할 유일한 방법은 UTXO의 액면가 단위를 아주 다양하게 양산하고 (예를 들어 1부터 30까지의 모든 자연수 k에 대해 2의 k승의 1 UTXO를 만듦) A가 B에게 이중에서 필요한 금액에 맞는 것을 선택해서 보내게 하는 방식과 같이 매우 비효율적인 편법을 사용하는 길 뿐입니다.


상태 표현의 한계점(다양한 상태를 표현할 수 없음)

UTXO가 표현할 수 있는 상태는 사용되었거나, 안되었거나 두가지 방법만 존재합니다. 이 두가지 상태 이외으ㅔ 다른 어떤 내부적 상태를 가지는 다중 계약이나 스크립트를 생성할 수 없으며, 이러한 환경은 분산 환전 거래나 이중 암호 실행 프로토콜과 같은 다중 계약을 어렵게 만듭니다. 즉, UTXO는 단순하고 1회적인 계약에만 이용될 수 있으며, 분산조직과 같은 더 복잡한 "상태적(stateful)" 계약에는 활용될 수 없으며, 나아가 메타 프로토콜을 적용하기 어렵게 만듭니다.


블록체인을 해독할 방법이 없다(Blockchain-blindness)

UTXO는 논스(Nonce), 타임스탬프, 이전 블록해시 같은 블록체인 자료를 해독하지 못합니다. 이 단점으로 인해 스크립트 언어 속에 잠재적으로 가치있을 무작위성이 빠지게됩니다. 그래서 도박이나 여러 다른 분야의 어플리케이션을 만들기 어려운 한계점이 있습니다.


정리하자면, 발전된 어플리케이션을 만드는 방법은 3가지 접근 방법이 있습니다. 첫번째는 독립적인 블록체인을 만드는 것이고 두번째는 비트코인에 이미 내재된 스크립트를 이용하는 것이며 세번째는 비트코인상에서 작동되는 메타-규약을 건설하는 것입니다. 독립적인 블록체인을 만들 경우 무한히 자유로운 프로그램을 만들 수 있겠지만 개발 기간, 초기 셋업 자원, 보안 등의 비용이 발생하며, 비트코인에 내재된 스크립트를 이용하면 실행이 간단하고 표준화된 장점이 있지만, 이용범위가 제한적입니다. 또한, 메타 규약을 쓰는 것은 간단하긴 하지만, 확정성의 결함을 감수해야하는 문제점이 있습니다.


이더리움을 통해 우리는 개발하기 쉽고, 더 강력한 라이트 클라이언트 기능을 가지면서 경제적인 개발 환경과 블록체인 보안을 공유할 수 있는 어플리케이션을 만들 수 있도록 지원하는 alternative framework를 건설하고자 합니다.


마무리


본격적인 이더리움에 대한 설명의 시작부에서 이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는것이라고 명시되어있습니다. 오늘 학습한 백서의 내용에서는 비트코인의 스크립트의 한계점인, 튜링 불완전성, UTXO의 상태표현의 한계점, 블록체인을 해독할 수 없는 문제점 등을 설명하면서 비트코인의 스마트 계약의 한계점에 대한 문제점을 지적하였습니다. 그리고 이더리움에서는 이제 이러한 문제점을 어떻게 해결하여, 분산 어플리케이션 제작을 위한 대체 프로토콜을 개발할것인지에 대한 내용이 나올것으로 예상됩니다.


백서의 내용중 부연설명이 더 필요해보이는 단어들은 따로 취합하고 있습니다(예를 들어, 네임 코인, 컬러드 코인, 메타 코인, 사이드 체인, 튜링 불완전성 등) 이런 부분은 이더리움 백서 포스팅이 끝나는 시점에서, 개별 포스팅으로 진행할 예정입니다.

드디어 비트코인, 그리고 비트코인 응용 사례를 통해 왜 이더리움 개발이 필요했는지에 대한 서술이 끝났으며, 다음 시간부터는 본격적인 이더리움에 관한 설명으로 이어지게됩니다. 앞서 작성한 이더리움 백서 1~3편을 보지 않으셨던 분들은 꼭 정독해보시는것을 추천드립니다. (오랜시간이 소요되지 않습니다!)


혹시나 이더리움 백서를 먼저 읽고 싶으신분은 아래의 링크를 통해 이더리움 백서를 먼저 확인해보시는것도 좋을것 같습니다.



이상 긴 글 읽어주셔서 감사합니다!(보팅, 리스팀, 팔로워는 제게 큰 힘이됩니다!)


[참고문헌]


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





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


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


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

+ Recent posts