관리 메뉴

개발이야기

[백서 정리] 이더리움 백서 (Ethereum White Paper) 본문

블록체인 /백서 정리

[백서 정리] 이더리움 백서 (Ethereum White Paper)

안성주지몬 2018. 12. 20. 00:00

이더리움 백서 요약


비트코인 역사

- 2009년 ‘사토시 나카모토’에 의해 비트코인이 개발되었으며 공개키 암호방식을 통한 소유권 관리를 위해 사용되던 기존의 알고리즘을 ‘작업 증명(proof of work)’이라고 알려진 합의 알고리즘과 결합함으로써 탈중앙화된 화폐를 구현할 수 있게 되었다.

- 작업증명의 기반이 되는 작동방식은 두 가지 문제를 동시에 해결하기 때문에 매우 혁신적이었다.


첫째, 간단하면서도 상당히 효과적인 합의 알고리즘 제공. 즉, 네트워크상에 있는 모든 노드들이 비트코인의 장부상태(state of the Bitcoin ledger)에 일어난 표준 업데이트의 집합(a set of canonical updates)에 공동으로 동의할 수 있다.

-> P2P, 분산 네트워크 상에서 존재하던 신뢰도 문제해결


둘째, 누구나 합의 프로세스에 참여할 수 있도록 허용. 즉, 합의결정권에 대한 정치적 문제를 해결할 수 있을 뿐만 아니라 동시에 시빌공격(sybil attacks)도 방어해줄 수 있는 메커니즘을 제공했다. 이후로, 지분 증명(proof of stake)이라는 새로운 방식의 합의 알고리즘이 등장했다.

*시빌 공격: 시빌 공격(Sybil Attack)은 네트워크를 해킹하기 위한 공격 방법의 일종으로, 어떤 특수 목적을 이루기 위해 한 사람의 행위를 여러 사람의 행위인 것으로 속여 네트워크를 공격하는 방법이다.


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

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

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

채굴

- 비트코인의 분산 합의 과정은 네트워크에 "블록(blocks)"이라 불리는 트랜잭션 패키지를 계속 생성하고자 시도하는 노드들을 필요로 한다. 이 네트워크는 약 10분마다 하나의 블록을 생성하도록 계획되어 있고 각 블록은 타임스탬프, 논스(nonce), 이전 블록에 대한 참조(이전 블록의 해시), 그리고 이전 블록 이후에 발생한 모든 트랜잭션의 목록을 포함한다. 이 과정을 통해 지속해서 성장하는 블록체인이 생성되게 되는데, 비트코인 장부의 최신상태(state)를 나타내기 위해 지속적인 업데이트가 이루어진다.

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

- 작업 증명의 목적 = 블록 생성을 계산적으로 어렵게 만들어서 sybil 공격자들이 마음대로 전체 블록체인을 조작하는 것을 방지하기 위함

how? SHA256 함수는 예측 불가능한 유사난수 함수(pseudorandom function)로 설계되어 있기 때문에 유효 블록을 생성하기 위한 유일한 방법은 블록 헤더의 논스(nonce) 값을 계속 증가시키면서 블록 해시 값이 목표값 보다 작은지에 대한 검증을 반복

머클트리(Merkle tree)

- 머클트리란? 이진트리(binary tree)의 일종으로 하나의 루트 노드의 집합이며, 블록의 용량을 효율적으로 활용할 수 있는 데이터 구조를 가지고 있다.

- 머클트리의 목적 = 어떤 블록의 데이터가 분리돼서 전달 될 수 있도록 하는 것

해시 함수의 특징으로 머클 트리 하위 노드들의 해시 값은 상위 노드에 영향을 주며, 어떤 악의적인 유저가 머클 트리 최하위에 있는 트랜잭션 정보를 가짜로 바꿔치기 하면 상위 부모들의 해시 값이 변경되고, 머클 루트 값 또한 변경된다. 머클 루트 정보가 변경될 경우 블록 해시 정보 또한 변경되어 해당 블록은 기존의 블록과 전혀 다른 블록으로 인식된다.


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

네임코인

컬러드 코인

메타코인

- 합의 프로토콜을 개발하기 위한 방법

독립적인 네트워크 만들기

비트코인 시스템과 연동되는 새로운 프로토콜 만들기


스크립팅

비트코인 프로토콜은 별도의 확장 없이도 낮은 수준의 "smart contract"을 구현할 수 있다.

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

