이번 포스팅에서는 이더리움의 백서 도입부인 역사파트의 내용을 재해석 하는 시간을 가지도록 하겠습니다. 원문 내용을 축약하여 쉽게 풀어서 설명하고, 이해를 돕기 위해 보충해야되는 부분을 채워가는 형식으로 진행하도록하겠습니다. 만약 이더리움 백서의 원본을 읽고 싶으신분들은 아래의 링크를 통해 원문을 읽어보시길 추천드립니다.
* 이더리움의 백서의 시작은 비트코인에 대한 이야기로 시작됩니다.
사토시 나카모토가 2008년~2009년에 개발한 비트코인은 중앙화된 발행기관이나 통제기관 없이 상용화된 디지털 자산의 첫번째 사례였기 때문에 화폐와 통화분야에 매우 근본적인 혁신으로 묘사되어왔다. 하지만 더 중요한 요소는 분산합의 수단으로서의 블록체인 기술이며, 이에 대한 관심이 급격하게 늘어나고있다.
이더리움은 완벽한 튜링완전(turing-complete) 프로그래밍 언어가 심어진 블록체인이며, 이 프로그래밍 언어는 코딩된 규칙에 따라 '어떤 상태'를 다르게 변환시키는 기능이 포함된 계약(contracts)을 유저들이 작성할 수 있게 함으로써 우리가 아직 상상하지 못한 다른 많은 어플리케이션도 매우 쉽게 만들 수 있도록 도와주는것이다.
History
분산화된 디지털 통화의 개념은 이미 오래전부터 우리 주변에 있었습니다. 1980~1990년대에 암호 알고리즘(cyptographic primitve)을 기반한 e-cash 프로토콜은 개인정보를 강력하게 보호하는 화폐를 제공하였으나 중앙집권적인 중개인 방식에 의존했기 때문에 주목받지 못했습니다.
1998년 'Wei Dai'의 b-money는 작업 증명 방식의 방식으로, 분산 합의와 계산 퍼즐을 풀게하는 방식을 통해서 화폐를 발행하게 하는 아이디어를 최초로 제안하였지만 분산 합의를 실제로 어떻게 구현할지에 대한 자세한 방법을 제시하지 못했습니다.
2005년 'Hall Finney'는 b-money의 아이디어에 Adam Back의 계산 난이도 해시캐시 퍼즐을 조합하여 재사용 가능한 작업증명 개념을 소개하였습니다만, 이 방법도 외부의 신뢰를 필요로 하는 컴퓨팅(trsuted computing)을 기반에 둠으로써 또 다시 구현하는데에 실패하였습니다.
2009년 나가모토 사토시에 의해 비트코인이 개발되었으며, 비트코인은 공개키 암호방식을 통한 소유권 관리를 위해 사용되었던 기존의 알고리즘과 '작업 증명(proof of wokr)' 합의 알고리즘을 결합함으로써 실제적으로 탈 중앙화된 화폐를 처음 구현하게되었습니다.
작업 증명 방식은 네트워크 상에 있는 모든 노드들이 비트코인 장부 상태에 일어난 업데이트를 공동으로 관리할 수 있게 하였으며, 누구나 합의 프로세스에 참여할 수 있도록 허용함으로써 합의 결정권에 대한 정치적 문제를 해결할 수 있었습니다. 또한 시빌 공격(sybile attacks)을 방어할 수 있는 메커니즘을 제공하였으며 각 노드의 결정권의 크기를 그 노드의 계산 능력에 직접적으로 비례시키는 방식으로 어떤 형식적 장벽대신, 경제적 장벽으로 대처함으로써 매우 혁식적인 알고리즘을 제안하였습니다.
작업 증명 방식 이후, 지분 증명(proof of stake)라는 새로운 방식의 합의 알고리즘이 등장하였고, 이는 각 노드가 가진 계산 능력이 아니라 화폐의 보유량에 따라 각 노드의 결정권 정도를 계산한다는 개념입니다.
이 두 방식의 상대적인 장점들에 대한 논의는 이 백서에서는 다루지 않겠지만, 두 방법 모두 암호화화폐의 기반으로서 사용될 수 있다는 점은 지적해두고자 한다.
비트코인의 장부는 하나의 상태변환 시스템(state transation system)으로 생각해볼 수 있습니다. 이 시스템은 현재 모든 비트코인의 소유권 현황을 관리하기 위한 "상태(state)"와 트랜잭션(거래 기록)을 처리하고 새로운 "상태(state)"정보를 만들어주기 위한 "상태변환함수(state transition function)"로 구성되어있습니다.
예를 들어 표준 은행 시스템이 비유하자면 상태는 모든 계좌 잔고표(balance sheet)와 같고, 트랜잭션은 거래 내역으로 A에서 B로 X(금액)를 송금하라는 요청입니다. 상태 변환 함수에 의해 A의 계좌의 잔고는 송금한 X만큼 감소하고, B의 계좌의 잔고는 송금 받은 X만큼 증가하게되는것입니다. 만약 A의 계좌에 있는 잔고가 송금하고자 했던 금액 보다 작을 경우 상태 변환 함수는 에러를 리턴하게됩니다.
* 백서에 있는 그림을 조금더 보기 쉽게 변경한 그림은 1번과 같으며, 백서 본문에 기록된 원본 이미지는 2번과 같습니다.
(1) 백서 원본 이미지.
(2) 변경 이미지.
이러한 상태변환을 비트코인 장부에서는 아래와 같이 정의할 수 있습니다.
APPLY(S,TX) -> S' or ERROR
만약 은행 시스템에서 사용한다면 아래와 같습니다.
1 2 3 | APPLY({ Alice: $50, Bob: $50 },"send $20 from Alice to Bob") = { Alice: $30, Bob: $70 } APPLY({ Alice: $50, Bob: $50 },"send $70 from Alice to Bob") = ERROR | cs |
UTXO집합에는 각자의 코인 금액이 표시되어 있고, 이 UTXO의 소유자(20byte의 주소로 정의되는 암호화된 공개키)의 정보가 들어있습니다. 트랜잭션에는 하나 이상의 입력(inputs) 및 출력(outputs)이 포함되며, 입력에는 보내는 사람의 UTXO에 대한 참조 정보와, 개인 키로 암호화된 서명을 포함하고있습니다. 또한, 출력에는 새롭게 추가될 UTXO 정보가 포함됩니다.
위에서 언급된 상태 변환 함수APPLY(S,TX) -> S를 풀어서 설명하면 아래와 같습니다.
UTXO
정보가 없다면, 에러를 리턴UTXO
의 소유자와 같지 않으면, 에러를 리턴(다른 사용자의 예치금)UTXO
들의 총합이, 출력 UTXO
의 합보다 작으면, 에러를 리턴.(잔고 부족)UTXO
정보를 더이상 사용하지 못하도록 삭제하고, 출력 UTXO 정보를 추가하여 새로운 "상태(state)"인 S'를 리턴.1번의 첫번째 과정은 존재하지 않은 비트 코인이 트랜잭션에 사용되는 것을 막기 위한것이며, 1번의 두번째 과정은 다른 사람의 코인이 트랜잭션에 사용되는 것을 막기 위한 방법입니다.
만약 Alice가 Bob에게 11.7 BTC를 보내고 싶을 경우 먼저 Alice 지갑주소에 표시된 금액의 합이 최소 11.7 BTC 이상인 UTXO의 집합 정보가 필요합니다. 거의 대부분의 경우 11.7 BTC를 가지고 있는 UTXO 정보를 바로 선택하는 경우는 드물며, 6.0 BTC, 4.0 BTC, 2.0 BTC 처럼 금액이 분산된 여러가지 UTXO 정보를 참조하게됩니다.
보내고자 하는 금액은 11.7 BTC이지만, 실제 참조하게되는 UTXO 총합은 12.0 BTC이기 때문에 다음과 같이 12(6+4+2) - 11.7 = 0.3 BTC
잔돈이 발생하게됩니다.
트랜잭션에는 위의 3가지 UTXO 정보가 input으로 설정되며, output에는 송금하고자 하는 금액 11.7 BTC의 새로운 UTXO 정보와, 소유자 Bob이 잔돈을 받게되는 UTXO 정보 2가지 정보로 구성됩니다.
모든 백서의 도입부는 기존의 시스템이 무엇인지에 대한 설명과, 부족한 부분이 무엇인지를 지적하고 새로운 방식을 어떻게 구현할것인지에 대한 내용으로 채워지게됩니다.
오늘 포스팅한 백서에서는 비트코인이 이세상에 없던 기술들을 총집합하여 탄생한것이 아니라 아주 오래전부터 그와 관련된 이론들과 논의들이 있었다는 내용과, 비트코인이 어떤 의미에서 혁신적이었는지에 대한 내용으로 시작하였으며, 작업 증명 방식, 지분 증명 방식의 두가지 합의 알고리즘을 언급함으로써 이더리움에 시작은 작업 증명 방식으로 이루어지나 추후 지분 증명 방식으로 변화할것을 예고한 느낌입니다.
또한, 기존의 비트코인 시스템에서 사용되는 '상태(State)'와 '상태 변환 함수(state transition function)'에 대한 개념에 대하여 먼저 설명한 후 이더리움에서는 이 부분을 어떻게 수정할지에 대한 내용을 다루게됩니다.
https://github.com/ethereum/wiki/wiki/%5BKorean%5D-White-Paper