이더리움 백서: 스마트 컨트랙트와 탈중화된 어플리케이션 플랫폼

Hyeonji Yoo·2022년 9월 27일
0

1. 비트코인 복습

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

현재 모든 비트코인의 소유권 현황인 상태(State)와 현재 상태와 트랜잭션을 받아서 그 결과로 새로운 상태를 출력해주는 상태변환함수로 구성되어 있다. 상태변환함수는 여기서 이렇게 정의하겠다.
APPLY(S,TX) -> S'

이 말은 그림을 보면 좀 더 쉽게 이해할 수 있는데,

현재까지의 state(상태)가 x가 트랙잭션이라는 function을 만나 새로운 state라는 y가 된다는 말이다.

좀만 더 이해를 돕기 위해 예시를 들어보자면,
Alice가 Bob에게 11.7BTC를 보내고 싶다고 가정하자!

먼저 Alice의 지갑주소로부터 11.7 BTC 이상인 UTXO 집합을 찾는다. 즉, 지갑주소에는 현재 보유하고 있는 비트코인의 양만 뜨지만, 이러한 비트코인의 총합은 이전의 거래 금액들의 집합으로 이루어져 있기 때문에 6+4+2 = 12 BTC > 총 3가지의 UTXO를 참조하게 된다.
(UTXO가 무엇인지는 좀 더 아래에서 설명하도록 하겠다!)

참조된 3개의 UTXO가 트랜잭션의 input(즉, X)가 되고, 트랜잭션이라는 상태변환함수를 거쳐 output인 Y가 만들어지게 된다. 여기서 output은 1) Bob의 지갑주소의 비트코인 총합이 +11.7 BTC 되는 것과 2) 0.3 BTC의 잔돈을 가지게 되는 Alice 의 비트코인 총합이다.


채굴

이전의 비트코인 백서에도 나왔듯, 채굴이라는 말은 새로운 블록을 생성해낸다는 말인데 그럼 어떻게 새로운 블록을 생성할 수 있을까?

다시 한번 더 복습겸 정리를 하자면,

비트코인의 분산 합의 과정은 네트워크에 블록이라는 트랜잭션 패키지를 지속적으로 생성하고자 시도하는 노드들이 모든 사람들이 수긍할 수 있는 트랜잭션 순서 합의를 통해 블록이 유효한지 확인한 후 지속적으로 연결되는 체인을 만들게 된다.

여기서 하나의 블록이 유효한지 아닌지 확인하는 알고리즘에 대해서 간략히 정리해보겠다.

(비트코인 기준)

  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]를 이 블록의 마지막 상태로 등록한다.

즉, Alice가 Bob에게 $20를 송금하고 싶은데 Alice의 지갑주소에 비트코인 잔액이 만약 $10밖에 없다면, 이 거래는 실패로 돌아가게 된다. 이러한 에러가 하나라도 있으면 해당 블록은 false를 리턴하면서 종료가 되게 되는 것이다.

만약 위의 그림처럼 Alice의 잔고에 $50이 있어 트랜잭션이 성공으로 돌아가고, 다른 TX 속의 트랜잭션들도 성공한다면, 참으로 리턴하게 된다.

여기서 중요한 점은!

상태(State)원시상태(genesis state)부터 지금 현재의 블록까지의 모든 트랜잭션을 순차적으로 적용해왔기 때문에 블록내에 현재상태는 000입니다! 이렇게 안나와있다는 점이다


머클트리

또한, 비트코인의 간소화된 결제검증을 가능하게 해주는 블록의 저장 방식은 머클트리 계층구조로 블록이 저장된다는 것이다.

블록헤더에는 타임스탬프, 논스, 이전 블록의 해시, 그리고 블록에 포함된 모든 트랜잭션 정보에 의해 생성되는 루트 해시가 들어있는 200byte 정도의 데이터가 있다.

머클트리로 인해 어떤 블록의 데이터가 분리되서 저장되는데, 그렇기 때문에 전체 블록체인에 극히 일부의 데이터만을 가지고 작업증명을 검증할 수 있게 되는 것이다. 또한, 하위 노드들의 해시값이 상위 노드에 영향을 주기 때문에 공격자의 공격도 막아내는 강한 안전성을 보장한다는 점이다.


스크립팅

이전의 블록체인 백과를 꽤나 꼼꼼히 봤다고 생각했음에도 불구하고, 비트코인에 대한 내용이지만 이더리움 백서에 새로운 용어로 등장하는 게 많았던 것 같다.
그 중에 하나가 스크립팅이다.

