SKKRYPTO 2회차 - 이더리움 백서

명성호·2023년 3월 27일
0

백서

목록 보기
2/2

0. 용어

  • 상태 : 현재 모든 비트코인의 소유권 현황
  • 상태 변환 함수 : 현재 상태와 트랜잭션을 받아서 그 결과로써 새로운 상태를 출력해주는 함수.
  • 지분증명(POS) : 신규 코인을 발행할 때 이미 기존에 코인을 가지고 있던 사람들에게 전체 대비 각각의 소지량의 비율만큼을 지급하는 방식이다.
  • UTXO : Unspent Transaction Outputs의 약자로서, 미사용 트랜잭션 출력값을 말한다. 미지출 거래 출력이라고도 한다. 블록체인에 기록된 "소비되지 않은 출력값"을 통해 거래의 유효성을 검사하여 코인의 존재 여부를 확인한다.
  • 프로토콜 : 컴퓨터와 컴퓨터 사이, 또는 한 장치와 다른 장치 사이에서 데이터를 원활히 주고받기 위하여 약속한 여러 가지 규약
  • 스크립팅 : 응용 프로그램이나 셸의 기능을 보완하기 위한 처리 순서를 기술한 간단한 프로그램을 스크립트라 하는데, 이 프로그램을 기술하여 처리하는 것.
  • 스마트 계약(스마트 컨트랙트) : 프로그래밍된 조건이 모두 충족되면 자동으로 계약을 이행하는 ‘자동화 계약’ 시스템이다. 스마트 계약은 계약 조건을 컴퓨터 코드로 지정해두고 조건이 맞으면 계약을 이행하는 방식이다.
  • GHOST 프로토콜 : 블록체인은 블록들이 네트워크를 통해 전파되는데, 일정한 시간에 맞게 다음 블록을 생성하며 블록의 길이를 결정한다. 하지만 생성되는 블록들의 블록보다 더 긴 블록이 생성되는 경우 이중지불 문제가 발생하게 된다.
    이를 보완하기 위해 등장한 고스트 프로토콜은 이러한 블록들을 트리 형태로 생성하여 해당 블록의 부모블록, 조상블록 그리고 자손블록까지 블록의 가중치 값을 계산하여 블록의 길이를 정한다. 이렇게 트리 형태의 블록체인이 형성되면 단일 형태로 생성된 악의적인 블록의 선택을 방지할 수 있고 정보의 무결성을 보장할 수 있을 뿐만 아니라 네트워크의 보안 손실을 방지할 수 있다.
  • 스테일 비율 : 유효한 노드들 중 활동하지 않는 노드들의 비율
  • 스테일 블록 : 두 개의 블록이 동시에 승인되었을 때 메인체인으로 연결되지 못해 따로 떨어져 존재하는 블록을 말한다.
  • 엉클 블록 : 블록의 유효성은 통과되었지만 최종 블록으로 인정받지 못하여 고아블록으로 이루어진 체인의 첫 번째 블록이다.
  • 중앙집중화 : 블록생성주기가 짧은 블록체인일수록 큰 해시파워를 가지는 풀에서 마이닝을 해야 효율성이 커지는데, 전체 해시 파워의 상당 부분을 차지하는 독점적인 풀이 생기게 될 가능성이 높다.

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

A의 계좌에서는 $X가 감소하고 B의 계좌에서는 $X가 증가하는 거래가 일어났을 때, 상태변환함수에 의해 발생하고, 만약 처음에 A의 계좌에 있는 금액이 $X 이하인 경우에는 상태변환함수가 에러를 리턴한다.

상태변환함수 'APPLY(S,TX) -> S'
1. TX의 각 입력각에 대해

  • 만약 참조된 UTXO가 'S'에 없다면 에러를 리턴
    -> 존재하지 않는 코인이 트랜잭션에 사용되는 것을 방지
  • 만약 서명이 UTXO의 소유자와 매치되지 않으면, 에러를 리턴
    -> 다른 사람의 코인이 트랜잭션에 사용되는 것을 방지
  1. 만약 입력에 사용된 UTXO들 금액의 합이 출력 UTXO들 금액의 합보다 작으면, 에러를 리턴
  2. 입력에 사용된 UTXO가 삭제되고 출력 UTXO가 추가된 'S'를 리턴

