brunch

매거진 개발실습

You can make anything
by writing

C.S.Lewis

by SKKRYPTO May 31. 2020

[백서 읽어주는 남자] - 이더리움

  

  안녕하세요 스크립토 4기 이정민입니다. 이번에 알아볼 백서는 이더리움입니다. 이더리움은 블록체인 기술을 기반으로 스마트 계약 기능을 구현하기 위한 분산 컴퓨팅 플랫폼입니다. 비트코인을 제외한 알트코인 중 아마 가장 많은 인지도를 갖고 있을 것이라고 생각하는데요, 비트코인을 기반으로 만든 가장 대표적인 알트코인이며 ‘비트코인 2.0’이라고도 부른다고 합니다. 저는 EthereumKorea에서 번역을 한 한글판 백서를 보았습니다.


우선 이 첫장에서는 비트코인이 나오면서 분산 합의 수단으로서의 블록체인 기술에 대한 관심이 높아지기 시작하였으며, 이에 따라 컬러드 코인, 스마트 자산, 네임코인, 스마트 컨트랙트, DAO 등등에 대한 시스템에 대해 소개하고있습니다. 또한 이더리움은 완벽한 튜링완전 프로그래밍 언어를 제공하여 앞에 언급한 시스템들을 구현할 수 있도록 해주며 다른 어플도 매우 쉽게 만들 수 있도록 도와준다고 합니다.


다음은 목차입니다.


이더리움의 목차는 역사, 이더리움, 어플리케이션들, 기타 이슈들, 결론으로 구성되어 있습니다. 역사 부분에서는 기존 비트코인에 대한 설명이므로 이 부분은 전에 비트코인을 다루었기 때문에 넘어가고 이더리움부터 설명을 하도록 하겠습니다. 비트코인에 대해서 잘 모르시는 분들은 https://brunch.co.kr/@skkrypto/81 이 링크로 들어가 참조를 해주시면 될것 같습니다.



이더리움

    우선 이더리움에 대한 소개입니다. 이더리움은 기존의 비트코인과 다르게 튜링 완전 언어를 내장하고 있고, 누구든지 언어를 사용하여 스마트 컨트랙트와 Dapp을 만들어서 소유권에 대한 임의의 규칙과 같은 다양한 기능들을 생성할 수 있다고합니다. (여기서 튜링 완전 언어란 어떤 프로그래밍 언어나 추상 기계가 튜링 기계와 동일한 계산 능력을 가진다는 의미입니다. 즉, 이것은 계산적인 문제를 그 프로그래밍 언어나 추상 기계로 풀 수 있다는 의미이고, Dapp이란 Decentralized app의 약자로 분산형 앱입니다.)


- 이더리움 어카운트 

이더리움에서 상태는 어카운트라고 하는 오브젝트들로 구성되어 있고 이는 다음 4 개의 필드를 가지고 있다고 합니다.


논스

어카운트의 현재 이더 잔고

어카운트 계약 코드

어카운트의 저장 공간


이더리움에서 사용되는 이더(Ether)는 이러한 것들이 돌아가게 만들어 주고 Tx fee 지불에 사용됩니다. 또한 어카운트의 경우 EOA(외부 소유 어카운트)와 CA(컨트랙트 어카운트)가 있으며 EOA의 경우 메시지를 보내기 위해 새로운 TX를 만들고 서명을 해야합니다. CA는 메시지를 받을 때 마다 자신의 코드를 활성화시켜 다양한 행동들을 하게 됩니다.



- 메시지와 트랜잭션

이더리움에서 사용되는 트랜잭션은 EOA가 보낼 메시지를 가지고 있는 서명된 데이터 패키지라고 합니다. 이 TX는 다음과 같이 구성되어 있습니다.


메시지 수신처

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

발신처가 수신처로 보내는 이더의 양

선택적 데이터 필드

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

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


보통 위의 3가지는 표준처럼 사용되는 값이라고 합니다. 다음은 메시지에 대해서 알아보도록 하겠습니다. 컨트랙트는 다른 컨트랙트에게 메시지를 전달할 수 있는데 이는 가상의 오브젝트이며 다음의 것을 포함하고 있습니다.