1) 튜링 불완전성

모든 경우의 프로그래밍을 다 지원하지는 않는다. 특히 while이나 for와 같은 순환(loop) 명령 카테고리가 빠져 있다.

2) 가치무지하다

UTXO 스크립트만으로는 인출 액수를 세밀하게 통제할 방법이 없다.  UTXO를 작은 단위로 표현할 수 없기 때문이다.

3) 다양한 상태를 표현할 수 없다(Lack of State)

UTXO가 표현할 수 있는 상태는 사용되었거나 안 되거나 둘 뿐이다. 그렇기 때문에 이 두가지 상태 이외에 다른 어떤 내부적 상태를 가지는 다중 단계 계약이나 스크립트를 만들 수가 없다

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

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

이더리움

- 이더리움 목적 =비트코인에서 불가능했던 순환명령이 가능도록하여 분산 어플리케이션을 구현할 수 있는 기반을 만드는 것이다.

- 이더리움은 튜링 완전 언어를 내장하고 있는 블록체인을 사용함으로써 이 목적을 이루고자 한다.

- 누구든지 이 언어를 사용해 스마트 컨트랙트(어떤 값을 저장하고, 특정한 조건들을 만족했을 때만 그 값을 얻을 수 있게 하는 일종의 암호 상자), 분산 어플리케이션을 작성하고 소유권에 대한 임의의 규칙, 트랜잭션 형식(transaction format), 상태변환 함수(state transition function) 등을 생성 가능하다.


이더리움 어카운트

이더리움에서 상태(state)어카운트(account)라고 하는 오브젝트(object)들로 구성된다.

- 각각의 어카운트 오브젝트는 20바이트의 주소와, 값과 정보를 직접 전달해 주는 상태변화(state tansition)을 가지고 있으며, 아래와 같이 4개의 필드 정보로 구성된다.

논스(nonce) : 각 트랜잭션이 오직 한번만 처리되게할 수 있는 일종의 카운터 역할 수행 (EOA에서는 트랜잭션이 생성될 때 1씩, CA에서는 계약을 생성할 때 1씩 증가한다.)

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

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

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

- 이더리움의 어카운트 종류는 프라이빗 키에 의해 통제되는 외부 소유 어카운트(Externally Owned Accounts)와 컨트랙트 코드에 의해 통제되는 컨트랙트 어카운트(Contract Accounts) 두가지 종류로 구성

메시지와 트랜잭션

- 트랜잭션이란? 외부 소유 어카운트가 보낼 메시지를 가지고 있는 서명된 데이터 패키지.

- 트랜잭션의 구성요소

•메시지 수신처

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

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

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

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

메시지란? 따로 저장될 필요가 없는 이더리움의 실행 환경에서만 존재하는 가상의 오브젝트

- 컨트랙트는 다른 컨트랙트에게 “메시지”를 전달할 수 있다.

메시지의 구성요소

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

•메시지 수신처

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

•선택적 데이터 필드

•STARTGAS 값


1. 트랜잭션이 형식, 서명, 논스가 발신처 어카운트 논스와 일치하는지 체크

2. STARTGAS * GASPRICE로 수수료 계산 후 서명으로부터 발신처주소 결정.

발신자 논스를 증가 후 발신처 잔고확인(잔고부족이면 오류)

3. GAS = STARTGAS로 설정 후 바이트당 GAS양 차감

4. 발신처에서 수신처로 트랜잭션 값을 보냄. 수신처가 존재하지 않으면 새로 생성. 수신처가 컨트랙트이면 컨트랙트 코드 수행 or 가스가 모두 소모될 때 까지 수행

5. 잔고부족이나 gas부족이면 모든 상태를 원상태로 돌려놓는다. 수수료는 지불된다.

6. 남은 gas는 발신처에게 돌려주고, 소모된 gas에 대한 수수료는 채굴자에게 지불.



코드실행

이더리움 컨트랙트 코드는 “이더리움 버추얼 머신 코드" 또는, "EVM 코드"로 불리는 스택 기반의 바이트 코드 언어로 작성된다.

컨트랙트 코드는 연속된 바이트로 구성되어 있고, 각각의 바이트는 연산(operation)을 나타낸다.

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