백서에는 스크립트가 정확이 무엇인지에 대한 개념이 자세히 나와있지 않아서 직접 찾아보았다.

스크립트: 비트코인 생태계에서 쓰이는 언어로 비트코인의 모든 거래를 유효화시키는 것이 바로 스크립트!

  • 비트코인은 스크립트 언어를 통해 실행되므로 무한대에 가까운 표현이 가능한 조건들 만들어지는데, 이게 비트코인이 화폐로서 역할을 가능하게 하는 원동력이 된다.

스크립트에는 2종류가 있는데,


(출처: 뱅크샐러드)

1) 잠금 스크립트: 비트코인 소비 조건, 출력값을 소비하기 위해 충족되어야 하는 요건을 스크립트로 작성한 것

  • UTXO 소비위한 조건 및 공개키, 비트코인 주소 포함
  • 즉, 이 조건을 달성하게 되면 해당 지갑 주소에서 UTXO 를 소비할 수 있게 됨

2) 해제 스크립트: 그 조건만을 충족시키는 유일한 서명, 잠금 스크립트가 출력값에 걸어둔 조건을 해결해 출력값이 소비될 수 있도록 하는 스크립트

  • 얼마를 보낼지 ‘보낼 금액’란에 입력하는 명령어 안에 잠금 스크립트 조건을 충족할 해제 스크립트가 포함되어 있기 때문에 해당 비트코인 주소의 UTXO 에 대한 소유권 입증하고 그 UTXO 를 소비할 수 있게 됨

즉, 비트코인 잔액을 표현한 모든 UTXO 는 그것을 사용하기 위한 조건이 있는데 그것을 잠금 스크립트 ,그 조건을 풀 수 있는 입력값을 해제 스크립트라고 할 수 있다.

=> 해제 스크립트 데이터값이 복사되어 잠금스크립트와 함께 연산되어 실행되서 결과가 TRUE 가 나오면, 그 해제 스크립트 유효 = 즉, UTXO 사용할 수 있게 되는 것이다.

공개키와 개인키에 대한 개념인 것 같다.

이러한 스크립트 언어는 스택(Stack) 데이터 구조를 사용하는데, 2+3를 했을 때 5가 나오는지 확인하는 과정을 스택을 사용하게 되는 것이다.
즉, +3 = 5 가 잠금 스크립트, 2가 해제 스크립트

(출처: 뱅크샐러드)

해당 내용은 뱅크 샐러드의 '쉽게 설명하는 블록체인: 비트코인의 언어 '스크립트(Script)''의 블로그를 참조했다. 여기에 좀 더 쉽게 설명되어 있으니 참고해보면 좋을 것 같다.
https://www.banksalad.com/contents/%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%98%EB%8A%94-%EB%B8%94%EB%A1%9D%EC%B2%B4%EC%9D%B8-%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8%EC%9D%98-%EC%96%B8%EC%96%B4-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Script-eL4zP


2. 이더리움

드디어 이더리움이 비트코인과 어떤 점에서 다른지 살펴보자.

이더리움의 가장 큰 특징은 튜링 완전 언어를 내장하고 있으며, 이 언어를 사용하여 스마트 컨트랙트, 분산 어플리케이션을 작성할 수 있다는 것이다.

스마트 컨트랙트란,
어떤 특정 조건들을 만족했을 때만 그 값을 얻을 수 있게 하는 일종의 암호 상자라고 보면 된다.

이러한 스마트 컨트랙트는 어떻게 이루어지는지 확인해보자.


이더리움 어카운트(Account)

이더리움에서의 상태(state)란 어카운트라고 하는 오브젝트로 구성되어 있다.

여기서 2가지 어카운트가 있는데

1) 외부 소유 어카운트(Externally Owned Accounts): 개인키에 의해 통제

  • 1) 현재 잔고 O, 2)계약코드 X, 3)저장공간 X
    : 공개 이더리움 주소 + 개인키 조합 > 지갑주소
    : 메시지 보내기 위해 새로운 트랜젝션 생성, 서명해야 함
    : 아무런 코드 가지고 있지 않음

