IMG-LOGO
Home 암호화폐 강의 이더리움백서 11편

이더리움백서[11편]


Remind


지난 10편에서는 GHOST 프로토콜에 관한 개념정리 및 이더리움에서는 조금더 발전된 형태의 프로토콜을 제공하는 이유에 대해서 알아봤습니다. GHOST 프로토콜에서는 기존의 블록체인에는 다음과 같이 두 가지 문제점이 있다고 지적하였습니다.

  • (1) 네트워크의 자원적 낭비, 네트워크의 보안에 기여하지 못하는 문제점.
  • (2) 중앙 집중화 이슈
  • (1)번의 내용은 스테일 블록이 발생할 경우, 해당 블록은 버려지기 때문에 네트워크의 자원은 소모하였지만, 불필요한 연산 작업이 되어 네트워크의 자원적 낭비뿐만 아니라 네트워크의 보안에도 기여하지 못하는 문제점이 발생한다는 것입니다.

    (2)번의 내용도 이와 비슷한 맥락으로 스테일 블록에는 아무런 보상이 따르지 않기 때문에 더 높은 해시 파워를 가진 사용자만이 보상을 가져가게되고, 이는 네트워크에 특정 풀에 의해서 중앙 집중화가 이루어질 수 있는 계기가 될 수 있다는 내용입니다.


    GHOST는 위의 두가지 문제점을 해결하기 위하여, 가장 긴 체인을 계산하는 과정에서 스테일 블록 정보까지 포함함으로써 네트워크의 보안적 낭비를 해결하고 하였습니다.


    비트코인에서는 블록의 크기가 물리적으로 더 클 경우 네트워크에 전파되는 시간이 더 오래 소요됩니다. 또한, 검증을 처리하는데 있어서 더 오랜 시간이 필요하며, 이는 곧 스테일 블록을 생성할 확률이 높다는 의미입니다. 그렇기 때문에 스테일 블록이 될 가능성이 높은 크기가 큰 블록은 생성하지 않는 문제점이 있습니다.


    이더리움은 GHOST 프로토콜을 넘어서 스테일 블록에 대해서도 블록 보상을 제공함으로써 중앙화라는 문제점까지 해결하고자 하였습니다.


    이더리움에서도 비트코인과 마찬가지로 높은 가스(GAS)를 사용하는 블록은 전파되는데 더 오랜 시간이 소요되며, 트랜잭션 상태 변화들(state transition)을 검증 처리하는데 더 오랜 시간이 필요하다는 의미입니다. 하지만 이더리움에서는 GHOST 프로토콜 덕분에 지연 불이익(delay disincentive)은 큰 문제가 되지 않습니다.(스테일 블록에도 보상이 주어지기 때문입니다).

    그 밖의 이슈들(Miscellanea And Concerns)


    연산과 튜링완전성(Computation And Turing-Completeness)

    이더리움 가상 머신(EVM)은 무한 순환을 포함한 상상 가능한 모든 계산 수행을 코딩할 수 있습니다. 즉, EVM은 튜링-완전하다는 것입니다.

    EVM 코드의 순환 계산 방식을 다음과 같이 두 가지 방법으로 수행될 수 있습니다. 첫번째는 JUMP 명령어를 통해 코드의 이전 장소로 되돌아 갈 수 있으며, JUMPI 명령어로 조건에 따라 건너뛰게 할 수 있습니다. 두번째는 어떤 Contract에서 재귀 반복을 통해 순환을 일으킬 가능성이 있는 다른 Contract을 호출하는 것입니다.

    두번째 방식은 악의적인 사용자가 무한 순환에 빠뜨리는 방법으로 채굴자와 풀 노드를 마비시킬 우려가 있습니다. 일반적으로 어떤 주어진 문제가 궁극적으로 멈추는지 아닌지를 미리 판별할 방법은 없으며, 컴퓨터 학계에서 정지 문제(halting problem)라고 알려진 유명한 문제를 통해 이런 이슈를 피할 수 없음을 알 수 있습니다.

    하지만 상태변환 과정에서 설명했듯이, 한 거래에 최대로 계산할 수 있는 단계 수를 설정함으로써 이러한 문제를 해결할 수 있습니다. 만약 계산 단계가 설정한 최대 계산수 보다 더 많으면 계산은 원점으로 돌아가지만 수수료는 그래도 지불해야합니다(메시지들도 같은 방법으로 동작하게됩니다).


    * 무한 순환 루프를 어떻게 해결할 것인지에 대한 해답의 의미를 더 잘 이해하기 위해, 아래와 같은 몇가지 상황을 생각해보겠습니다.

    악의적인 공격자가 무한 순환을 실행하는 Contract를 만들어 채굴자로 하여금 무한 순환을 실행하도록 거래를 보냈다고 가정해보겠습니다. 채굴자는 거래를 진행하고, 무한 순환이 실행되었을 경우 가스가 다 소모될때까지 Contract를 실행하며, 가스가 다 소모되어 중간에 Contract 실행이 멈춘다고 하더라도, 거래는 여전히 유효하고 채굴자는 여전히 공격자에게 이미 실행된 각 계산 단계마다의 수수료를 요구할 수 있습니다.

    악의적인 공격자가 채굴자에게 오랜시간 동안 계산을 하도록 아주 긴 무한 순환 프로그램을 생성했으며, 채굴자는 오랜 시간동안 계산을 수행했기 때문에 계산이 끝난 시점에서 새로운 블록들이 이미 추가되어 수수료를 요구하지 못하는 상황을 만드는것이 악의적인 공격자의 목적이라고 가정해보겠습니다. 하지만, 그 공격자는 실제 실행되는 계산 단계의 상한선을 규정하는 STARTGAS 명령어에 대한 값을 제출해야만 하고, 채굴자는 해당계산이 과도하게 많은 단계가 필요하다는것을 계산전에 미리 알 수 있습니다. 즉 아주 긴 무한 순환 프로그램을 미리 알 수 있다는 의미입니다.

    예를 들어 send(A,contract.storage[A]); contract.storage[A] = 0와 같은 명령이 들어간 Contract가 있고, 악의적인 공격자가 해당 Contract을 본 후 첫번째 계산 단계를 실행하고, 두번째 단계는 실행할 수 없을 만큼의 가스만 넣고 Contract를 진행시켰다고 가정해보겠습니다 (즉, 예금만 인출하고, 다음 장부에는 기록되지 않도록 했을 경우). Contrat 작성자는 이런 공격에 대해 방어를 걱정할 필요가 없습니다. 그 이유는 Contract 실행이 도중에 멈추면, 해당 변화도 원상 복구되기 때문입니다.

    어떤 금융 계약이 위험을 최소화 하도록 9개의 금융 상품 자료 값의 평균을 취해 값을 얻고 있었고, 9개의 금융 상품 자료 값 중 하나의 자료 값을 악의적인 공격자가 가지고 있다고 생각해보겠습니다. 또한 악의적인 공격자는 가변주소 요청 메커니즘을 통해 해당 값을 변경할 수 있도록 디자인 하였으며, 금융 Contract로 부터 펀드를 찾으려는 모든 시도에 대해 가스가 다 소모되도록 공격한다고 가정해보겠습니다. 이럴 경우 금융 상품 자료 값을 최초에는 정상적으로 가져오다가, 가변주소 요청 메커니즘을 통해 해당 값을 가져오는 과정에서 가스가 다 소모될 위험이 있습니다. 하지만 금융 계약은 이 문제를 막기 위해 메시지 위에 가스 한도를 설정해 두는 것으로 공격을 방어할 수 있습니다.


    튜링 완전에 대한 대칭적인 개념은 튜링 불완전입니다, 튜링 불완전은 JUMP 명령어나 JUMPI 명령어가 존재하지 않으며, 그 어떤 주어진 시간에도 오직 각각의 Contract의 복사본 하나만이 허용됩니다. 하지만 튜링 불완전성은 그렇게 큰 제한도 아닙니다. 우리가 현재까지 상상했던 Contract 가운데, 순환 명령을 필요했던 Contract는 단 하나 뿐이었으며, 해당 Contract의 순환 명령조차도 프로그램 코딩에서 한 문장을 26번 반복함으로써 없앨 수 있었습니다.

    튜링 완전이 함의하고 있는 심각성과 그 제한적인 이점을 생각해볼 때, 왜 튜링 불완전 언어를 사용하면 안되는 걸까요? 현실적으로 튜링 불완전성은 순환 문제와 악성 공격에 대한 깔끔한 해답이 아닙니다, 왜 이런 이야기를 하는지 이해하기 위해 아래와 같은 Contract를 확인해보겠습니다.

    1
    2
    3
    4
    5
    6
    C0: call(C1); call(C1);
    C1: call(C2); call(C2);
    C2: call(C3); call(C3);
    ...
    C49: call(C50); call(C50);
    C50: (프로그램의 한 단계를 실행한 후 그 변화를 저장소에 기록한다.) 
    cs


    이제 A 에게 거래를 보냈을 경우, 51번의 거래에서 우리는 2의 50승의 계산 단계를 계속하는 Contract를 보내게됩니다. 채굴자들은 각 Contract에 따른 계산 단계의 최대 수와 다른 Contract를 재귀적으로 호출하는 Contract에 대한 계산 단계수를 모두 확보함으로써, 이런 논리 폭탄을 사전에 감지하기 위한 시도를 할 수 있습니다.

    하지만 이런 시도는 채굴자들이 다른 Contract를 호출하는 Contract를 다루지 못하게 만듭니다. 그 이유는 위의 모든 26개 Contract 작성과 실행은 한줄의 Contract로 쉽게 합쳐질 수 있기 때문입니다. 또한, 다른 문제점은 메시지의 주소 필드는 변수라는 점입니다. 그래서 일반적으로, 주어진 Contract가 사전에 미리 호출하는 다른 Contract가 무엇인지 판별하는 것조차 불가능할 수 있습니다.

    그래서 결국 우리는 놀라운 결론에 도달하게 됩니다. 튜링 완전은 놀랍도록 다루기 쉬우며, 만약 튜링 완전성이 없으면 다루기가 놀랍도록 어렵다는점입니다. 그렇기 때문에 프로토콜은 튜링 완전하게 놔두는것이 좋을 것입니다.

    통화 그리고 발행(Currency and Issuance)


    이더리움(Ethereum) 네트워크에선느 자체적으로 통용되는, 이더(Ether)라는 화폐를 가지고 있습니다. 이더는 여러가지 가상자산(토큰)들간의 효율적인 교환을 가능케하는 매개물의 역할을 수행하며, 트랜잭션 수수료(transaction fee)를 질불하기 위한 방법을 제공합니다. 사용자의 편의와 향후 있을지 모르는 논쟁을 예방하는 차원에서, 이더의 각 단위에 대한 명칭은 다음과 같이 미리 정하였습니다.(비트코인 명칭과 관련하여 벌어진 논쟁 참조)


    IMG

    위 명칭들은, 미화 명칭인 달러센트 또는, 비트코인의 BTC사토시등의 확장 개념으로 생각하면 이해하는데 큰 도움이 될것입니다. 가까운 미래에, 이더(ether)는 일반 거래(transaction)을 위해, 피니(finney)는 소액 결제를 위해, 그리고 싸보(szabo)웨이(wei)는 수수료나 프로토콜 도입 등과 관련된 기술적 논의를 위해 사용될 것으로 기대되며, 나머지 명칭들은 지금 당장은 클라이언트에 포함 시키지 않겠습니다.

    화폐 발행 모델


    BTC 당 1000-2000개의 가격으로 이더를 판매하며, Matercoin이나 NXT와 같은 다른 암호화화폐 플랫폼에서 성곡적으로 사용했던 방법으로, 이더리움 조직을 금전적으로 지원하고 개발에 필요한 비용으로 사용됩니다. 이 시기에 이더를 구매하는 구매자들은 큰 폭의 할인을 통해 저렴하게 이더를 얻을 수 있습니다. 이렇게 모인 자금은 전액, 개발자를 위한 월급과 보상, 그리고 이더리움과 관련된 영리, 비영리 프로젝트를 위한 투자금으로써 사용됩니다.

    판매 된 총이더의 0.099배 만큼의 신규 이더가 발행되며, 이더리움 런칭 전의 초기 기여자들과 이더로 이미 발행된 비용에 대한 미지급금을 처리하기 이해 이더리움 조직(Ethereum organization)에게 분배됩니다.

    또 다른 0.099배 만큼의 이더는 신규 발행하여, 장기 보유금으로 적립해둘것입니다.

    채굴시점 이후부터 영구히 매년, 총 판매수량(60,102,216 ETH)의 0.26배 만큼(15,625,576), 채굴자에게 신규 발행됩니다.


    IMG

    이더 장기 공급 성장률(%)


    IMG

    비트코인이 그러한 것처럼, 발행된 총 이더에 대한 신규 이더의 발행량은 그 비중이 0을 향하여 계속 줄어들게 될것입니다. 이러한 모델에서 결정되어야 할 두 가지 선택이 있습니다.

    (1) 재단보유금(endowment pool)의 존재유무와 그 규모

    재단보유금(endowment pool)의 정당성에 대해서는 다음과 같이 설명할 수 있습니다. 재단 보유금이 없는 상황속에서 같은 인플레이션율을 유지하기 위해서는 연간 발행량이 26%가 아닌, 21.7%로 줄어들어야 하며, 이렇게 될 경우 이더의 총량은 16.5%가 줄어들게 되며, 이더의 가치는 19.8% 증가하게 됩니다.

    이 경우 균형을 위해서는 19.8%의 이더가 프리세일에서 판매되어야 하며, 이렇게 될 경우 이더 가치는 서로 정확히 동일해집니다. 그렇게 될 경우 이더리움 재단이 1.198배의 BTC를 가지게되는데, 이를 처음 BTC 액수(1배수)와 추가된 0.198배수의 BTC로 나누어보면 결국 상황이 동일해진다는 점을 알 수 있습니다.


    * 여기서 한 가지 차이점은 이 경우 이더리움 조직이 가진것은 이더가 아닌 BTC이므로, 이더의 가치를 높이기 위한 인센티브를 얻지 못한다는 점이 있습니다.

    (2) 총 발행코인량이 정해져 있는 비트코인과는 달리, 신규코인을 끊임없이 발행해야 하는지의 여부

    정해진 양의 이더를 영구적으로 신규발행하는 모델(permanent linear supply growth model)은 비트코인이 겪고 있는 부의 집중현상을 완화 시킬 수 있으며, 현재 또는 미래의 참여자들이 계속해서 이더를 시장이 아닌 채굴을 통해 얻을 수 있는 기회를 제공할 수 있는 동시에, 공급성장률(Supply Growth Rate)은 계속해서 0을 향해 줄어들게 될것입니다.

    우리측의 이론으로는 다음과 같은 현상을 예상해 볼 수 있습니다. 시간이 흐름에 따라 사용자들의 부주의, 죽음 등으로 인해 현실적으로 일부의 이더들이 계속해서 시장에서 사라지게 되며, 이렇게 사라진 이더로 인해 점점 줄어드는 시장 유통가능 이더 총량(the total currency supply in circulation)은 매년 신규 발행되는 이더에 의해 균형을 이루게 될것입니다. (예 : 만약 총 이더량의 26배수(1,562,657,616 ETH)에 달했고, 매년 이 중 1%(0.26배수)에 해당하는 이더가 소실된다면, 이는 매년 새로이 발행되는 0.26배수의 이더와 균형을 이루게됩니다)

    미래의 공급성장률은 약 0에서 0.05배수 이내가 되도록 수정을 하면서, 채굴 모델을 POS 방식으로 변경할 계획을 가지고 있습니다. 만일 이더리움 재단이 보유금을 모두 잃거나, 또는 여타의 이유로 사라지게 되면, "사회적계약(social contract)"을 열어둘 것입니다.

    이를 통해, 이더 발행량을 최대 60102216 * (1.198 + 0.26 * n)(n은 첫 블록 생성 이후의 총 년수)를 넘지 않도록만 지킨다면, 누구든지 이더리움의 후속버전(a future candidate version:RC버전)’을 만들 수 있을것입니다.

    이 후속버전의 창시자는 개발/관리에 필요한 비용을 추당하기 위해서, 공개판매(crowd-sell)를 하거나, 총 가능 이더발행량과 POS를 통한 공급량간의 차액중 일부나 전부를 이용할 수 있을 것입니다.

    만일 어떤 창시자가 이러한 "사회적계약(social contrat)"에 반하는 내용을 업데이트하게 된다면, 결국 대의에 의해 합당한(compliant) 버전에서 별개로 포크되어(forked)질 것입니다.

    Think


    이번 이더리움 백서 11편에서는 튜링 완전성 그리고 이더리움 화폐 발행량에 대한 내용을 다뤘습니다. 다음 이더리움 백서 12편에서는 채굴 중앙집중화, 확장성, 결론 파트를 다룸으로써 이더리움 백서에 대한 포스팅이 마무리 될 예정입니다. 오늘 학습한 내용을 심플하게 요약정리해보면 아래와 같습니다.

    튜링 완전성

    이더리움에서의 EVM은 튜링 완전성을 가지고 있으며, 튜링 완전성을 갖을 수 있었던 내용을 축약해보면 아래와 같습니다.

    (1) 무한 순환 루프 공격은 공격자에게 이미 실행된 각 계산 단계마다의 수수료를 요구함으로써 해결할 수 있다.

    (2) 아주 긴 무한 순환 프로그램으로 수수료를 요구하지 못하게할것을 대비하여, 실제 실행되는 계산 단계의 상한선을 규정하는 STARTGAS 명령어에 대한 값을 제출하도록 되어있다.

    (3) 어떤 Contract에서 특정 기능만 수행하고, 특정 기능은 수행하지 못하도록하여 부당 이득을 취하는 경우를 대비하여 Contract 실행이 도중에 멈추면, 해당 변화도 원상 복구될 수 있도록하였다.

    (4) 메시지 위에 GAS 한도를 설정함으로써 참조하고 있는 다른 Contract에서 GAS를 무한대로 사용하지 못하도록 방어할 수 있다.


    * 결국 튜링 불완전성을 갖는 프로그램에서도 튜링 완전성을 갖는 프로그램과 동일한 Contract를 생성할 수 있지만, 만약 튜링 완전성이 없을 경우 다루기가 매우 어려우며, 이러한 어려운 문제점으로 인해 Contract의 활용도가 제한적일 수 밖에 없습니다. 또한, 튜링 완전성은 생각보다 놀랍도록 다루기 쉬우며, 튜링 불완전성은 매우 다루기가 어렵습니다.


    통화 그리고 발행

    비트코인에서 비트코인 하위 단위에 대한 명칭과 관련하여 벌어진 논쟁이 있었기 때문에 이더리움에서는 화폐이 단위를 백서에서 먼저 정의하였습니다. 이더리움 재단 보유금은 이더를 보유함으로써, 인센티브를 얻기 위해 이더의 가치를 더 높일것이라는 점을 강조했으며, 시간의 흐름에 따라 사용자의 부주의, 혹은 죽음 등으로 인해 이더들이 시장에서 사라지는것을 고려하여 신규 발행되는 이더에 의해 균형을 이루도록 하였습니다.


    [참고문헌]


    * 이더리움 백서(한글)
    * 이더리움 백서(영문)



    작성자 : yahweh87