avatar
Published on

Ethereum) 이더리움 백서 요약

Author
  • avatar
    Name
    yceffort

이더리움 - 차세대 스마트 컨트랙트와 탈중항화 애플리케이션 플랫폼

정확한 원문 해석은 번역본에서 참고하는 것이 더 좋습니다.

이더리움 백서 원문

이더리움

이더리움의 목적은 스크립팅의 개념과 on-chain-meta-protocols, 그리고 알트코인의 기능을 한데 묶은 것이다. 나아가 개발자로 하여금 임의로 합의기반 애플리케이션을 작성할 수 있게 하여 확장성, 표준성, 기능적 완정성, 개발의 편의성을 제공하고 나아가 이러한 패러다임을 한번에 달성할 수 있게 끔 하는 것이다. 이더리움은 블록체인이라는 근본적인 기반을 제공하여 이러한 것을 달성하였다. 누구든지 스마트 컨트랙트, 분산 애플리케이션을 작성하고, 소유권에 대한 임의의 규칙, 트랜잭션형식, 상태변환 함수 등을 생성할 수 있다. 이는 비트코인의 스크립팅 보다 훨씬 더 강력한 기능을 제공하는 것이다.

이더리움 어카운트

이더리움에서 상태는 어카운트라고 하는 오브젝트로 구성되어 있다. 어카운트는 다음 네개로 구성되어 있다.

  • Nonce: 각 트랜잭션이 한번만 처리되게 하는 카운터
  • 현재 어카운트의 이더 잔고
  • 어카운트의 계약코드
  • 어카운트 저장공간 (디폴트로 비어있음)

이더는 이더리움의 기본 내부 암호-연료고, 이는 트랜잭션의 수수료를 지불하는데 사용한다. 이런 어카운트는 두가지 종류가 있다.

  • 외부소유 어카운트: 아무런 코드도 없고, 여기서 메시지를 보내기 위해서는 새로운 트랜잭션을 만들고 서명을 해야 한다.
  • 컨트랙트 어카운트: 메시지를 받을 때 마다 자신의 코드를 활성화 시키고, 메시를 읽거나 내부 저장공간에 기록하고, 다른 메시지를 기록하거나 컨트랙트를 차례로 생성하게 된다. 여기서 컨트랙트란 메시지나 트랜잭션이 도착하면 일정한 코드를 실행하고, 자신의 잔고와 변수를 추적하기위해 키/값 저장소를 통제하는 역할을 한다.

메시지와 트랜잭션

트랜잭션이란 외부 소유 어카운트가 보낼 메시지를 가지고 있는 서명된 데이터 패키지를 의미한다. 트랜잭션은 아래오 같이 구성되어 있다.

  • 메시지 수신처
  • 발신처를 확인할 수 있는 서명
  • 보내는 이더의 양
  • 옵셔널 데이터 필드
  • STARTGAS (트랜잭션 실행이 수행되도록 허용된 최대 계산 수)
  • GASPRICE (수수료)

처음 세 항목은 모든 코인에서 표준적으로 사용되는 값이다. STARTGAS와 GASPRICE는 계산낭비 등을 방지하기 위해 각각 트랜잭션의 코드 실행 단계를 제한 하는 역살을 한다. 보통 1gas이지만, 더 많이 드는 경우도 있다. 트랜잭션의 모든 데이터는 바이트당 5gas 의 수수료가 든다.

메시지

컨트랙트는 다른 컨트랙트에 메시지를 전달 할 수 있다. 메시지는 다음의 것을 포함한다

  • 메시지 발신처
  • 메시지 수신처
  • 메시지와 전달되는 이더
  • 선택적 필드
  • GASPRICE

이더리움의 상태변환 함수

Ethereum-state-transition-function
  1. 트랜잭션이 형식에 맞는지, 서명이 유효한지, Nonce가 발신자의 Nonce와 같은지 확인한다. 그렇지 않으면, 에러를 반환한다.
  2. 거래수수료 STARTGAS * GASPRICE를 계산하고, 서명을 이용하여 발신자의 주소를 결정한다. 발신자의 잔고에서 해당 금액을 제외하고, 발신자의 Nonce를 증가시킨다. 잔고가 충분치 않으면 에러를 반환한다.
  3. GAS를 STARTGAS와 일치키기고, 바이트당 특정 가스를 거래의 비용으로 지불한다.
  4. 발신자의 어카운트에서 수신자의 어카운트로 거래 비용을 송금한다. 만약 수신자의 계정이 없다면, 만든다. 만약 수신자의 어카운트가 컨트랙트라면, 컨트랙트 코드를 끝까지 또는 GAS 가 다 소모될때 까지 수행한다.
  5. 발신자가 잔고가 없거나, 코드 실행을 위한 가스가 부족하면 모든 상태를 원상복귀 시킨다. 여기에서 수수료 지불은 제외되고, 수수료는 채굴자 어카운트에 더해지게 된다.