메시지 발신처

메시지 수신처

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

선택적 데이터 필드

STARTGAS 값


이는 트랜잭션과 다르게 EOA가 아닌 CA에 의해 생성이 되며 컨트랙트가 메시지를 생성하고 실행하라는 명령을 만나면 메시지가 생성됩니다.


- 이더리움 상태 변환 함수

이더리움 상태 변환 함수는 다음과 같이 정의 된다고 합니다.


1. 트랜잭션이 형식에 제대로 맞는지(즉, 올바른 개수의 값을 가지고 있는지) 체크하고, 서명이 유효한지, 논스가 발신처 어카운트의 논스와 일치하는지를 체크한다. 그렇지 않다면 오류를 반환한다. 

2. STARTGAS * GASPRICE 로 트랜잭션 수수료를 계산하고, 서명으로부터 발신처주소를 결정한다. 발신처 어카운트 잔고에서 이 수수료를 빼고 발신자 논스를 증가시킨다. 발신처 잔고가 충분하지 않으면 오류를 반환한다. 

3. GAS = STARTGAS 로 초기화 한후, 트랜잭션에서 사용된 바이트에 대한 값을 지불하기 위해 바이트당 gas의 특정양을 차감한다. 

4. 발신처 어카운트에서 수신처 어카운트로 트랜잭션 값을 보낸다. 수신처 어카운트가 존재하지 않으면 새로 생성한다. 수신처 어카운트가 컨트랙트이면, 컨트랙트의 코드를 끝까지 또는 gas 가 모두 소모될 때 까지 수행한다. 

5. 발신처가 충분한 ‘돈'을 가지고 있지 못해서 값 전송이 실패하거나, 코드 수행시 gas 가 부족하면, 모든 상태 변경을 원상태로 돌려놓는다. 단, 수수료 지불은 제외되고, 이 수수료는 채굴자 어카운트에 더해지게 된다. 

6. 그 외에는, 모든 남아있는 모든 gas에 대한 수수료를 발신처에게 돌려주고, 소모된 gas에 지불된 수수료를 채굴자에게 보낸다. 



- 코드 실행

이더리움 컨트랙트를 구성하는 코드는 EVM 코드로 불리는 바이트 코드 언어로 작성이 되고 스택, 메모리, 컨트랙트의 영속적인 저장소와 같은 세가지 타입의 공간에 접근할 수 있어야 합니다.



- 블록체인과 채굴 

이더리움과 비트코인의 주요 차이점으로 이더리움 블록은 트랜잭션 리스트와 가장 최근 상태의 복사본을 가지고 있습니다. 그것 외에도, 두개의 다른 값인 블록 넘버와 difficulty를 가지고 있으며 이 또한 블록내에 저장됩니다. 기본적인 이더리움 블록 검증 알고리즘은 다음과 같습니다.

1. 참조하고 있는 이전 블록이 존재 또는 유효한지 확인한다.

2. 현재 블록 타임스탬프가 전 블록보타 크면서 현 시점 기준으로 15분 후 보다 작은 값인 지 확인한다.

3. 블록 넘버, difficulty, 트랜잭션 루트, 삼촌 뤁, gas 리미트 등이 유효한지 확인한다.

4. 블록에 포함된 POW(작업증명)가 유효한지 확인한다.

5. S[0]이 이전 블록의 마지막 상태라고 가정하자.

6. TX를 현재 블록의 n 개의 트랜잭션 리스트라고 하고 0부터 n-1에 대해 S[i+1] = APPLY(S[i], TX[i])로 설정한다. app이 오류를 반환하거나, gas가 gaslimit을 초과하면 오류를 반환한다.

7. 채굴자에게 지불된 보상 블록 S[n] 덧 붙인 후 이것을 S_FINAL이라 하자.

8. 상태 S_FINAL의 머클 트리 루트가 블록 헤더가 가지고 있는 최종 상태 루트와 같은지 검증한뒤 이 값이 같으면 블록은 유효하며, 다르면 유효하지 않은 것으로 판단한다.