2. 채굴

비트코인에서는 탈중앙화된 통화시스템을 구축하고자, 모든 사람이 수긍할 수 있는 트랜잭션 순서 합의 시스템을 상태변화시스템과 결합해야만한다. 그러므로 네트워크에 블록이라 불리는 트랜잭션 패키지를 지속적으로 생성하고자 시도하는 노드들이 필요하다. 각 블록은 타임스탬프, 논스(nonce), 이전 블록의 해시, 그리고 이전 블록 이후에 발생한 모든 트랜잭션 목록을 포함한다.

아래의 알고리즘을 통해 하나의 블록의 유효성을 확인한다.

  1. 이 블록에 의해 참조되는 이전 블록이 존재하는지, 유효한지 확인한다.
  2. 타임스탬프 값이 이전 블록의 타임스탬프 값보다 크면서 2 시간 이내인지 확인한다.
  3. 작업증명(proof of work)이 유효한지 확인한다.
  4. S[0]를 이전 블록의 마지막 상태(state)가 되도록 설정한다.
  5. TXn개의 트랜잭션을 가지는, 블록의 트랜잭션 목록으로 가정한다. 폐구간 0...n-1의 모든 i 에 대해,
    S[i+1] = APPLY(S[i], TX[i])집합 중 어느 하나라도 에러를 리턴하면 거짓(false)을 리턴하며 종료한다.
  6. 참(true)을 리턴하고, S[n]를 이 블록의 마지막 상태로 등록한다.

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

  • 네임코인 : '탈중앙화된 명칭 등록데이터베이스'
  • 컬러드 코인 : 누구나 비트코인 블록체인 위에서 자신만의 고유한 디지털 화폐를 발행할 수 있는 프로토콜 역할을 하는 것을 목적으로 함. 사용자는 특정 비트코인 UTXO에 공개적으로 색깔을 부여함으로써 새 화폐를 발행할 수 있음.
  • 메타코인 : 비트코인 거래를 메타코인 거래 저장에 이용하되, 상태 이동 함수 APPLY를 다르게 가짐으로써, 비트코인 시스템 위에서 운영되는 프로토콜을 갖도록 하는 것.

4. 스크립팅

비트코인에 구현된 스크립트 언어에는 한계가 있음.

  • 튜링불완전성 : 모든 경우의 프로그래밍을 다 지원하지는 않는다. 특히 거래 증명을 할 때 무한 순환에 빠지는 것을 방지하기 위해 while이나 for같은 loop명령 카테고리가 빠져있다.

  • 가치 무지 : UTXO 스크립트만으로는 인출 액수를 세밀하게 통제할 방법이 없다. UTXO는 인출액 전부가 송금되거나 말거나밖에 선택할 수 없기 때문에 세밀한 작은 다위로 나눠질 수 없다.

    ex) A와 B가 공동계좌에 $1000어치의 BTC를 입금했다고 가정했을 때, 시간에 따라 BTC의 가격에 변동이 생긴다. 두 사람은 30일 후 자동으로 A까 $1000어치 BTC를 받고 B는 나머지 잔액을 받는 계약을 맺고 싶지만 1BTC가 얼마인지 정해지지 않기 때문에 불가능하다.

  • 상태표현제한 : UTXO가 표현할 수 있는 상태는 사용되었거나 안 되거나 둘 뿐이다. 그러므로 이 두가지 상태 이외에 다른 다중 단계 계약이나 스크립트를 만들 수 없다.

5. 이더리움

이더리움의 목적은 분산 어플리케이션 제작을 위한 대체 프로토콜을 만드는 것이다. 튜링 완전 언어를 내장하고 있는 블록체인이라는 필수적이고 근본적인 기반을 제공함으로써 이 목적을 이루고자 한다. 그리고 이 언어를 사용하여 스마트 컨트랙트, 분산 어플리케이션을 작성하여 소유권에 대한 임의의 규칙, 트랜잭션 형식, 상태변환 함수 등을 생성할 수 있다.
-> 튜링-완전, 가치 인지능력, 블록체인 인지능력, 상태 개념등이 포함되므로 비트코인의 한계를 극복 가능