2) 컨트랙트 어카운트(Countract Accounts): 컨트랙트 코드에 의해 통제 > 스마트 컨트랙트에 접근하기 위한 주소

  • 1) 현재 잔고 O, 2) 계약 코드 O, 3) 저장공간 O
    : 개인키 존재하지 않고, 스마트 컨트랙트 블록체인에 배포할 때 생성됨
    : 다른 계정과 이더를 송수신하는 기능은 EOA와 동일
    : 코드를 담고 있음!! = 이 코드를 스마트 컨트랙트! > EOA나 다른 컨트랙트 호출 받아 트랜젝션

이 두 개의 가장 큰 차이점은 EOA는 개인키를 가지고 있기 때문에 트랜잭션을 생성할 수는 있지만, 계약코드와 저장공간이 없다는 점이고, CA는 개인키가 없어서 트랜잭션을 생성하지는 못하지만, 계약코드와 저장공간이 있어서 스마트컨트랙트를 생성할 수 있다는 점이다.


메시지와 트랜잭션

위에서 설명했던 것과 같이 트랜잭션은 EOA를 위한 것이라고 생각하면 되는데,

트랜잭션: EOA가 보낼 메시지를 가지고 있는 서명된 데이터 패키지

다음을 포함하고 있다.

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

메시지는 CA에 의해서만 생성될 수 있는데,

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

다음을 포함하고 있다.

  • (암묵적으로) 메시지 발신처
  • 메시지 수신처
  • 메시지와 함께 전달되는 이더
  • 선택적 데이터 필드
  • STARTGAS 값

현재 코드 수행을 하고 있는 컨트랙트가 메시지를 생성하고 실행하라는 CALL opcode 를 만나게 되면 메시지를 생성한다. 트랜잭션과 마찬가지로, 메시지는 해당 코드를 실행하는 수신자 어카운트에 도달하게 된다. 따라서, 컨트랙트는 외부 실행자가 하는 것과 정확히 같은 방식으로 다른 컨트랙트와 관계를 맺을 수 있다.


그림으로 보면 좀 더 직관적으로 이해가 될 것이다.

현재 Alice는 EOA를 가지고 있는데, 개인키를 가지고 있기 때문에 B에게 100 ETH를 보내라는 트랜잭션을 생성할 수 있다. 이 트랜잭션에는 해당 내용뿐만 아니라, Alice가 보낸게 맞다는 서명과 해당 트랜잭션의 데이터 필드 num = 300이 포함되어 있으며 시작gas와 gasprice가 명시되어 있다.

여기서 gas는 일종의 수수료로 이더리움에서 발생하는 트랜잭션, 메시지의 발생을 제한시키는 역할을 함과 동시에 그 수수료는 해당 트랜잭션을 돌리는 채굴자에게 보상이 된다. 아래에 좀 더 자세히 이야기해보겠다.

해당 트랜잭션은 Smart_con1이라는 스마트컨트랙트로 전송이 되고 이미 저장되어 있는 자신의 계약코드에 따라 조건 1을 실행시킨다.

조건 1에 따라 다른 컨트랙트에게 메시지를 보내게 된다.

메시지에는 서명을 제외하고 트랜잭션과 거의 유사하다. 여기서 중요한 점은! 메시지는 따로 저장될 필요가 없다는 것이다.

컨트랙트가 데이터에 접근할 때 계약코드와 일치하는 조건을 실행시키는데, 일치만 하면 메시지가 생성되어 다른 컨트랙트로 전송되기 때문에 저장될 필요가 없다.

이제 smart_con2 역시 계약 코드에 따라 실행된다.


수수료 및 보상으로서의 gas

트랜잭션이나 컨트랙트에게 할당된 gas가 있는데, 이 gas를 다 쓰면 추후에 트랜잭션이나 메시지를 발생시키려고 해도 할 수가 없게 된다.

도대체 왜 gas를 도입했느냐?

1) 공격자들의 악의적인 무한루프 계산을 방지하기 위함이다.
: 즉, 공격자들은 튜링 완전 언어로 인해 루프를 사용할 수 있기 때문에 일부러 루프를 이용해서 많은 양의 트랜잭션을 발생시켜 시스템을 마비시키려고 할 때, gas로 제한을 두면 그만큼의 gas가 없는 이상은 실행이 되지 않을 것이다.

또한, 2) gas는 채굴자들의 보상으로 사용된다.
: 채굴자들은 자신들의 전기를 사용하면서 해당 트랜잭션을 돌려주고 있기 때문에, 보상이 없으면 트랜잭션을 돌릴 이유가 없어지기 때문이다.


토큰

이더리움에 존재하는 또 다른 화폐가 있는데, 토큰이 그 중 하나이다.