블록체인과 채굴

  • 블록에는 트랜잭션 리스트와 가장 최신의 상태(state) 복사본을 가지고 있으며, 블록 넘버difficulry 정보도 블록내에 저장된다.

  • 패트리시아 트리(Patricia tree)로 알려진 트리는 머클트리 개념을 수정하여 노드를 효율적으로 삽입하거나, 삭제할 수 있도록 도와줍니다. 또한, 모든 상태 정보가 마지막 블록에 포함되어 있기떄문에 전체 블록체인 히스토리를 모두 저장할 필요가 없으며, 이러한 방법을 만약 비트코인에 적용한다면 5~20배의 저장 공간 절약 효과가 생길것입니다.

어플리케이션(Application)

1) 금융 어플리케이션

-> 돈과 직접적으로 연관된 컨트랙트를 계약참여자로 하여금 보다 강력하게 설정-관리

2) 준금융 어플리케이션

-> 금전이 관여되어 있지만, 상당부분 비(非)화폐적인 면이 존재하는 계약을 위한 어플리케이션

3) 금융과 관련없는 어플리케이션

토큰 시스템

- 블록체인 토큰 시스템은 다양한 형태의 거래시스템을 네트워크상에서 구현할 수 있도록 도와주는 어플리케이션들을 갖고 있다

토큰 시스템을 이해하는 데에 핵심 2가지

•모든 화폐 혹은 토큰시스템은 근본은 결국 한 가지 오퍼레이션만을 수행하는 데이터베이스이다.

•A가 최소 x 단위의 화폐를 보유하고 있는 상태에서, A로부터 x단위의 화폐/토큰을 차감하고, 차감된 x단위의 화폐/토큰을 B에게 지급한다(A가 최종적으로 이 거래를 승인 한다).

=> 이더리움에서 유저는 바로 위의 로직을 컨트랙트에 반영시키기만 하면 된다.

금융 파생상품 및 가치안정통화

파생상품은 "스마트 컨트랙트"의 가장 일반적인 형태의 어플리케이션이며, 코드로 실행할 수 있는 가장 간단한 형태의 어플리케이션 중 하나.

금융 컨트랙트를 실행하는데 가장 주된 어려움은 계약에서 규정하는 자산에 대한 시세를 외부에서 참조해야 한다는 것입니다. 예를 들어 이더 혹은 기타 가상화폐와 USD의 변동성에 대해 헷지(hedge)하는 어플리케이션이 있을 경우, 이 헷지 컨트랙트를 실행하기 위해서는 ETH/USD의 환율을 제공 하는 컨트랙트가 필요합니다. 환율을 제공 받기 위한 가장 쉬운 방법은 주식시장의 NSDAQ와 같은 제 3자가 실시간으로 제공하는 "데이터 필드" 컨트랙트를 통해 제공받을 수 있으며, 환율 정보는 필요할때마다 업데이트 할 수 있어야합니다. 또한 여타 컨트랙트들과 환율에 대한 메시지를 주고 받을 수 있는 인터페이스를 제공할 수 있어야함


이를 해결하기 위해 이더리움에서 헷지 컨트랙트는 다음과 같은 구조를 가지게 됩니다.


  1. A가 1000 이더를 입금할 때까지 기다린다

  2. B가 1000 이더를 입금할 때까지 기다린다

  3. 입금된 이더의 달러가치를 계산하기 위해 환율 Data feed 컨트랙트로 쿼리를 보냄으로써 가치를 계산하고, 계산된 데이터를 $X라고 가정 한다.

  4. 30일 이후, 당시의 환율을 적용한 금액을 계산하여 A에게는 $X를 송금하고, 당시 총금액에 나머지를 B에게 송금하도록 A 또는 B가 컨트랙트를 활성화 시킨다.


신원조회 / 평판 시스템(Identity and Reputation Systems)

최초의 알트코인인 네임코인은 비트코인과 유사한 블록체인을 이용하여 사용자가 공공DB에 다른 데이터와 함께 본인의 이름을 등록하는 명의등록 시스템을 만들었다. 네임코인의 주된 사례는 "bitcoin.org"와 (Namecoin의 경우에는 "bitcoin.bit") 도메인명을 매핑하는 DNS 시스템이며, 또 다른 사용의 예로는 이메일 인증, 평판 시스템 등이 있다.