메시지 실행시 가스가 부족하게 되면 ,실행과 그 실행에 의해 실행된 다른 실행들은 모두 되돌려 지만, 그 부모 실행은 돌려질 필요가 없다. 이는 컨트랙트가 다른 컨트랙트를 호출하는 것은 안전하다는 것을 의미한다.

코드 실행

이더리움 컨트랙트는 EVM code라고 불리우는 로우레벨 스택기반 바이트 코드 언어에서 실행된다. 보통 코드 실행은 0부터 현재 카운터를 증가시키면서 반복저긍로 연산을 수행하는 무한루프이고, 코드가 마지막에 도달하거나, 오류, STOP, RETURN 등을 만나면 멈춘다. 연산 수행을 위해서는 데이터를 저장하는 아래 세가지 타입의 공간에 접근 가능해야 한다.

  • 스택: LIFO 컨테이너
  • 메모리: 무한대로 확장가능한 바이트 배열
  • 컨트랙트의 영구 저장소: 키/값 저장소. 계산이 끝나면 스택과 메모리 처럼 리셋 되지 않고 영구적으로 저장된다.

블록체인과 채굴

Ethereum-blockchain

비트코인 블록체인과 유사하지만, 어느정도 차이점이 있다. 이더리움은 비트코인과 다르게 트랜잭션 리스트와 최근 상태 복사본을 가지고 있다는 것이다. 블록넘버와 난이도 또한 블록내에 저장되다. 블록 검증 알고리즘은 아래와 같다.

  1. 참조하고 있는 이전 블록이 존재하고 유효한지 확인한다.
  2. 현재 타임스탬프가 이전 것보다 크고, 현 시점 기준 15 후보다 작은 값인지 확인한다
  3. 블록넘버, 난이도, 트랜잭션 루트, 삼촌루트 (Uncle root?) 가스 제한 등이 유효한지 확인한다.
  4. 블록에 포함된 작업증명이 유효한지 확인한다
  5. S[0] 가 이전 블록의 상태 루트라고 가정하자.
  6. TX가 n개의 트랜잭션을 가진 블록이라고 하자. 0 부터 n-1에 대해, S[i+1] = APPLY(S[i], TX[i]) 로 설정하자. 애플리케이션이 오류를 뱉거나, 이 시점까지 블록에서 소모된 총 gas가 GASLIMIT를 초과하면 오류를 반환한다.
  7. 채굴자에게 지불된 보상블록을 S[n] 덧붙힌 뒤에 이것을 S_FINAL이라고 한다.
  8. S_FINAL의 머클 트리 루트가 블록헤더와 같고 있는 최종상태 루트와 같은지 확인한다. 같으면 유효, 다르면 유효하지 않은 것으로 판단한다.

애플리케이션

이더리움을 이용하면, 총 세가지 종류의 애플리케이션을 제작할 수 있다.

  • 돈과 직접 연관된 컨트랙트를 계약 참여자로 하여금 강력하게 설정하고 관리하게 끔 하는 금융 애플리케이션
  • 금전이 관여 되어 있지만, 상당부분 비 화폐적인 면이 존재하는 계약을 위한 애플리케이션
  • 온라인투표, 분권형 거버넌스와 같이 금용과 관련성이 아예 없는 애플리케이션

결론

이더리움 프로토콜은 범용적인 프로그래밍 언어를 통해, 블록체인상 에스크로나 인출한도 설정, 금전계약 등의 기능을 제공하는 가상화폐의 업그레이드 버전으로 구성되어 있다. 이더리움 프로토콜은 이런 기능을 직접 제공하는 것이 아니라, 튜링완전 언어를 통해 거의 모든 형태의 이체방식이나 애플리케이션을 만들어낼 수 있도록 지원한다. 이더리움은 단순 화폐 차원을 뛰어 넘는다. 분산저장공간이나, 분산컴퓨팅, 분산예측시장 프로토콜은 이더리움이 할 수있는 많은 응용개념 중 하나에 불과하다. 이러한 새로운 개념들은 이더리움이 컴퓨터 산업의 효율성을 폭발적으로 증강시킬 수 있는 가능성을 가지고 있으며, P2P프로토콜에 경제적인 레이어를 씌워 엄청난 혁신을 가져올 수 있을 것이다. 마지막으로, 컴퓨터나 금융이 관련없는 분야에서도 다양한 애플리케이션이 나올 것이다.

이더리움 프로토콜이 제공하는 임의상태변환이라는 개념은 잠재력을 지닌 플랫폼을 만들 수 있게 해준다. 기존의 하나의 목적에 특화된 폐쇄된 구조와 달리, 이더리움은 자유롭게 조정이 가능한 오픈된 구조다 이더리움이 몇년이내에 다양한 분야에서 많은 분야의 서비스를 설께할 수 있도록 튿화된 기반이 될 수 있을 것이다.