6. 이더리움 어카운트

이더리움에서 상태는 어카운트의 모음으로 구성되어 있다. 어카운트는 아래 4개의 필드를 가지고 있다.

  • 논스(nonce) : 각 트랜잭션이 오직 한번만 처리되게 하는 일종의 카운터
  • 어카운트의 현재 이더(ether) 잔고
  • 어카운트의 계약 코드
  • 어카운트의 저장 공간

이더는 이더리움을 작동시키는 연료이며 트랜잭션 수수료를 지불하는데 사용된다.
어카운트는 외부 소유 어카운트(EOA)와 컨트랙트 어카운트(CA)로 나뉜다.

  • 외부 소유 어카운트(EOA)
    -> 개인키에 의해 통제됨
    -> 코드를 가지고 있지 않음
    -> 메시지를 보내기 위해서 새로운 트랜잭션을 하나 생성하고, 서명을 해야함

  • 컨트랙트 어카운트
    -> 컨트랙트 코드에 의해 통제됨
    -> 메시지를 받을 때마다 자신의 코드를 활성화 시킴
    -> 메시지를 읽거나 내부 저장공간에 기록하거나 다른 메시지를 보내거나, 컨트랙트를 차례대로 생성함.

7. 트랜잭션

트랜잭션은 외부 소유 어카운트(EOA)가 보낼 메시지를 가지고 있는 서명된 데이터 패키지를 말한다. 즉 CA에게 보내고자하는 메시지를 담고 있는 서명된 데이터이다. 트랜잭션은 다음으로 구성되어 있다.

  • 메시지 수신처
  • 발신처를 확인할 수 있는 서명
  • 발신처가 수신처로 보내는 이더의 양
  • 선택적(optional) 데이터 필드
  • STARTGAS 값, 트랜잭션 실행이 수행되도록 허용된 최대 계산 단계수
  • GASPRICE 값, 매 계산단계마다 발신처가 지불하는 수수료

STARTGAS와 GASPRICE를 이용하여 gas를 통한 수수료로 코드내의 우연적이거나 악의적인 무한루프 또는 계산 낭비를 방지한다.

8. 메시지

트랜잭션과 유사하지만 컨트랙트에 의해서 생성된다는 점이 차이점이다.
메시지는 다음으로 구성되어 있다.

  • (암묵적으로) 메시지 발신처
  • 메시지 수신처
  • 메시지와 함께 전달되는 이더
  • 선택적 데이터 필드
  • STARTGAS 값
    수정은 불가능하므로 새로운 스마트 컨트랙트를 만드는 방식을 채택한다.

9. 이더리움 상태 변환 함수


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

  1. 트랜잭션이 형식에 제대로 맞는지(즉, 올바른 개수의 값을 가지고 있는지) 체크하고, 서명이 유효한지, 논스가 발신처 어카운트의 논스와 일치하는지를 체크한다. 그렇지 않다면 오류를 반환한다.
  2. STARTGAS * GASPRICE 로 트랜잭션 수수료를 계산하고, 서명으로부터 발신처주소를 결정한다. 발신처 어카운트 잔고에서 이 수수료를 빼고 발신자 논스를 증가시킨다. 발신처 잔고가 충분하지 않으면 오류를 반환한다.
    -> 가스비에 대한 수수료 계산
  3. GAS = STARTGAS 로 초기화 한후, 트랜잭션에서 사용된 바이트에 대한 값을 지불하기 위해 바이트당 gas 의 특정양을 차감한다.
    -> 실제 가스비용 처리
  4. 발신처 어카운트에서 수신처 어카운트로 트랜잭션 값을 보낸다. 수신처 어카운트가 존재하지 않으면 새로 생성한다. 수신처 어카운트가 컨트랙트이면, 컨트랙트의 코드를 끝까지 또는 gas 가 모두 소모될 때 까지 수행한다.
    -> 수신처로 트랜잭션의 값을 보내고 처리
  5. 발신처가 충분한 ‘돈'을 가지고 있지 못해서 값 전송이 실패하거나, 코드 수행시 gas 가 부족하면, 모든 상태 변경을 원상태로 돌려놓는다. 단, 수수료 지불은 제외되고, 이 수수료는 채굴자 어카운트에 더해지게 된다.
  6. 그 외에는, 모든 남아있는 모든 gas 에 대한 수수료를 발신처에게 돌려주고, 소모된 gas 에 지불된 수수료를 채굴자에게 보낸다.
    -> 총 사용된 가스비에서 남은 가스비를 발신처에 돌려주고 트랜잭션 처리에 소모된 가스비를 채굴처에게 전송