명의 등록 컨트랙트는 매우 단순하게도, 이더리움 네트워크 안에서 저장되어 있는, 추가할 수는 있지만 수정하거나 지울 수 없는 데이터 베이스의 역할만 수행한다. 누구든지 소량의 이더를 이용하여 본인의 명의를 등록할 수 있으며, 한 번 등록할 경우 영구적으로 보존한다.

분산형 파일 저장소(Decentralized File Storage)

분산형 컨트랙트 작동 과정

1.유저가 업로드하려는 데이터를 블록으로 잘라낸다.

2.프라이버시를 위해 해당 데이터를 암호화 시킨다.

3.그 데이터로 머클트리를 만든다.

4.N개의 블록마다 컨트랙트 코드로 접근 가능한 전 블록의 해쉬에 기반하여 무작위 방식으로 머클트리 인덱스를 뽑는다.

5.유저가 올린 파일에 해당 트리의 특정 인덱스에 대하여, 해당 데이터를 저장해주겠다는 첫 주체에게 x 이더를 지불한다.

탈중앙화된 자율조직(Decentralized Autonomous Organizations)

탈중앙화된 자율조직이란 ? 특정한 구성원 또는 주주들을 가지고 있는 가상 독립체(virtual entity), 즉 다수의 구성원의 동의하에 조직 자금운용 권한 및 코드 변경 권한을 갖는다는 것이며, 구성원들은 그 조직의 운영자금을 어떻게 배분할지를 공동으로 결정하는 것

DAO를 제작하기 위한 가장 간단한 디자인 => 구성원 2/3이 동의 혹은 거부 하였을 경우 저절로 코드가 변경되는 컨셉


추가적인 어플리케이션들(Further Applications)

- 예금용 “전자지갑”

ex) 펀드를 안전하게 보관하고 싶은 Alice는 펀드를 잃어버리거나, 누군가 자신의 Private Key를 해킹할것을 걱정한다고 가정했을때, Alice는 자신이 소유하고 있는 이더를 Bob이라는 은행과 아래와 같은 조건의 컨트랙트를 생성한다.

•Alice는 혼자서 하루에 최대 1%의 자금을 인출할 수 있다.

•Bob만으로는 하루에 자금의 최대 1%를 인출할 수 있지만, Alice는 Bob의 출금 권한을 박탈할 수 있다.

•Alice와 Bob은 함께 어떤 것이든 인출할 수 있다.

- 작물보험

시세가 아닌 날씨 데이터 피드를 이용하여 파생상품을 손쉽게 만들 수 있다. 만약 강수량 데이터와 역비례하게 지불금이 산출되는 파생상품이 있고, 농부는 가뭄이 있을 것을 대비하여 이 파생상품을 구매하게 된다면 보험과 같은 역할을 수행할 것이고 이러한 어플리케이션은 자연재해 일반에 대한 보험 상품으로 확대될 것이다.

- 탈중앙화된 데이터피드

쉘링코인 (SchellingCoin)" 프로토콜을 사용하여, 변량 (Difference)을 다루는 금융계약을 탈중앙화된 방식으로 운용할 수 있다. 쉘링 코인은 어떤 특정한 기준치 값에 대한 명백한 참 값(turth)을 도출하기 위해 사용된다.

- 스마트 멀티시그 공탁 계좌

비트코인에서는 멀티시그 트랜잭션을 만들 수 있다. 멀티시그 트랜잭션은 5개의 키 중 3개의 키를 가지고 서명을 해야 출금을 허용하는 방식의 트랜잭션을 의미한다. 이더리움은 보다 다양한 방법의 멀티시그 트랜잭션을 제공할 수 있다.

- 클라우드 컴퓨팅

EVM 기술을 사용하여 검증 가능한 컴퓨팅 환경을 구축할 수 있다. 사용자는 다른 사용자에게 연산을 수행하도록 요청한 후 랜덤한 시점에 연산을 수행한 주체에게 미리 설정된 연산 체크포인트가 올바른지에 대한 증명을 요구할 수 있다.

- P2P 도박

가장 단순한 도박 프로토콜은 다음 블록의 해시 값의 차이에 대한 컨트랙트.

ex) 다음 블록의 해시 값이 어떤 값이 나올지 그 누구도 예측할 수 없으며, 블록의 해시 정보 값을 통해 숫자들만 추출하여 모두 합산한 후 합산된 결과 값을 6으로 나누어 어떤 숫자가 나올지 예측하는 주사위 게임과 같은 컨트랙트들이 만들어질 수 있다.


Comments