이 부분에서 뒤의 서술되는 내용으로 패트리시아 트리의 개념이 나오면서 머클 트리 개념을 수정하여 노드를 단지 수정할 뿐아니라 효율적으로 삽입되거나 삭제하여 이러한 작업을 수행할 수 있도록 해준다고 합니다.



어플리케이션

이더리움(스마트컨트랙트)을 이용하여 금융, 준금융 ,분권형 거버넌스를 제작할 수 있다고 소개합니다.


우선 토큰 시스템 부터 보겠습니다.


- 토큰 시스템

토큰 시스템의 핵심은 한 가지 오퍼레이션만을 수행하는 데이터베이스 이며 A가 B에게 토큰을 지급할 때 , 얼마만큼의 화폐를 지급하고 얼마만큼의 화폐를 차감할 지를 비트코인과 다르게 사용한 화폐로 직접 지불할 수 있다는 점에서 비트코인의 UTXO와는 다릅니다.

사례를 보면 A라는 주체로부터 X 단위의 화폐/토큰을 차감하고, 차감한 X 단위의 화폐/토큰을 B에게 지급합니다. 단, 

1. 거래 전, A는 최소 X단위를 보유하고 있고,

2. A가 이 거래를 승인해야합니다.


- 금융파생상품

이 금융 파생삼품은 스마트 컨트랙트의 가장 일반적인 어플리케이션이고 가장 간단한 형태의 app중 하나라고 소개합니다. 이러한 컨트랙트에서 환율을 실시간으로 제공하는 '데이터 피드'컨트랙트를 통해서 환율을 업데이트하고 인터페이스를 제공한다고 하네요.


- 신원조회 / 평판 시스템

이는 블록체인을 이용하여 사용자가 공공 DB에 다른 데이터와 함께 본인의 이름을 등록하는 명의등록 시스템인 네임코인의 예시로 이더리움 네트워크 안에서 영구적으로 보존되는 데이터 베이스의 형태입니다.


이더리움 어플리케이션 예시로 위의 3가지 말고도 분산형 파일 저장소, 탈중앙화된 자율조직(DAO), 예금용 '전자지갑', 작물보험, 탈중앙화된 데이터피드, 스마트 멀티시그 공탁 계좌, 클라우드 컴퓨팅, P2P 도박, 예측 시장, 탈중앙화된 장터 등등이 있습니다.



그 밖의 이슈

이더리움의 관한 그 밖의 이슈들 입니다. 

- 수정된 GHOST 도입

ghost 프로토콜은 메인체인을 선택하는데 있어 가장 긴 체인을 채택하는 알고리즘입니다. 하지만 이러한 프로토콜의 이슈가 되는 부분은 스테일블록(버려진 블록)과 중앙집중화에 대한 문제입니다. 예를 들어 채굴자 A 가 하나의 블록을 채굴했는데, 이 블록이 채굴자 B 에게 전파되기전에 채굴자 B 가 다른 또 하나의 블록을 채굴했다고 하면, 채굴자 B 의 블록은 결국 낭비될 것이고, 네트워크 보안에 기여하지 못하게 될 것입니다. 중앙 집중화에 대한 예시로 두 사용자의 해시파워가 다를경우 높은 해시파워 점유율을 가진 단일한 풀이 채굴 과정에 대한 통제군을 가지게 될 가능성이 높아집니다.


- 수수료

이더리움에서 수수료와 관련해서 흔히 잘못알고 있는 사실은 채굴자가 부담하는 것이 아니라 제 3자가 부담하게 되어 모든 노드들이 트랜잭션을 처리해야하므로 공유지의 비극 문제를 예를 들고 있습니다. 이러한 문제를 언급하면서, 비트코인의 경우 큰 블록크기의 경우 스테일 될 가능성이 높기 때문에 큰 블록크기로 인한 지연 불이익은 비트코인에서 중요한 고려사항이지만 이더리움에는 GHOST 프로토콜 덕분에 중요도가 낮아져서 조정된 블록리미트로 인해 안정적인 기본기준을 얻을 수 있게 합니다.