컨트랙트의 스토리지는 비어있다고 가정하고, 트랜잭션이 10 ether, 2000 gas, 0.001ether gasprice, 64 바이트의 데이터를 보낸다고 가정하자. 이 경우 상태 변환 함수의 프로세스는 다음과 같다.

  1. 트랜잭션이 유효하고 형식에 제대로 맞는지 확인한다.
  2. 트랜잭션 발송처가 최소 2000 * 0.001=2 ether 를 가지고 있는지 확인하고, 그럴 경우, 발송처의 어카운트에서 2 ether 를 뺀다.
  3. gas=2000 으로 초기화 한 후, 트랜잭션은 170 바이트 길이를 가지고, 바이트당 수수료는 5 라고 가정하면, 850 을 빼야 하고 결국 1150 gas 가 남게 된다.
  4. 송신처 어카운트에서 추가 10 ether 를 빼고 이것을 컨트랙트 어카운트에 더한다.
  5. 코드를 실행시킨다. 이 경우는 간단한데, 컨트랙트의 index 2 에 해당하는 스토리지가 사용되었는지 확인하고 (이 경우, 사용되지 않았다.) index 2 에 해당하는 스토리지 값을 ‘CHARLIE’로 설정한다. 이 작업에 187 gas가 소비됐다고 가정하면, 남아있는 gas 의 양은 1150 - 187 = 963 이 된다.
  6. 963*0.001 = 0.963 ether 를 송신처의 어카운트로 되돌려주고, 결과 상태를 반환한다.

메시지는 트랜잭션와 마찬가지로 상태를 원래 상태로 되돌린다. 메시지 실행시 gas가 부족하면 메시지 실행과 이후의 과정은 되돌려지지만 이전의 실행은 되돌려지지 않는다.

10. 어플리케이션 - 탈중화된 자율조직(DAO)

특정한 집합의 구성원 중 필요한 수만큼의 구성원의 동의하에 조직자금운용 권한 및 코드 변경 권한을 갖음 (주주총회와 비슷?) 구성원들은 운영자금의 분배를 어떻게 할 지를 결정한다. DAO의 자금 배분의 강제 집행을 위해 암호화 블록체인 기술을 사용한다.
링크텍스트
위 링크를 통해 코드 작성 없이 DAO를 만들어 볼 수 있다. (감사하게도 SKKRYPTO 정규 세션 중에 공유해주셨다.)

11. 수정된 GHOST 도입

GHOST의 문제의식은, 거래가 처리되는데 걸리는 시간이 빨라 블록체인들이 높은 스테일 비율로 인해 보안성 저하를 겪고 있는데, 이는 블록들이 네트워크를 통해 전파되는데 일정한 시간이 걸리기 때문이다. 그리고 중앙집중화 이슈도 겪고 있다. 이를 해결하기 위해 이더리움은 수정된 GHOST 프로토콜을 도입했다. 수정된 GHOST 프로토콜은 고스트 프로토콜의 7단계 레벨만 포함한 수정된 버전의 고스트 프로토콜이다. 수정 고스트 프로토콜은 스테일블록들 중 일부를 엉클블록으로 채택하고, 이 블록의 생성자에게도 보상을 지급하여 해당 블록들의 작업도 메인체인에 포함시킨다.
-> 즉, 가장 무거운 체인을 채택하는 것이다. (무겁다 : 서브트리가 가장 많다.)

profile
SKKRYPTO

0개의 댓글