이더와 존재하는 방식이 다른데 어떻게 다르냐?
*스마트 컨트랙트로 존재한다!!
= 즉, 스마트 컨트랙트 내부에서 상태변환함수가 실행되는 것

더 알기 쉽게 설명하자면,
이더(ETH)는 이더리움 네트워크의 기본 통화이고, 토큰은 스마트 컨트랙트 기능을 활용해 이더리움 생태계에서 사용할 수 있는 통화라고 볼 수 있다.

토큰 종류는 엄청 다양한데 EX. 이오스, 오미세고, 트론 등이 있다.
참조: https://blockchainnet.tistory.com/2


EVM(이더리움 버추얼 머신)

이더리움 네트워크가 어떻게 움직이는지 알기위해서 또 알아야 하는 개념은 이더리움 버추얼 머신이다.

EVM: 컴파일 된 스마트 컨트랙트 코드를 실행하고 블록체인에 기록을 담당하는 곳(윈도우 같은 운영체제와 유사한 역할)


출처: https://m.upbitcare.com/academy/education/coin/291

*컴파일이란, 개발자가 작성한 코드를 EVM 이 이해할 수 있도록 바꿔주는 작업(기존의 프로그래밍 언어 컴파일과 똑같은 의미)

EVM은 보통 코드 실행은 반복적으로 연산을 수행하도록 구성된 무한 루프(튜링 완전 언어 > 비트코인과의 차이점)이며, 코드의 마지막에 도달 혹은 stop, return, 오류 명령어를 만나면 실행을 멈추게 되는 원리이다.

이러한 연산을 수행하기 위해서는 데이터를 저장하는 3가지 타입의 공간에 접근할 수 있어야 한다.

EVM은 크게 1) 스택(Stack), 2) 메모리(memory), 3) 저장소(Storage)로 구성되어 있다.

1) 스택(Stack): 개발자가 작성하여 컴파일한 스마트 컨트랙트 코드가 실행됨
2) 메모리(memory): 개발자가 작성한 스마트 컨트랙트 코드를 실행하기 위한 임시공간인 메모리가 필요함
3) 저장소(Storage): 스마트 컨트랙트가 실행이 완료된 이후, 블록체인에 기록할 데이터 공간.

  • 스마트 컨트랙트에서 블록체인에 영구적으로 기록해야 하는 데이터들은 이 저장소에 기록됨

이더리움 상태변환함수

상태변환함수는 비트코인과 거의 유사하다. 다만, gas가 소모된다는 점이 다른 점이다.

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

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

수정된 GHOST Protocol

바로 요약부터 하자면,
비트코인의 경우는 가장 긴 체인을 따질 때 자식만 따지는데, 이더리움의 경우는 자식 + 삼촌(자라지 않는 가지, 아래 빨간색 동그라미 부분) 관계도 따져 긴 체인을 결정한다.

또한, 스테일 블록에 대해서도 일부 블럭보상을 제공한다.

이렇게 함으로써, stale 블록을 잘 처리하고 보안성도 높일 수 있기 때문이다.

비트 코인의 경우 이더리움에 비해 블록 생성속도가 느리기 때문에, stale 블록 생성확률이 낮고, 보안성이 높다. 반면, 이더리움은 블록생성 시간을 약 12초로 빠르게 만들었기 때문에 그만큼 stale 블록이 쉽게 생성될 확률이 높아지고 따라서 안정성이 떨어지게 된다.

따라서, 이러한 문제를 해결하고자 stale 블록에 대해 보상을 주고, 가장 긴 것이 아닌 가장 무거운 체인을 사용하도록 한 것이다.


(그림 출처: https://medium.com/tomak/%EC%9D%B4%EB%8D%94%EB%A6%AC%EC%9B%80%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94%EA%B0%80-1-ee7fa940541c)


결론

이더리움은 튜링완전언어를 기반으로 한 스마트 컨트랙트를 통해 다양한 분산 어플리케이션을 제작할 수 있게 함으로써 단순히 화폐로서의 비트코인의 역할을 확장시켰다고 할 수 있다.
이더리움은 비트코인의 작업 증명(PoW)과 다른 지분 증명(PoS) 이라는 새로운 방식의 합의 알고리즘을 사용하는데, 이러한 PoS의 방식이 정말 다양하게 존재하기 때문에 다음에는 이러한 PoS의 예시에 대해 설명해보고자 한다.

0개의 댓글