- 연산과 튜링완전성

연산과 튜링완전성에 대해서 EVM코드를 예시로 JUMP명령어와 재귀 반복을 설명하면서 악의적 공격자가 계약예 무한 순환을 실행하는 코드를 넣었을때, gas와 gas한도로 인해 공격에 대한 방어를 하며 튜링-불완전성은 순환 문제와 악성 공격에 대한 해답이 될 수 없으므로 프로토콜을 튜링-완전하게 놔두는 것이 좋다고 말합니다.


- 통화 그리고 발행

이더리움 네트워크안에서 자체적으로 통용되는 이더라는 화폐에 대한 설명을 간단하게 하면서, 화폐 발행 모델에 대해서 보여줍니다. 백서안의 그림은 다음과 같습니다.


화폐 발행 모델 & 이더 장기 공급 성장률

이 이후의 내용은 재단보유금의 정당성에 대한 내용이고 이더의 형태로 조금이라도 더 가지고 있는 편이 동기부여에 도움이 된다는 주장을 말합니다. 또한 POS로 전환 시 POS 가 발행해야할 신규코인수를 프리세일량의 0.05배수 이내로 줄여, 공급성장률을 수정하면서 POS로 채굴모델을 변경할 것이라고 합니다.




- 채굴 중앙집중화

비트코인의 경우 넌스값을 찾는 방식으로 채굴을 진행하게 되는데 이는 진입장벽을 높이고 채굴방식에 있어서 채굴풀이 제공하는 블록헤더에 의존하여 채굴에 참여하여 약 50%에 근접하는 해시를 간접적으로 통제하고 있습니다. 하지만 이더리움의 경우는 무작위로 선택된 최근 몇 개의 블록내역을 해싱 작업하여 결과 값을 내놓기 때문에 비트코인에서 쓰이는 ASIC 자체가 무용지물이 됩니다. 또한 채굴자들은 작업 시 전체 블록체인을 다운 받아 모든 이체내역을 검증해야하므로 대형 풀이 필요 없게 됩니다.


-       확장성

이더리움은 전체 블록체인 히스토리가 아닌 상태 정보만 가지고 있으면 되는데 이는 시간이 지날수록 처리할 정보는 더 많아졌지만 보관할 정보는 더 적어진다는 의미입니다. 관련 문제로 블록체인의 크기가 점점 커지게 되면 라이트 SPV 노드만 사용하게되어 블록체인의 보안이 떨어지게 될 수도 있는데 이를 해결하기 위해 채굴자들의 완전노드 의무화와 중간상태 트리루트를 이더리움에서 제시합니다. 블완전한 블록을 전파하려는 경우에는 질의-응답프로토콜 기법을 사용해 보완한다고 합니다.



결론

이더리움 프로토콜은 원래 가상화폐의 업그레이드 버전으로 구상되었으나 튜링완전언어를 통해 거의 모든 형태의 이체방식이나 어플리케이션을 만들어낼 수 있도록 지원하고 이러한 화폐적인 차원을 뛰어넘어 분산저장공간, 분산컴퓨팅, 분산예측시장과 같은 새로운 응용개념들을 생성해 컴퓨팅 산업의 효율성을 높였습니다. 또한 이렇게 개인 대 개인간 프로토콜에 경제적인 차원을 입혀서 혁신을 가져왔고, 또한 이더리움의 임의상태변환은 다양한 서비스를 설계하는데 많은 도움을 줄 것이라고 합니다.



여기까지 이더리움에 백서에 대해서 알아보았습니다. 비트코인과 달리 이더리움은 스마트 컨트랙트를 활용하여 기존 단순한 가상화폐의 개념에서 어떤 '계약'을 할 수 있게 해주어 다양한 기능들을 만들어 다양한 문제들을 해결할 수 있도록 만들어 주었습니다. 다음에는 또 다른 백서로 찾아뵙겠습니다. 감사합니다.

매거진의 이전글 도커시리즈-도커와 geth 활용 이더리움 네트워크구축
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari